2024.08
林貴晴/AMSER Inc.
MQL5では、独自の問題として重複発注が発生することがあります。この重複発注は、バックテストやデモ口座では起こらず、本番口座でのみ発生するため、特に注意が必要です。この記事では、この重複発注の原因と、それに伴うポジション管理のポイントについて詳しく見ていきたいと思います。
MQL4では、未約定の指値注文、逆指値注文、成行注文による未約定ポジション、および約定済みで未決済のポジションは、すべてOrdersTotal()にカウントされます。つまり、発注してから決済またはキャンセルされていないポジションは、OrdersTotal()で一括して管理される仕組みになっています。
一方、MQL5では、オーダーとポジションが別々に管理されます。オーダーは、未約定の指値注文、逆指値注文、成行注文による未約定ポジションを指し、ポジションは約定済みで未決済のポジション数を表します。
OrderSend()関数で注文を発注すると、その注文はFX業者のサーバーに送られ、OrdersTotal()のカウントが1になります。この時点では、PositionsTotal()はまだ0のままです。
その後、FX業者のサーバーで注文が約定すると、OrdersTotal()のカウントは0になり、PositionsTotal()が1増えます。このプロセスには、数百ミリ秒から数秒の時間がかかることがあります。つまり、発注してからPositionsTotal()が1に増えるまでにタイムラグが生じるのです。
重複発注の原因は、このタイムラグの間にポジション数が0とカウントされることにあります。
一方、バックテストやデモ口座では、約定がほとんどタイムラグなしに行われるため、発注と同時にPositionsTotal()が増加し、重複発注が発生することはありません。
最もシンプルな重複発注対策はSleep()です。
Sleep( int milliseconds);
発注後にSleep()を使って一時停止することで、約定までのタイムラグを回避することができます。ただし、このタイムラグは、FX業者のカバー先、サーバーの設置場所、こちらのPCの場所や環境などによって異なるため、Sleep()の時間を適切に設定することが重要です。時間が短すぎると重複発注が発生する可能性があり、逆に長すぎると次の注文に影響が出るかもしれません。そのため、EAのロジックに応じて適切な値を設定する必要があります。例えば、5分足以上の始値で動作するEAの場合、2〜3分の停止が適当な時間となるでしょう。
また、マジックナンバーを限定してオーダー数やポジション数を取得する方法も有効です。以下のコードは、特定のマジックナンバーに基づいてオーダー数とポジション数を取得する例です。cntOrderが0でない場合には発注を止めることで、重複発注を回避することができます。また、cntOrderとcntPositionを合計することで、実際に発注されている未決済のポジション数を把握することができます。
int Magic = 12345; int cntOrder=0,cntPosition=0; for(int i = 0; i < OrdersTotal(); i++) { ulong Ticket=OrderGetTicket(i); if(OrderGetInteger(ORDER_MAGIC) == Magic)cntOrder++; } for(int i = 0; i < PositionsTotal(); i++) { ulong Ticket=PositionGetTicket(i); if(PositionGetInteger(POSITION_MAGIC) == Magic)cntPosition++; }
重複発注の問題は、MQL5の取引において特に注意が必要です。発注と約定の間には、タイムラグが生じることがあり、このタイムラグが原因でポジション数が0とカウントされる瞬間が発生します。この瞬間に次の発注が行われると、意図しない重複発注が起こる可能性があります。
しかし、このタイムラグはバックテストやデモ口座ではほとんど発生しないため、これらの環境では重複発注の問題が表面化しません。実際の運用環境で重複発注を防ぐためには、Sleep()関数を用いた適切なタイミング調整や、オーダー・ポジション管理を導入することが重要です。
これらの対策を講じることで、実際の取引における重複発注リスクを大幅に軽減し、安定したEA運用を実現することができるでしょう。
林 貴晴(AMSER株式会社代表取締役)
内資系薬品会社で約10年勤務の後、
外資系製薬会社(現IQVIA及びGSK)で合計約10年を勤務
その後EA AMSERを開発し、その成績を評価され、株式会社ゴゴジャンの部長として抜擢。
現在はAMSER株式会社代表取締役。