循环和关闭或删除订单 - 页 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()会不会自己减少?


是的,它将会......但事实是,所有的订单都将被关闭。 请阅读本主题的前两篇文章 ......里面有详细的解释。
 
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: 我唯一一次被迫使用向上计数法而不是倒计时法是在一个经纪人身上,他对先进先出的原则非常敏感,不允许我先关闭最新的交易....,这多愚蠢。
在这种情况下,捕捉所有相关的票号(在一个数组中),然后关闭。不要倒数和关闭。
 

专家们好,你们对这个解决方案有什么看法?

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());
  }