大量の(具体的には10コ以上)ポジションがあるとき、EAから全ポジ決済しようとした場合、1ポジずつOrderSend() 関数で処理すると結構な時間がかかる。

 

FXGT相手にMT5でやった場合:

 

1) PositionGetXXXX() で保有ポジの情報を取得

2) OrderSend() を呼んで1)で得たポジの反対売買送信

3) FXGTサーバでオーダー受信~処理

4) FXGTサーバが処理完了後、OrderSend() から戻ってくる

 

1)から4)まで0.5~1秒ぐらいかかる。

ポジ10コあると5~10秒かかることになり、戦闘型スキャルピングEAでの決済処理として考えると全然ダメ。

 

そこで、マルチスレッドで処理できないか? と考えたが、MQL5のみではマルチスレッド実装は不可能。自力でDLL作ってそのDLL内で実装すればかなりなんでも出来そうなんだけど、できれば外部DLLは使わずに(デバッグが複雑になる)MQL5内で完結したい。

 

と思ってあれこれ調べていたら、OrderSendAsync() という関数を見つけた。

Original Reference:

 

 

には、

 

The function is designed for high-frequency trading, when under the terms of the trading algorithm it is unacceptable to waste time waiting for a response from the server.

 

とある。日本語に変換すると:

 

この関数は、サーバからの応答を待つ時間の無駄を容認出来ない取引アルゴリズムの条件下での高頻度取引のために設計されています。

 

まさにコレだ!

早速Test code書いて実験してみよう。

 

俺はこれでAI野郎どものHFTに勝つ!

 


14時46分追記:

 

OrderSendAsync() 早速やってみた。

爆速 (^^)/

20コぐらいのポジ数なら、コンマ数秒で全部決済される。これは実にスンバラシィ。

が、非同期なので実際本当にポジが精算されたのかを確認したほうがいいな。というか、確認しないとマズいな。

なんらかの理由でポジが残ってた場合、Retry処理やるとかしないと。

今夜の米雇用統計発表直後に動かしてみて、ちゃんと処理されるか実験してみよう。