スポンサーサイト





上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

タグ :

Return to page top

  • Comments (Close): -
  • TrackBack (Close): -

for文の昇順・降順





for文とOrderClose()関数を使って複数ポジションをまとめて決済する場合、for文の中を降順

int i=OrdersTotal()-1; i>=0; i--

とせずに、昇順

int i=0; i<OrdersTotal(); i++

でループするとうまくいきません。

昇順にすると、決済されないポジションが発生してしまうのです。

いま、ポジションを3つ作ってみました。

20110301_1


このポジションを簡略に書きます。

注文番号インデックス
24929510
24929521
24929532



このポジションに対して、昇順のfor文でまとめて決済するスクリプトを実行してみましょう。

int start()
{
for(int i=0; i<OrdersTotal(); i++)
{
OrderSelect(i,SELECT_BY_POS);
OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), NULL);
}
return(0);
}


まん中の注文番号 2492952 が残ります。

20110301_2


この理由を突き止めるため、for文をステップバイステップで実行してみます。

iが0のとき、インデックスが0の注文番号 2492951 が決済されます。

注文番号インデックス
24929510
24929521
24929532


この後、注文番号 2492951 のポジションが消えたので、インデックスが一つ繰り上がります。

注文番号インデックス
24929520
24929531


iが1のとき、インデックスが1の注文番号 2492953 が決済されます。

注文番号インデックス
24929520
24929531


インデックスが0の注文番号 2492952 が残ります。インデックスが2のポジションがないので、i=2は実行されずにfor文終了です。

注文番号インデックス
24929520


このように、昇順のfor文でまとめて決済スクリプトを実行すると、インデックスが繰り上がっていくので決済されないポジションが発生してしまうことになります。

降順なら、インデックスの繰り上がりがないのでこのようなエラーは発生しません。

スポンサーサイト

タグ :

Return to page top

Comments:

Comment Form
Only inform the site author.

Trackback+Pingback:

TrackBack URL for this entry
http://metatradermania.blog24.fc2.com/tb.php/56-001190a0
Listed below are links to weblogs that reference
from ど素人のMetaTrader入門
Bookmark
検索フォーム
RSSリンクの表示
QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。