TP/SL決済後にチケットを初期化する方法

◆問題

成り行きで決済する場合はチケットを初期化するプログラムを一緒に書けば良かったのですが、注文時にTP/SLを指定して自動決済された場合はチケットが初期化されず、次の注文がされなくて困っていました。


◆解決方法

ポジションが閉じているかを調べ、閉じていたらチケットを初期化します。

ポイントは3つあります。


① ポジションをfor文で回して調べる際、OrdersTotalではなく、OrdersHistoryTotalを使う

OrdersTotalがエントリー/保留中の注文数を返すのに対し、OrdersHistoryTotalは決済済み注文の数を返します。


② OrderSelect時、MODE_TRADESではなく、MODE_HISTORYを使う

これも①と同様で、決済済みの注文を選択するためです。


③ OrderCloseTimeで決済されているかを調べる

OrderCloseTimeは決済されている場合はその時間を、決済されていない場合は0を返します。つまり、0以外が返ってくれば決済された注文ということになります。


◆コード

   for(int i=OrdersHistoryTotal()-1; i>=0; i--){
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==true){
         if(OrderType()==OP_BUY && OrderMagicNumber()==MAGIC && OrderCloseTime()!=0){
            TicketB=0; //買い注文のチケット初期化
         }
         if(OrderType()==OP_SELL && OrderMagicNumber()==MAGIC && OrderCloseTime()!=0){
            TicketS=0; //売り注文のチケット初期化
         }
      }
   }