MT4のポジション管理の注意点

最近知り合いが書いたコードをチェックしたのですが、ポジション管理の方法が良くなかったので紹介します。

問題点

問題のコードはこちら

if(OrdersTotal() == 0) {
   // 発注処理
}

OrdersTotal関数の結果が0だったらポジションを保有していないと判断して発注処理に進んでいました。
この処理はMQL4アンチパターンの一つです。

OrdersTotal関数が返す保有中ポジション数は、このプログラムによってエントリーしたポジションの数ではなく、口座全体のポジション数なのです。
つまり手動でエントリーしたポジションや、他のEAも稼働させている場合はそれらがエントリーしたポジション数も含まれてしまいます。
では何が起きるかというと、手動でポジションを保有していたりするとこのEAはエントリーしなくなってしまうのです。
手動取引や他EAの取引によって影響を受けてしまうため、OrdersTotalを使ったポジション管理はNGです。

解決策

OrdersTotalは使わず、OrderSelectとOrderMagicNumberでEAのポジション数を取得するのが正解です。

int total = 0;
for(int i = OrdersTotal() - 1; i >= 0; i--) {
   if(OrderSelect(i, SELECT_BY_POS) == false) continue;
   if(OrderMagicNumber() != Magic || OrderSymbol() != _Symbol) continue;
   total++;
}

この書き方はEA開発で何度も登場するので覚えましょう。 MQL4でOrderSelectを使う処理は手間がかかりますが、この方法でないと堅牢なEAは作成できません。

余談

アンチパターンの4章は取引処理に関する話にする予定です。
この記事で紹介した内容についても記載します。
10月中の公開に向けて頑張って書いていきます。

arrow_upward