[MQL4]MT4でマルチタスク/マルチスレッド処理
目次/もくじ
MT4/MT5は基本的にC言語ベースなのでマルチスレッドはできません。
しかし、複数のチャート上でEAを別々に稼働させられるので、
とらえ方によってはマルチタスクが可能です。
マルチタスクの背景
超高速で両建てしたい場合
背景としては、
一瞬で両建てをしたい場合などです。
普通に記述すると、
買いオーダーを送信
↓
FX業者側で買いオーダーの処理
↓
約定
↓
FX業者からレスポンスが返ってくる
↓
売りオーダーを送信
という形になり、オーダーの処理に数秒かかることもあるので、
売りと買いのタイミングが数秒ずれてしまうことがあります。
これは特に暴騰暴落時に発生しがちで、
一番両建てをしたいタイミングでそれぞれの約定レートとタイミングが大きくずれてしまいます。
合成通貨アービトラージで必要
他にも合成通貨アービトラージをする場合にも同じ理屈でマルチタスクが必要になります。
そこでどうするかというと、
普段の演算とオーダーを分けて処理するようにします。
構成としては、
EA1:テクニカルやチャート更新ごとに演算を行う
EA2:EA1から指示を受けて実際にオーダーを出す(買い注文)
EA3:EA1から指示を受けて実際にオーダーを出す(売り注文)
と3つ作ります。
そして、それぞれを別々のチャートにセットすれば準備完了です。
MT4でマルチタスクを実装するには
さて、
問題はどうやってEA間で情報をやりとりするかということですが、
グローバル変数を使います。
ファイル関数でもいいですが、同一MT4上の場合、グローバル変数の方が高速です。
1 2 3 4 5 6 7 8 |
datetime GlobalVariableSet( string name, // Global variable name double value // Value to set ); double GlobalVariableGet( string name // Global variable name ); |
グローバル変数を他で使うケースがないので、プログラマの方でも使ったことがない場合があるかもしれません。
基本的には上記で取得したりセットするだけです。
注意点は数字しか保存できないという点です。
文字列は代入できないので、USDJPY_buyのような情報は渡せません。
そのため、あらかじめ通貨ペアを決めておくか暗号化処理をするしかありません。
ここで言う暗号化処理とは文字列を数字に変換する機構のことです。
たとえば、
a=00
b=01
c=02
…
y=24
z=25
として
usdjpy=201803091524
と暗号化してもOKです。
あとはEA1で買いのシグナルがでたらグローバル変数に買いの情報を流し、
EA2で買いオーダーを出します。
EA2で買いオーダーを出したらグローバル変数の中身を書き換えます。
(空でも0でもなんでもOKです)
あとは以下繰り返す仕様にすれば完成です。
具体的なコードは合成通貨アービトラージを参照してください。
Q.MT4でのマルチスレッドについての質問
Q. マルチスレッドについてご質問です。記事のように両建てをする際にマルチスレッドによる両建てとシングルスレッドによる両建てでは、オーダー処理にかかる時間にどのくらいの差が出るのでしょうか?
A.
MT4の処理は基本的にはシングルスレッドなので、両建ての処理をしようとした場合、
ティック到来
↓
いろいろ条件をクリアして買いのオーダーをFX業者サーバーに出す
↓(数百ミリ秒~)
FX業者のサーバーが受理してオーダーを処理する(数百ミリ秒~)
↓(数百ミリ秒~)
サーバーからオーダー処理の結果が返ってくる
↓
売りオーダーを出す(両建てをする)
↓
FX業者のサーバーがオーダーを処理する
という流れなので、ネットワークの状態によっては、行って帰ってくるまでに数秒かかるでしょうね。(どんなに早いマシンでも1秒以上はロスが発生していると思います)
また、FX業者がオーダーの処理に時間を要する場合も、同様にロスが生じます。(もしかしたらこっちの方が大きいかも)
一方、マルチスレッドの場合は、
ティック到来
↓
いろいろ条件をクリアして、両建てのオーダーを別チャートのEAに渡し、FX業者サーバーにオーダーを出す
↓(数百ミリ秒~)
FX業者のサーバーがオーダーを処理する
という流れなので、全然速度が違います。
問題は、「そこまで早くすることによって、その両建てロジックがどれだけ活きるのか」というところだと思いますが…
- PREV
- MT4対応の海外FX業者 一覧比較
- NEXT
- APIビットコインアービトラージシステム
関連記事
-
OANDAのAPIの始め方と使い方とレート比較
オアンダのAPIやります。 金融業界、とりわけFX業界ではFIX APIが機関投資
-
[MT4]EAに口座縛り/期間限定縛りをかける種類と方法(MT5)
良いEAができた場合、身内で配布したい場合があります。しかし、知らない間に自分のEAが出回っていた場
-
プログラマ向け自動売買開発アイディア
「MQL4/MQL5は扱えるようになったけど、プログラミングのアイディアがない」というプログラマは比
-
利用可能なトレード系金融APIまとめ FIX API,REST API,OPEN API
今まで当たり前のようにMT4/MT5/TradeStationで開発をしてきましたが、そういえばAP
-
[MT4]チャートを分析して、一番多いパターンが来たらトレードするEA
パターン分析トレードとは 今回はMT4のファイル関数を使って、パターン分析トレードシステムを作成し
コメント
マルチスレッドについてご質問です。
記事のように両建てをする際に
マルチスレッドによる両建てと
シングルスレッドによる両建てでは、
オーダー処理にかかる時間にどのくらいの差が出るのでしょうか?
何時も見させて頂いています。
一つ質問なのですが、MT4のGlobalVariableset getを頻繁に行うとMT4とサーバーのpingが時間が経つごとに遅くなっていきます。これは、毎回GlobalVariableSetがメモリ確保をし、そのメモリーを解放できてなく、重くなり結果的に遅くなっているのでしょうか?
是非、御意見お聞かせください。
はじめて聞いた話なのでこちらでも実験をしてみましたが、グローバル変数の呼び出し・書き込みをしてもpingが低下するというのは確認できませんでした。
たしかに、グローバル変数はよく使われる機能ではないのでメモリ管理周りに改善点がある可能性はありますが、それがネットワーク通信速度にまで影響するかというと因果関係が不明瞭です。
これはかなりマニアックな内容なのでMQL5コミュニティで質問してみた方が良いと思います。本部が実際に観測すれば何かしらの改善も期待できると思います。
マルチスレッドについてご質問です。
受け側のEAにおいて、GlobalVariableGetは無限ループの中で記載するのでしょうか?
それとも何か特別なイベント(OnTick()?)が発生するのでしょうか?