晴れ時々、FX

My dairy fx life

(3)WEBHOOKからメタトレードへのメッセージ送信

ようやくプログラミングが進みました。

いろいろ、つまずいた点がありましたので報告します。

python


#!/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()関数となる。

とりあえず、手当たり次第にググったソースを真似して作ったわけだが・・・

このあたり、自分自身もプログラマとしての知識不足を実感する。

参考ソース