MT4のEAコードで、最後に決済されたポジションの選択

MT4のEAコードで、
最後に決済されたポジションの選択をしたいのですが、
イマイチわかりません。

OrderSelect( OrdersHistoryTotal()-1 , SELECT_BY_POS , MODE_HISTORY );

これでよいのかなと思いましたが、どうやらこれだと、
決済されたポジションだけでなく、
エラーで決済できなかったポジションも選ばれてしまうようです。

書き方を教えてください。
よろしくお願いします。

..[補足]..
for(int i=OrdersHistoryTotal()-1; i>=0; i–)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==true) break;
int Type = OrderType();
if(Type==OP_BUY || Type==OP_SELL)
{
OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)
}
}

これで、
「新しいものから決済成功した成行のものを検索、始めにヒットしたものを選択」
つまり、最後に決済成功したものを選択ってことになってますか?

回答1

MT4のトレーディングプール(=OrdersTotal())内には

?OP_BYU=ポジション化して未決済の新規成行き買い注文
?OP_SELL=ポジション化して未決済の新規成行き売り注文
?OP_BUYLIMIT=ポジション化する前の新規指値買い注文
?OP_BUYSTOP=ポジション化する前の新規逆指値買い注文
?OP_SELLLIMIT=ポジション化する前の新規指値売り注文
?OP_SELLSTOP=ポジション化する前の新規逆指値売り注文

が古いものから順番に入っていて、?〜?がポジション化すると、それらは消えて?か?へカウントされます。

一方、ヒストリープール(=OrdersHistoryTotal()=ターミナルの口座履歴に表示される)内には、

?OP_BUY=上の?が決済されたもの
?OP_SELL=上の?が決済されたもの
?OP_BUYLIMIT=上の?がキャンセルされたもの
?OP_BUYSTOP=上の?がキャンセルされ たもの
?OP_SELLLIMIT=上の?がキャンセルされたもの
?OP_SELLSTOP=上の?がキャンセルされたもの

が古いものから順番に入っています。

で、回答ですが、

たとえば、新規成行き買い注文がポジション化すると、トレーディングプール内の?へカウントされます。その後、そのポジションが決済に失敗すると、そのままトレーディングプール内の?へカウントされたままで、ヒストリープール内の?へカウントされることはありません。

ただし、ヒストリープール内には、キャンセルされた(逆)指値注文(?〜?)も入っているので、直近の決済注文を選択するときは、それらのキャンセル注文を除外しなければいけません。

なので、プログラムするときは、for文を使ったループ検索が必要で、たとえば、
for(int i=OrdersHistoryTotal()-1; i>=0; i–)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) break;
int Type = OrderType();
if( Type==OP_BUY || Type==OP_SELL)
{

}
}

みたいな感じにする必要があります。

>補足に対して

これでは、OrderSelect()が二度も実行されちゃいますね。

たとえば、

?マジックナンバーと通貨ペアが同じで、
?直近に決済されたポジションの、
?損益を算出する、

という場合ですと、

for(int i=OrdersHistoryTotal()-1; i>=0; i–)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) break;
if(OrderMagicNumber()!=MAGIC || OrderSymbol()!=Symbol()) continue;
int Type = OrderType();
if(Type==OP_BUY || Type==OP_SELL)
{
double Profit = OrderProfit();
break;
}
}
と書けば、Profitという変数に、その損益が格納されます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA