如何解决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 个订单:
- i = 0,OrdersTotal() = 5 -> 平仓订单 0。
- i = 1,OrdersTotal() = 4 -> 关闭位置 1 的订单。
- i = 2,OrdersTotal() = 3 -> 在第 2 位平仓。
- 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 举报,一经查实,本站将立刻删除。