晴れ時々、FX

My dairy fx life

(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の説明を見て、ちゃんとライブラリを入れることが大事

ようやく、動作確認まで出来たので、一安心した。