ループと注文のクローズまたは削除 - ページ 3

 

このようなループをしたらどうでしょう。

  for(int i=0; i< OrdersTotal(); i++) // For market and pending orders
     {
      if((OrderSelect(i,SELECT_BY_POS)==true)     //If there is the next one
      && (OrderSymbol()==Symbol()) && OrderMagicNumber() == Magic_A )               
        {

これは、mql4の本で紹介されている、注文のための配列を作成するためのループです。

注文が終了するたびにOrdersTotal()は勝手に減っていくのでしょうか?

//***************************************************************************

私はちょうど本を見ました、以下は順序を閉じるために与えられたループです、したがって、答えはイエスです:( https://book.mql4.com/trading/orderclose )

 for(int i=1; i<=OrdersTotal(); i++)          // Order searching cycle
     {
      if (OrderSelect(i-1,SELECT_BY_POS)==true) // If the next is available
        {                                       // Order analysis:
         //----------------------------------------------------------------------- 3 --
         if (OrderSymbol()!= Symb) continue;   
 
ffoorr:

このようなループをするとどうでしょう。

これは、mql4の本で紹介されている、注文のための配列を作成するためのループです。

注文が終了するたびにOrdersTotal()は勝手に減っていくのでしょうか?


はい、そうです。しかし、すべての注文が締め切られるわけではありません。 このスレッドの最初の2つの投稿を読んでください... ...それは詳細に説明されています。
 
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 ! 

TotalNumberOfOrders = OrdersTotal() と宣言しなくても良いのでしょうか?

つまり、そのままOrdersTotal() を使えばいいのです。

for ( x = OrdersTotal() - 1 ...... )

 
と聞くのではなく、それを試してみたらどうだろう。それがあなたの経験になるはずです。
 
私は現在それを使用していますが、私はそれが同じであるにもかかわらず、出力に確信が持てません。OrdersTotal()はforループの中にあるので、1つの注文を閉じると何度もOrdersTotalに影響するのでしょうか?
 
両方試してみて、その違いを見極めてください。
 
juniorlcq:
現在それを使用していますが、同じであっても出力に自信がありません。OrdersTotal()がforループの中にあるので、1つの注文を閉じると何度もOrdersTotalに影響するのでしょうか?

いいえ、OrdersTotalをチェックして いるのではなく、PositionIndexをループを継続する条件としてチェックしているからです。

for(PositionIndex = TotalNumberOfOrders - 1; PositionIndex >= 0 ; PositionIndex --)
 

このトピックを説明するのは素晴らしい仕事です。グラフィックなしでの説明は不可能です...。よくやった。

私がカウントダウン方式ではなく、カウントアップ方式を使わざるを得なかったのは、あるブローカーで

で、一番新しい取引を最初に決済させてくれませんでした...なんと愚かな。

もう一度言うよ......よくやった......。

 
Jimdandy: 私がカウントダウン方式ではなく、カウントアップ方式を使わざるを得なかったのは、FIFOに非常にうるさいブローカーで、最新のトレードを最初にクローズさせなかった時だけです...なんて愚かな。
その場合は、関連するチケット番号をすべて(配列で)キャプチャしてから、クローズしてください。カウントアップしてクローズするのはやめましょう。
 

専門家の皆さん、この解決策についてどう思われますか?

while(OrdersTotal()>0)
  {
   if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))
     {
      switch(OrderType())
        {
         case OP_BUY:  if(!OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),MaxSlippage,CloseColor)) Print("OrderClose error ",GetLastError()); break;
         case OP_SELL: if(!OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),MaxSlippage,CloseColor)) Print("OrderClose error ",GetLastError()); break;
         case OP_BUYSTOP:
         case OP_SELLSTOP:
         case OP_BUYLIMIT:
         case OP_SELLLIMIT: if(!OrderDelete(OrderTicket())) Print("OrderDelete error ",GetLastError());
        }
     }
   else Print("OrderSelect error ",GetLastError());
  }