こんにちは。キリンです。
最近、年に数度のMQLを書くときがきたのですが、Pythonに慣れまくっていると苦行でしかないですねw昔は毎日のようにMQLばかり書いていた時期があるのが懐かしいです。あのころにPythonの有用性を知っていたら、もっと成長できていなんじゃないかなぁと思ったり。技術ブログばっかり書いていて、珍しく前書きみたいなものを書いているんですが、これにはきっかけがありまして、MT4の検索をしていると昔の自分の記事がたまにヒットして、あの頃はちゃんと頻繁にブログを書いていたなぁと思ったからでして。あの頃は毎日何か書けるネタがないかと探している日々だったのですが、今となっては逆にかけるネタはたくさん思い当たるのにほとんど書かなくなってしまったので、アウトプットをもう少し増やしてもいいかなぁと思っています。ただ、子育てと仕事の上に最近は咳喘息で日々体調が悪いので、かなり難しいのですが。
注意書き
この記事はMT4のBuild419を対象としたものです。2019年にもなってこんな化石みたいに古いMT4を使っているのは私ぐらいしかいないんじゃないかと思う次第ですが、ご了承ください。こういう誰得なんだよって記事のほうが書くことのハードルが下がるんです。最近のMT4のほうが言語の充実などもあり、優秀みたいですね。
ZMQ をMT4で動かす
注書きにあるように、バージョンが古いから情報の検索が難しいんですが、github頼みでなんとかレポジトリがいくつか見つかりました。
[2019/04/09 追記]
これが現行バージョンでは一番良さそう。
多分現行のバージョンで一番良いのがこれですね。最新版のMT4用にクラスとか使ってしっかり書いてありました。ただ、build419では動かない、もしくは動かすが大変。DLLの呼び出しに構造体とか使ってる時点でアウトです。
これは下に書くmql4zmqを最新バージョンで動かすためにフォークしたプロジェクトっぽい。このプロジェクト曰く、安定版であるZeroMQ 2.2 は現行バージョンでも後方互換されているとのこと。
コミット履歴に2012年のものがある!これだ!とこれをベースに使っていくことにしました。ただ、ZMQのバージョンが2.1.4と少し心もとない。どうやら、OTMql4Zmqで使われているDLLとほとんど一緒みたいだったので、OTMql4Zmqからバージョン2.2のDLLを持ってきて、mql4zmqに上書きしました。
exampleを参考に実装していく。
mql4zmqのexampleを参考に実装していくことになるのですが、そこのexampleがrubyのzmqを使って通信するサンプルしかおいていなく、今のLinuxに入っているrubyだとgem i zmq
してもコンパイルエラーで止まってしまい、そのままでテストができないというつらい状況でした。rubyのzmqのバージョン2.1.4だし。そんなコンパイル環境を現環境に入れたくない。ということで、MQLを書き直してMQL上だけでテストを試みることになるのですが、ここでもまたハマる現象が現れます。
Wine 環境でZMQを使うときにはまること
- Wine側のMQLから一度使ったポートはなかなか開放されない
- どうしても使えない場合は
wineserver -k
をしてwinewerver を殺してください。
- どうしても使えない場合は
- Wine側でPUSHPULL用にバインドしたポートを、ポート開放してからPUBSUB用に使おうとしても動かない
socket を close して terminate してもポートが再バインドできないんですよね。MT4再稼働でもだめで、wineserverの再起動でなんとか直りました。
pyzmqではまったこと。
- pyzmq 17.0.0 は zmq 2.2 とPUBSUB する際、zmq側からSubscribeできない。
- pyzmq 17.1.2を使うと直った。
こいつに一番手こずらされました。PUSHPULLはできるくせにPUBSUBができない。ネットワーク関連のデバッグつらいです。
コードとか。
ここにおいておきます。
mql4zmq.mq4 が基本的なPUBSUB用です。
コメント