ループと注文のクローズまたは削除

 

Expert Advisor Builderのようなゴミのせいもあってか、これは私がよく目にするエラーの一つです。 だから、私はそれが将来の参考のためにリンクすることができますので、それは主題に専用のスレッドのための時間だと思った。

問題点

簡単な例を見てみましょう。私たちはEAのすべてのオープンオーダーをクローズする関数が欲しいのですが、たくさんの例がありますが、一から作ってみましょう。

このループの中で、注文を選択するコード、それが正しいシンボルとマジックナンバーであることをチェックするコード、そして最後に注文をクローズするコードが必要です。

int PositionIndex;    //  <-- this variable is the index used for the loop

int TotalNumberOfOrders;   //  <-- this variable will hold the number of orders currently in the Trade pool

TotalNumberOfOrders = OrdersTotal();    // <-- we store the number of Orders in the variable

for(PositionIndex = 0; PositionIndex < TotalNumberOfOrders; PositionIndex++)  //  <-- for loop to loop through all Orders
   {
   if( ! OrderSelect(PositionIndex, SELECT_BY_POS, MODE_TRADES) ) continue;   // <-- if the OrderSelect fails advance the loop to the next PositionIndex
   
   if( OrderMagicNumber() == MagicNo       // <-- does the Order's Magic Number match our EA's magic number ? 
      && OrderSymbol() == Symbol()         // <-- does the Order's Symbol match the Symbol our EA is working on ? 
      && ( OrderType() == OP_BUY           // <-- is the Order a Buy Order ? 
      ||   OrderType() == OP_SELL ) )      // <-- or is it a Sell Order ?

      if ( ! OrderClose( OrderTicket(), OrderLots(), OrderClosePrice(), Slippage ) )               // <-- try to close the order
         Print("Order Close failed, order number: ", OrderTicket(), " Error: ", GetLastError() );  // <-- if the Order Close failed print some helpful information 
      
   } //  end of For loop

このコードは悪いです .. . 使わないで ください .. . 次の章でその理由を説明します ... ...

説明

上記のコードを通して作業してみましょう ... ... 一行ずつ、注文ごとに ... ...

次のような注文があるとします。これらはすべてEAと同じマジックナンバーとシンボルを持っているので、コードはこれらすべてをクローズするようにします。

ポジション チケット番号
0111
1222
2333
3444
4555

ループの1回目。

PositionIndexの初期値は0なので、ポジション0のチケット番号111のオーダーが選択され、このオーダーは正常に削除され、残りのオーダーは以下のようにポジションが変更されます。

ポジション チケット番号
0222
1333
2444
3555

ループの2回目。

ここで、PositionIndexの 値は1なので、ポジション1のチケット番号333のオーダーが選択 され、 このオーダーは 正常に 削除され、残りのオーダーは 以下の ようにポジションが変更 されます

ポジション チケット番号
0222
1444
2555

ループの3回目。

ここで PositionIndexの値は 2なので、ポジション2のチケット番号555のオーダーが選択 され、 このオーダーは 正常に 削除され、残りのオーダーは 次の ようにポジションを変更 します。

ポジション チケット番号
0222
1444

ループの4回目の実行。

、PositionIndexの値は3です OrderSelect()はポジション3のオーダーを選択しようとして失敗 し、continueはループ内の次の値までコードを実行します ... .


ループの5回目と最後の実行

PositionIndexの値は4です OrderSelect()はポジション4でオーダーを選択しようとし、 失敗し、continueはループ内の次の値にコードの実行を取ります ... ループは終了しました


現在、チケット222と444の2つの注文が残っており、これらはクローズされるべきでしたが、されていません ... 次に、この問題を解決する方法を説明します。

解決方法

次のコードは、未決済注文を決済したり、保留中の 注文を削除する場合の正しい方法です ... ...

重要な違いは、ループが (TotalNumberOfOrders - 1 ) から 0 までデクリメントする ことです。

int PositionIndex;    //  <-- this variable is the index used for the loop

int TotalNumberOfOrders;   //  <-- this variable will hold the number of orders currently in the Trade pool

TotalNumberOfOrders = OrdersTotal();    // <-- we store the number of Orders in the variable

for(PositionIndex = TotalNumberOfOrders - 1; PositionIndex >= 0 ; PositionIndex --)  //  <-- for loop to loop through all Orders . .   COUNT DOWN TO ZERO !
   {
   if( ! OrderSelect(PositionIndex, SELECT_BY_POS, MODE_TRADES) ) continue;   // <-- if the OrderSelect fails advance the loop to the next PositionIndex
   
   if( OrderMagicNumber() == MagicNo       // <-- does the Order's Magic Number match our EA's magic number ? 
      && OrderSymbol() == Symbol()         // <-- does the Order's Symbol match the Symbol our EA is working on ? 
      && ( OrderType() == OP_BUY           // <-- is the Order a Buy Order ? 
      ||   OrderType() == OP_SELL ) )      // <-- or is it a Sell Order ?
   
      if ( ! OrderClose( OrderTicket(), OrderLots(), OrderClosePrice(), Slippage ) )               // <-- try to close the order
         Print("Order Close failed, order number: ", OrderTicket(), " Error: ", GetLastError() );  // <-- if the Order Close failed print some helpful information 
      
   } //  end of For loop

もう一度、上記のコードで作業してみましょう ... 行ごとに、注文ごとに ...

先ほどと同じ注文があります。

ポジション チケット番号
0111
1222
2333
3444
4555

ループの 1 回目。

PositionIndexの初期値はTotalNumberOfOrders -1で、5 - 1 = 4と なるので、 ポジション4のチケット番号555のオーダーが選択され、このオーダーは正常に削除され、残りのオーダーは以下のようにポジションが変更 されます。

ポジション チケット番号
0111
1222
2333
3444

ループの2回目。

ここで、PositionIndexの 値は3なので、ポジション3のチケット番号444のオーダーが選択 され、 このオーダーは 正常に 削除され、残りのオーダーは 以下の ようにポジションが変更 されます

ポジション チケット番号
0111
1222
2333

3回目のループを実行します。

ここで PositionIndexの値は 2なので、ポジション2のチケット番号333のオーダーが選択 され、 このオーダーは 正常に 削除され、残りのオーダーは 以下の ようにポジションが変更 されます。

ポジション チケット番号
0111
1222

ループを4回実行。

ここで 、PositionIndexの値は 1なので、ポジション1のチケット番号222のオーダーが選択 され、 このオーダーは 正常に 削除され、残りのオーダーは 以下の ようにポジションが変更 されます

ポジション チケット番号
0111

ループの5回目、最後の実行です。

今、 PositionIndexの 値は 0です だから、位置0の注文が選択されます、チケット番号111、 この注文は 正常に 削除されます、値0はループのための最後の有効な値 です... ループは終了しています。

一致する注文をすべて削除することに成功しました ... ...

このスレッドにリンクしています。 ループと注文のクローズまたは削除

 

もっと複雑な例を見てみましょう。

次のような注文があるとします。これらはすべて同じマジックナンバーですが、EAと異なるシンボルを持つものもあり、EAと同じシンボルであるEURUSDの注文を決済するコードにしたいと思います。

ポジション チケット番号 シンボル
0111ユーロドル
1222EURUSD
2333GBPUSD
3444EURUSD
4555EURUSD


ループの1回目。

PositionIndexの初期値はTotalNumberOfOrders - 1で、5 - 1 = 4となり、ポジション4の注文、チケット番号555が選択されます。この注文はマジックナンバーとシンボルに一致するので正常に削除され、残りの注文は以下のようにポジションを変更 します。

ポジション チケット番号 シンボル
0111ユーロドル
1222EURUSD
2333GBPUSD
3444EURUSD

ループの2回目。

この注文はマジックナンバーとシンボルに一致するので 削除に成功し、残りの注文は 次の ように位置を変更 します

ポジション チケット番号 シンボル
0111ユーロドル
1222EURUSD
2333GBPUSD


ループの3回目。

この注文はマジックナンバーに一致するがシンボルには一致しないので 削除されず、残りの注文は変更さ れない

ポジション チケット番号 シンボル
0111ユーロドル
1222EURUSD
2333GBPUSD

ループの4回目。

チケット番号222 この注文はマジックナンバーとシンボルに一致するので、 正常に 削除され、残りの注文は 次の ようにポジションを変更 します

ポジション チケット番号 シンボル
0111ユーロドル
1333GBPUSD

ループの5回目、最後の実行です。

PositionIndex の値は 0 で、ポジション 0 の注文、チケット番号 111 が選択され、 この注文は 正常に 削除され 、値 0 はループの最後の有効な値 です ... ループは終了しました。

シンボルに一致しない1つの注文、チケット番号333が現在ポジション0にあるのを残して、一致するすべての注文を正常に削除しました ....

ポジション チケット番号 シンボル
0333GBPUSD


このスレッドへのリンク ループと注文のクローズまたは削除

 
 

ラプターさん、重要な 解説をありがとうございました。

Y.

 
これは、ゴミのようなエキスパートアドバイザービルダーの王である私にとって、非常に有益なものですああ、私はどのように結果のコードでハッキングを楽しむことができます。多くの感謝。
 

すごい。 注文を閉じるために、これだけの情報が必要なんですね。

一日50ピップ以上、毎日(平均して)コンスタントに、過去137回のトレードを通して、必ずネットするためには、どれだけの情報が必要なのでしょう。

どうすればそんなことができるのか、教えてください。

 
CFx:

すごい。 注文を閉じるために、これだけの情報が必要なんですね。

過去137回の取引を通じて、毎日(平均して)コンスタントに、1日に50ピップス以上の利益を得るには、どれだけの情報が必要なのでしょうか。

私はpipsには全く興味がありません。 GBPPIPSレートは何ですか? あなたは成功をpipsで数えることによって、あなたの無知を示しています。
 
CFx:

過去137回の取引を通じて、毎日(平均)コンスタントに50以上のピップを獲得するには、どれだけの情報が必要なのだろうか。

そのようなことをする方法を教えてください、そして私はそれが非常に有用な情報であると考えるでしょう。

  1. トピックから外れた情報でスレッドをハイジャックしないでください。
  2. MetaQuotes Language 4と自動売買に関すること以外の議論は禁止されて います。
 

Raptor,私はあなたの投稿を一目見て、あなたがmql4のかなりの専門家であることを知りました。このスレッドがまた私の疑問を解消してくれます!良い仕事を続けてください。

 

ただ、もうひとつのアイデアです。

for(PositionIndex = 0; PositionIndex < OrdersTotal() ; PositionIndex ++)  //  <-- for loop to loop through all Orders . .   COUNT DOWN TO ZERO !
   {
   if( ! OrderSelect(PositionIndex, SELECT_BY_POS, MODE_TRADES) ) continue;   // <-- if the OrderSelect fails advance the loop to the next PositionIndex
   
   if( OrderMagicNumber() == MagicNo       // <-- does the Order's Magic Number match our EA's magic number ? 
      && OrderSymbol() == Symbol()         // <-- does the Order's Symbol match the Symbol our EA is working on ? 
      && ( OrderType() == OP_BUY           // <-- is the Order a Buy Order ? 
      ||   OrderType() == OP_SELL ) )      // <-- or is it a Sell Order ?
   
         add_trade_to_close_queue( OrderTicket());  // <--  You need to model the queue mechanism ...
      
   } //  end of For loop


リーズナブル。

 
abstract_mind:


ただ、もうひとつのアイデアです。


リーズナブル。

MT4のロジックを理解し、カウンターを増やすか減らすかはあなた次第です。
理由: