有没有人遇到Ordermodify error 1的问题?

 

又遇到麻烦了,各位帮忙了,我在做测试时,会出现Ordermodify error 1,怎么都找不到原因了,大家给点建议了,女人的脑袋就是很笨,,哎!!

 

我遇到过。Ordermodify()通常用来修改止盈或者止损价格的,出现上述错误,表示修改的价格出了问题。修改价格时应注意两方面的问题:

第一,小数点格式是否规范,它可以通过 格式转换 函数来修正,比如:

nPriceLoss = NormalizeDouble(nPriceLoss,nRunDigits);
第二,修改的价格是否已经发生了变化,它可能通过判断来解决,比如:

if( OrderStopLoss()!=nW_NewLossPrice ) { OrderModify(OrderTicket(),0,nW_NewLossPrice,OrderTakeProfit(),0,CLR_NONE); }

供参考。

 

Ordermodify error 1

这个错误的原因是Ordermodify()发送的响应修改参数与要修改的订单是完全一样的(也就是发送了修改命令,但是订单根本就不需要修改)

这个问题是由于浮点数比较产生的(浮点数的隐含的极小尾数)。和浮点数不能做等于比较一样的原因。

用NormalizeDouble()是一个办法

但有时候也解决不了。

在比较的时候建议可以考虑下面的方式。

//+------------------------------------------------------------------+
int _MoveStopCZ(int MAGIC, double BASE,int ORDERTYPE)//_MoveStop(MAGIC, MOVE);
  {
//----
   double BaseTemp=NormalizeDouble(BASE,Digits);
   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)
     {
       if (ORDERTYPE==OP_BUY && OrderStopLoss()<BaseTemp-1*Point)
       if(!OrderModify(OrderTicket(),OrderOpenPrice(),BaseTemp,OrderTakeProfit(),OrderExpiration()))
       {
         return(-1);
       }
       if (ORDERTYPE==OP_SELL && OrderStopLoss()>BaseTemp+1*Point)
       if(!OrderModify(OrderTicket(),OrderOpenPrice(),BaseTemp,OrderTakeProfit(),OrderExpiration()))
       {
         return(-1);
       }
     }
   }
//----
   return(0);
  }
//+------------------------------------------------------------------+
if (ORDERTYPE==OP_BUY && OrderStopLoss()<BaseTemp-1*Point)

这里的

1*Point

就是用来去掉这个错误的。

之所以加上这个是因为虽然前面有

BaseTemp=NormalizeDouble(BASE,Digits);

做规格化,但是还是会出现Ordermodify error 1

加了这个就没有了。

 

其实以上各位的方法都是错误,最后的都还是不能很解决楼主的问题。

下面我给大家一个完整的解答:

//+------------------------------------------------------------------+
int _MoveStopCZ(int MAGIC, double BASE,int ORDERTYPE)//_MoveStop(MAGIC, MOVE);
  {
//----
   double BaseTemp=NormalizeDouble(BASE,Digits);
   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)
     {
       if (ORDERTYPE==OP_BUY && NormalizeDouble(OrderStopLoss(),Digits)!=NormalizeDouble(BaseTemp,Digits))
       if(!OrderModify(OrderTicket(),OrderOpenPrice(),BaseTemp,OrderTakeProfit(),OrderExpiration()))
       {
         return(-1);
       }
       if (ORDERTYPE==OP_SELL && NormalizeDouble(OrderStopLoss(),Digits)!=NormalizeDouble(BaseTemp,Digits))
       if(!OrderModify(OrderTicket(),OrderOpenPrice(),BaseTemp,OrderTakeProfit(),OrderExpiration()))
       {
         return(-1);
       }
     }
   }
//----
   return(0);
  }
//+------------------------------------------------------------------+

代码中加入了修改订单止损的条件:

NormalizeDouble(OrderStopLoss(),Digits)!=NormalizeDouble(BaseTemp,Digits)

意义是:如果当前的止损价没有被修改时,那么就进行修改。

否则如果当前的止损价已经被修改了,那么就不往下执行(就不进行修改了)

 
zhangyi:

其实以上各位的方法都是错误,最后的都还是不能很解决楼主的问题。

下面我给大家一个完整的解答:

代码中加入了修改订单止损的条件:

意义是:如果当前的止损价没有被修改时,那么就进行修改。

否则如果当前的止损价已经被修改了,那么就不往下执行(就不进行修改了)


谢谢,我在测试时也遇到这个问题,用你的办法解决
 
公司操盘专用EA实盘观摩帐户:200739 密码:qq739966752 服务器:98.158.109.200
公司大资金操盘EA模拟帐户:2008931 密码:qq739966752 服务器:98.158.109.206
适合小资金趋势EA模拟帐户:2009913 密码:qq739966752 服务器:98.158.109.206
原因: