微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

OrderClose 功能无法正常工作

如何解决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));
            }
         }
      }
   }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。