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()
で取得した注文のマジックナンバーがわかります。