ノーポジの確認方法 | MT4 EA

発注条件を1エントリー、一つのポジションとします。このロジックを組み立てるため、オーダープールに発注済みポジションなどが無いことを確認します。

OrdersTotal() のコード例

int OrdersTotal(); は、保有中のポジションと予約注文の合計数、つまりオーダープールの総数がわかります。ココを確認することでノーポジかどうかが分かります。

ノーポジ確認 簡易版

ロジックテストなど、自身のEA しか動いていない時に使います。

if( !OrdersTotal() ){
  // ノーポジ時にやりたいこと
  }

OrdersTotal()0 ならノーポジです。EA で予約注文はあまり使わないので、保有中のポジションと予約注文の合計が 0 ならノーポジです。

このEA がノーポジなのを確認

【EA 運用時は、同じ口座に他の EA も稼働している】と考え EA を設計すると安全です。他の EA も同じ口座に動いているのだから、自身のEAポジションと混ざらないようマジックナンバーで区別します。マジックナンバーとは、EA 単位で指定できる識別番号のことです。他の EA と同じ番号にならないように、sinput で任意の番号を指定できるようにします。sinput は、ストラテジーテスターでの最適化にかかわらないパラメータの入力に使います。

// 前略
sinput int myMagic = 1234; //マジックナンバー

// 中略
void OnTick(){
  int  total  = OrdersTotal();
  bool myPosi = false;

  if( 0 < total ){
    for( int i=0;i<total;i++ ){
      if( !OrderSelect( i, SELECT_BY_POS ) ){
        Print("order select: ",_LastError);
      }
      if( OrderMagicNumber() == myMagic ){
        myPosi = true;
      }
    }
  }
  else if( !myPosi ){
    // ノーポジでやりたいこと
  }
}

上記コード例はオーダープールに注文があっても、このEA のポジションはない時に何かをします。オーダープールに自身のマジックナンバーと一致するものがあったら true フラグを立て何もしません。

具体的には、OrdersTotal() で総注文数を調べます。調べた全注文を for ループで回します。OrderSelect() をコール、注文データを取得します。このコード例では、コール失敗時のエラー処理も同時に行っています。SELECT_BY_POS は、オーダープールのインデックス毎に調べるためのフラグです。OrderMagicNumber() で myMagic の有無をチェックします。

bool  OrderSelect(
  int  index,              // インデックスかチケット番号
  int  select,             // フラグ
  int  pool= MODE_TRADES  // モード
);

int OrderMagicNumber(); は、OrderSelect() で取得した注文のマジックナンバーがわかります。