(3)WEBHOOKからメタトレードへのメッセージ送信
ようやくプログラミングが進みました。
いろいろ、つまずいた点がありましたので報告します。
#!/usr/bin/python
# -*- coding: utf-8 -*-
import json
from zmq import Context, REQ
from flask import Flask, request
import pdb
def mains(msg):
context = Context()
print("Connecting to hello world server...")
socket = context.socket(REQ)
socket.connect("tcp://localhost:5555")
# pdb.set_trace()
for i in range(10):
socket.send(msg)
message = socket.recv()
print("Received reply %s [ %s ]" % (i, message))
def jsonConversion(jsonStr):
data = json.loads(jsonStr)
return data
app = Flask(__name__)
@app.route("/", methods=['POST'])
def webhook():
msg = request.get_data()
res = jsonConversion(msg)
res2 = res['webhook_event']['body'].encode()
mains(res2)
return msg
if __name__ == "__main__":
app.run()
metatrade側
#include <Zmq/Zmq.mqh>
void OnStart()
{
string port = "5555";
uchar data[];
Context context("helloworld");
Socket socket(context,ZMQ_REP);
socket.bind(StringFormat("tcp://*:%s" ,port));
while(true)
{
ZmqMsg request;
socket.recv(request);
ArrayResize(data,request.size());
request.getData(data);
string msg = CharArrayToString(data);
Sleep(1000);
csv_out(msg);
// Send reply back to client
socket.send("msg");
}
}
//+------------------------------------------------------------------+
void csv_out(string &msg)
{
Print(msg);
}
python側は、WEBHOOKを受けるサーバー機能と、
MQL4にzeroMQでメッセージを送るクライアント機能
中継サーバーのような恰好になっている。
サーバーは、FLASKというWEBフレームワークを使っている。
FLASKは、ちょうどWEBページのフォルダ構造を
プログラムで書くような格好になっている。
関数定義されている名前には、まったく意味がないことに驚いた。
(スクリプト言語なので、@app.routeの次の行が実行されるのが
約束事のようになっている)
WEBHOOKのメッセージを受け取るには、
requestライブラリにある、get_dataメソッドを使う必要がある。
これはmetatrade側も同様であるが、
ソケットを繋いでも、戻ってくるのは、リクエストオブジェクト自体であり、
メッセージを引き出すには、getDATAメソッドを使う必要がある。
次に、送られるメッセージは文字列では無くて、バイナリデータというものである。
この辺りは、文字列-バイナリ変換しなければならないのである。
PYTHON側で言えば、encode()、decode()のメソッド
Metatrade側で言えば、CharArrayToString()関数となる。
とりあえず、手当たり次第にググったソースを真似して作ったわけだが・・・
このあたり、自分自身もプログラマとしての知識不足を実感する。
参考ソース