OrderModify error 1

 
Господа!
Может я что-то не вижу в упор.

Вот кусок кода
if(Trailing>0)  
{
   if(OrderType()==OP_BUY)
   {
      if(Bid-OrderOpenPrice()>Point*Trailing)
      {	
         SL=NormalizeDouble(Bid-Point*Trailing,Digits);
         Print(OrderStopLoss()," < ",SL);
         if(OrderStopLoss()<SL)
         {
            res=OrderModify(OrderTicket(),OrderOpenPrice(),SL,OrderTakeProfit(),0,Green);
            if (!res)  {Print(OrderStopLoss(),"   ",SL);}
            return ;
         }
		}
   }
        
	if(OrderType()==OP_SELL)
   {
	  if(OrderOpenPrice()-Ask>Point*Trailing)
     {	
         SL=NormalizeDouble(Ask+Point*Trailing,Digits);
         Print(OrderStopLoss()," > ",SL);
         if((OrderStopLoss()>SL) || (OrderStopLoss()==0))
         {
		       res=OrderModify(OrderTicket(),OrderOpenPrice(),SL,OrderTakeProfit(),0,Red);
             if (!res)  {Print(OrderStopLoss(),"   ",SL);}
	          return;
         }
      }
    }
}
   



И после всего этого тостер периодически выдает ошибку OrderModify error 1.
В логе он пишет вот што:

15:25:14 2007.01.23 11:06 May Test GBPUSD,H4: 1.9546 < 1.9546
15:25:14 2007.01.23 11:06 May Test GBPUSD,H4: OrderModify error 1
15:25:14 2007.01.23 11:06 May Test GBPUSD,H4: 1.9546 1.9546

То есть по его мнению 1.9546 меньше 1.9546. Что тут за беда?

 
почитай здесь по поводу сравнения двух вещественных, вставь вывод GetLastError, а тестер выдает ошибку потому что у тебя текущий с.л. уже равен тому что ты хочешь поставить с точностью до ...., а вот если брать большую точность, то не равны
 
Давай по порядку.
OrderStopLoss() - имеет 4 знака после запятой, для GBPUSD (правильно). Оно по умолчанию нормализовано или я ошибаюсь
SL тоже нормализуем до Digits, теже 4 знака после запятой.

Где сабака-то?
 
Да GetLastError выдает, соответсвенно, 1. Это и в логе видно

15:25:14 2007.01.23 11:06 May Test GBPUSD,H4: OrderModify error 1
 
зачем гадать, преобразуй в текстовое с точностью например до 8 знаков и выведи
Print( DoubleToStr(OrderStopLoss(),8) ," < ",DoubleToStr(SL,8));
 
Вставил.

Вот результат

09:47:23 2007.08.24 20:35  May Test GBPUSD,H1: 1.98450000 < 1.98450000



Легче не стало. Может касяк в не в советнике, а в MT4?
Господа разработчики. Кто тут не прав. Рассудите.

 
да, что-то не то .... (может разница дальше, я думал восьми знаков будет достаточно)
ну наверно не повредит все таки сделать так: вставляем функцию
//+---------------------------------------------------------------------------------------------------------------------------------------------------+
//| функция возвращает истину если первое число больше второго                                                                                        |
//+---------------------------------------------------------------------------------------------------------------------------------------------------+
bool GreaterDoubles(double number1,double number2,int dig)
{
   if(NormalizeDouble(number1-number2,dig)>0) return(true);
   else return(false);
}
//=====================================================================================================================================================



и вместо if(OrderStopLoss()<SL)
пишем if( GreaterDoubles(SL,OrderStopLoss(),Digits) )

 
Всего в double 15 знаков должно быть. То есть если взять разность и умножить на 10000000 разница должна всплыть в восьмом знаке. Если конечно эти операции её не уничтожат :)
 
bool GreaterDoubles(double number1,double number2,int dig) 




Вроде все случилось. Огромное спасибо.
 
:) бувай
Причина обращения: