mt4 (MetaTrader4)使い倒シストレ

メタトレーダー、自作インジケータ、自作EAで完全自動売買。使えるものは何でも使え。
インジケーター、EA(自動売買システム)製作のご依頼はこちらへ
Googolyen FX Factory
スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


にほんブログ村 為替ブログ FX システムトレード派へ
--/--/--(--) --:--:-- | スポンサー広告 | Trackback(-) | Comment(-)
Order関数使ってますか?
EAやScriptを自作される方は、Order関数群を使っておられるはずです。
for文内でポジションのクローズ処理を書くのが、一般的ではないでしょうか。

以下の2コードを見てください。


コードA

int start()
{
int i, magic;
magic = 111;
for (i = 0; i < OrdersTotal() - 1; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false)
continue;
if (OrderSymbol() != Symbol() || OrderMagicNumber() != magic)
continue;

if (OrderType() == OP_BUY)
OrderClose(OrderTicket(), OrderLots(), Bid, 3);
else if (OrderType() == OP_SELL)
OrderClose(OrderTicket(), OrderLots(), Ask, 3);
}
}


コードB

int start()
{
int i, magic;
magic = 111;
for (i = OrdersTotal() - 1; i >= 0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false)
continue;
if (OrderSymbol() != Symbol() || OrderMagicNumber() != magic)
continue;

if (OrderType() == OP_BUY)
OrderClose(OrderTicket(), OrderLots(), Bid, 3);
else if (OrderType() == OP_SELL)
OrderClose(OrderTicket(), OrderLots(), Ask, 3);
}
}

2つのコードではfor (...)部分が違うだけです。
Aではiの値が1ずつ増加(インクリメント)しています。
Bではiの値が1ずつ減少(デクリメント)しています。

このコードは、
『複数ポジションを持っていた場合に、全てのポジションをクローズする』
という処理を行っているように見えます。

しかし、

実はコードAでは全てのポジションをクローズすることはできません


iがインクリメントしているか、デクリメントしているか
たったこれだけの違いで現われてくる問題なんです。




具体的に解説します。
今、3つのポジションを持っていると仮定しましょう。
3つのポジションにおける情報は以下の通りとします。





呼び名ポジション番号(iの値によって選択)チケット番号タイプ
ポジションa0100BUY
ポジションb1101SELL
ポジションc2102BUY



○コードB
まずi = 2(OrdersTotal() - 1)によってポジションcが選択され、ポジションcが決済されました。
決済された後のポジションの状態は以下になります。




呼び名ポジション番号(iの値によって選択)チケット番号タイプ
ポジションa0100BUY
ポジションb1101SELL

その後iはデクリメントされi = 1となります。

i = 1によってポジションbが選択され、…以下略


と、i = -1になるまで以上の操作が繰り返され、めでたく全クローズが完了します。


○続いてA
i = 0によってポジションaが選択され、ポジションaが決済されました。
決済された後のポジションの状態は以下になります。




呼び名ポジション番号(iの値によって選択)チケット番号タイプ
ポジションb0101SELL
ポジションc1102BUY

その後iはインクリメントされi = 1となります。

i = 1によってポジションbが…あれれ?
i = 1によって選択されるのはポジションcですね。
これでは最終的にポジションbが残ってしまうことになりますね。


ポジションが決済される度に、ポジション番号は再割り振りされるみたいで、
その影響でコードAでは全クローズが完了しないのです。





クローズ処理をしないのであれば、コードAでも問題ありませんが、
クローズ処理をする、しないに関わらず、コードBのように書いた方がいいと思います。




にほんブログ村 為替ブログ FX システムトレード派へ
Comment
≪この記事へのコメント≫
コメントを投稿する
URL:
Comment:
Pass:
Secret: 管理者にだけ表示を許可する
 
Trackback
この記事のトラックバックURL
≪この記事へのトラックバック≫
Designed by aykm.
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。