我遇到过。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)
意义是:如果当前的止损价没有被修改时,那么就进行修改。
否则如果当前的止损价已经被修改了,那么就不往下执行(就不进行修改了)
其实以上各位的方法都是错误,最后的都还是不能很解决楼主的问题。
下面我给大家一个完整的解答:
代码中加入了修改订单止损的条件:
意义是:如果当前的止损价没有被修改时,那么就进行修改。
否则如果当前的止损价已经被修改了,那么就不往下执行(就不进行修改了)
谢谢,我在测试时也遇到这个问题,用你的办法解决
又遇到麻烦了,各位帮忙了,我在做测试时,会出现Ordermodify error 1,怎么都找不到原因了,大家给点建议了,女人的脑袋就是很笨,,哎!!