在使用OrderSelect()的时候遇到一个问题

 

程序写好,复盘测试的时候发现一个问题,一直解决不了。不知道有没有其他朋友遇到。

OrderSelect(7,SELECT_BY_TICKET,MODE_TRADES);
Print("OrderTicket()=",OrderTicket());

上诉代码输出结果为: OrderTicket()=5。

测试了下当 index 参数为7、8、9的时候都得到上面的Print结果。

不知道其他朋友遇到过没有。

 
SELECT_BY_TICKET是指按定单号选取,可能你的测试时间段一样,最大值定单号也就5 ,所以只能返回5
 

不是最大5长,7是出错时候的订单号,是实际存在的。昨天测试,1000账单子,9,25,74等很多都是这个问题。不能正确的选择到需要的订单。

我的思路是,现价下单,不设置止赢止损(因为考虑下单时候的滑点使得止赢止损的点数不固定)。然后立即修改这个订单的止赢止损为固定的点数(欧元止赢止损均大于30个点)。

这就需要获取刚发送成功订单的开仓价(Print调试确认已经下单成功),然后就遇到上面的问题。因为要修改的是7号订单,而取得的是5号已经平仓订单的开仓价,从而修改不成功,或者修改错误。

并且这个错误不是连续的。有些能正常选择订单,有些不能,大约5%左右的订单不能正常Select订单。

 
OrderSelect(TempTicket,SELECT_BY_TICKET,MODE_TRADES);
Print("TempTicket=",TempTicket,"    OrderTicket()=",OrderTicket());

输出结果

TempTicket=7 OrderTicket=5

 

试试检查,

要从OrderTotal()向0变化编号,不要从0向OrderTotal()变。

int orders=OrderTotal(); Print("Ord=",orders);
int i;
for(i=orders-1;i>=0;i--)
{

OrderSelect(i,.............

 

你说的问题我知道。我的订单查找程序是从OrderTotal()向0变化的

int SearchOrder (int MAGIC,int ORDERTYPE)
  {
//----
   int i=0;
   for ( int z = OrdersTotal() - 1; z >= 0; z -- )
   {
     if ( !OrderSelect( z, SELECT_BY_POS ) )
     {
       Print("OrderSelect(", z, ",SELECT_BY_POS) - Error #",GetLastError() );
       continue;
     }
     if (OrderSymbol()!=Symbol())continue;
     if (OrderMagicNumber() != MAGIC )continue;
     if ( OrderType()==ORDERTYPE ) i=OrderTicket();
   }
//----
   return(i);
  }
今天挂了模拟实盘现在还没发现问题。感觉可能是MT4复盘测试的BUG