OrderClose 功能无法正常工作

问题描述

这是 OrderClose() 的正确实现吗?

 for(int ii = 0; ii < OrdersTotal(); ii++)
 {
  if(OrderSelect(ii,SELECT_BY_POS,MODE_TRADES))
    {
     if(OrderType() == OP_BUY && OrderMagicNumber() == MagicStart && OrderSymbol() == symb)
       {
        int tikt = OrderTicket();
        if(!OrderClose(tikt,OrderLots(),bid,4,clrPurple))
          {
           Print("Close Error",GetLastError());
          }
       }
       
     if(OrderType() == OP_SELL && OrderMagicNumber() == MagicStart && OrderSymbol() == symb)
       {
        int tikt = OrderTicket();
        if(!OrderClose(tikt,ask,GetLastError());
          }
       }
    }
 }

我在开始交易前使用此代码。例如,如果有买入信号,则先关闭卖出,然后开启买入;如果有卖出信号,则先关闭卖出,然后开启买入。

但它只在第一次执行此操作,之后就无法使用了。假设有卖出信号。然后它将关闭买入并打开卖出,但是当有第二个买入信号时,它不会关闭卖出,也不会打开买入。

专家选项卡中没有错误。我在专家选项卡中收到的唯一消息是这样的消息:Positions order mismatch。它不会显示为错误或警告,它只是显示为一条消息。

解决方法

如果要关闭所有订单,则需要从最近的订单仓位开始迭代到第一个仓位。 试试这个:

for(int i = OrdersTotal()-1; i >= 0; i--)
 {
  if(OrderSelect(i,SELECT_BY_POS))
    {
     if(OrderType() == OP_BUY)
       {
        if(!OrderClose(OrderTicket(),OrderLots(),Bid,0))
          {
           Print("Error closing order: ",GetLastError());
          }
       }
     if(OrderType() == OP_SELL)
       {
        if(!OrderClose(OrderTicket(),Ask,GetLastError());
          }
       }
    }
 }

您不应该在关闭订单时从 0 开始迭代,因为 OrdersTotal() 函数在您循环遍历所有订单并一个一个关闭它们时递减它的值。

例如(在您的循环中)您有 5 个订单:

  1. i = 0,OrdersTotal() = 5 -> 平仓订单 0。
  2. i = 1,OrdersTotal() = 4 -> 关闭位置 1 的订单。
  3. i = 2,OrdersTotal() = 3 -> 在第 2 位平仓。
  4. i = 3,现在循环结束,因为 i == OrdersTotal()。

另外,在 int tikt= OrderTicket(); 函数中使用 OrderTicket() 代替 OrderClose()

,

试试下面的代码,它更健壮,不假设要关闭的订单与 EA 运行的图表符号相同。这将关闭帐户上的所有订单。如果您想将其限制为 EA 运行的图表上的订单,或仅由 EA 打开的订单,您应该在关闭订单之前使用 OrderSymbol()OrderMagicNumber() 过滤订单。

   if(OrdersTotal()>0)
   {
      for(int i=OrdersTotal()-1; i>=0; i--)
      {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
            {
               double price;
               if(OrderType()==OP_BUY) price=MarketInfo(OrderSymbol(),MODE_BID); else price=MarketInfo(OrderSymbol(),MODE_ASK);
               int ticket=OrderTicket();
               bool res=OrderClose(ticket,price,50,clrNONE);
               if(!res) Print("Error Closing Ticket #",IntegerToString(ticket));
            }
            else
            {
               int ticket=OrderTicket();
               bool res=OrderDelete(ticket);
               if(!res) Print("Error Closing Ticket #",IntegerToString(ticket));
            }
         }
      }
   }

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...