(1)MT4とpythonの通信チェック
今日から、いきなりサンプルソースを見ながら、プログラミングを開始している。
まずは、PYTHONとMT4の通信仕様の確認から。
正直、この手のジャンルは、まったくの無知状態。
まずはTCPとは何?
というところから、つまずいている。
とりあえず、パソコンの通信状態というのは、
何らかソフトで見れるらしい。
調べて入れたソフトがこれ。
https://forest.watch.impress.co.jp/library/software/tcpmonitor_p/
立ち上げておくと、通信ポートの状態が確認できる(らしい)
ひとまず、今日のところは、PYTHON側から下記のソースで
メッセージ送信できることは確認した
from zmq import Context, REQ
def Main():
context = Context()
print("Connecting to hello world server...")
socket = context.socket(REQ)
socket.connect("tcp://localhost:5555")
for i in range(10):
socket.send(b"sell usd")
message = socket.recv()
print("Received reply %s [ %s ]" % (i, message))
if __name__ == '__main__':
Main()
これまでのpythonの知識から、
軽くコードの説明をする。
最初のfromというのは、いわゆるライブラリのインストールである。
当然ながら、ライブラリを入れることが必要で、それはPIPというコマンドを
DOSで実行する。
cmd ⇒ pip install zmq
これでサクッとダウンロードされる
次に、pythonのプログラムの書き方であるが、
今回はメインだけのプログラムなので、
最初に、mainの中身を書いておき、
一番下の行で、mainを起動する。
ちょっと見ると、何がどうかは分からないと思うが
この構成は、丸暗記すればいい
とりあえず、このソースを走らせると、
TCPのポート、5555が解放される。
ちなみに、ローカルホストというのは、
自分のPC自体の名前を指す。
socket.send(文字列) で、ポートにメッセージを送る
socket.recv()で、メッセージを受け取る
文字列に b がついているのは、
pytonのバイナリ表現を示す、表記方法である。
次にMT側
MT側の導入は、少々てこずった。
やはり、こちらもライブラリを的確な場所に置くことが重要である。
//+------------------------------------------------------------------+
//| HelloWorldServer.mq5 |
//| Copyright 2016, Li Ding |
//| dingmaotu@hotmail.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Li Ding"
#property link "dingmaotu@hotmail.com"
#property version "1.00"
#include Zmq/Zmq.mqh '<>必要
//+------------------------------------------------------------------+
//| Hello World server in MQL |
//| Binds REP socket to tcp://*:5555 |
//| Expects "Hello" from client, replies with "World" |
//+------------------------------------------------------------------+
void OnStart()
{
Context context("helloworld");
Socket socket(context,ZMQ_REP);
socket.bind("tcp://*:5555");
while(true)
{
ZmqMsg request;
// Wait for next request from client
// MetaTrader note: this will block the script thread
// and if you try to terminate this script, MetaTrader
// will hang (and crash if you force closing it)
Print(socket.recv(request));
Sleep(1000);
ZmqMsg reply("World");
// Send reply back to client
socket.send(reply);
}
}
//+------------------------------------------------------------------+
動かしてみて気づいたのであるが、
送られてきたメッセージは、
TRUEという中身になっていた。
どうやらsocket.recvの内容が、
フラグになっていて、これはたぶん通信の
仕様をZMQ_REPにしているところが怪しい。
とりあえず、ソケットの種類が結構あるらしくて、
今回の選んだものは、単なるtrue/falseのフラグだけのような気がする。
これからは、ZMQのマニュアルを見て勉強することにする。
とりあえず、メタトレード側については、
かなりGITHUBの説明を見て、ちゃんとライブラリを入れることが大事
ようやく、動作確認まで出来たので、一安心した。