直近の決済ポジションがSLだったらとかに有効
EAを作っていると、直近の決済ポジションがSLだったらこうしてほしいみたいなケースが時々あります。
決済ポジションの状態を参照するには、OrdersTotal関数ではなくOrdersHistoryTotal関数を使うわけですが、SLやTPで決済されたかどうかを正確に判定できる方法はないもんかとずっと悩んでおりました。
そんなある日、とあるEAを作っていた時にOrderComment関数を使うシーンがありまして、OrderCommentが吐き出すログを見てあることに気づきました。
SLに引っかかった時は[sl]、TPに引っかかった時は[tp]という文字列がコメントの最後に自動付与されることに。
目からウロコが落ちました。久々の感動です。
この性質を使えば、ポジションがSLあるいはTPで決済されたかどうかを識別できますよ!
例えば、こんなコードです。
for(int i = OrdersHistoryTotal() - 1; i >= 0; i--){ if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) == false){ break; } if(OrderSymbol() != Symbol() || OrderMagicNumber() != *****){ continue; } // コメントに[sl]という文字列が存在していたら、SL決済と判断 if(StringFind(OrderComment(), "[sl]") >= 0){ // 何らかの処理 } }
StringFind関数は対象の文字列に指定の文字列が含まれているかどうかを判定するための関数です。
0以上であれば存在していることを表します。
なお、*****にはマジックナンバーのextern変数かinput変数が入ります。