Что за глюки с приведением типов????

 
Ну как может быть такое:

вот в таком коде:

double NSL;
if (OrderType()==OP_BUY)  NSL=NormalizeDouble(sl_low -TrailingStop*Point,4);
if (OrderType()==OP_SELL) NSL=NormalizeDouble(sl_high+TrailingStop*Point,4);
                                
Print("StopLoss: ",DoubleToStr(OrderStopLoss(),8),", планируемый SL: ", DoubleToStr(NSL, 8));
                                 
if (OrderStopLoss()==NSL) Print("Значения равны"); else Print("Значения НЕ равны");

Выдает в логе:

13:59:20 2007.01.04 11:00 Watch_v3.1_ATC2007 GBPUSD,M15: StopLoss: 1.95910000, планируемый SL: 1.95910000

13:59:20 2007.01.04 11:00 Watch_v3.1_ATC2007 GBPUSD,M15: Значения НЕ равны

 
Это не глюки с приведением типов, а очередная попытка проверить на равенство переменные типа double.( поиск - Сравнение вещественных чисел)
 
deftvk:
Ну как может быть такое: вот в таком коде:
Поищите по форуму - Сравнение вещественных чисел.
 

OrderStopLoss() выдает ненормализованное значение. Наткнулся в аналогичной ситуации.

Вот такой код дает ошибку 1 - (ERR_NO_RESULT).

OrdSL = OrderStopLoss();
NewSL = NormalizeDouble(OrderOpenPrice()-SL*Point,Digits);
if(NewSL > OrdSL) OrderModify(OrderTicket(),OrderOpenPrice(),NewSL,0,0);

А такой код ошибки не дает.

OrdSL = NormalizeDouble(OrderStopLoss(),Digits);
NewSL = NormalizeDouble(OrderOpenPrice()-SL*Point,Digits);
if(NewSL > OrdSL) OrderModify(OrderTicket(),OrderOpenPrice(),NewSL,0,0);
А вся разница в нормализации OrderStopLoss. И if начинает работать как надо.
 
PSmith:

OrderStopLoss() выдает ненормализованное значение. Наткнулся в аналогичной ситуации.

Вот такой код дает ошибку 1 - (ERR_NO_RESULT).

OrdSL = OrderStopLoss();
NewSL = NormalizeDouble(OrderOpenPrice()-SL*Point,Digits);
if(NewSL > OrdSL) OrderModify(OrderTicket(),OrderOpenPrice(),NewSL,0,0);

А такой код ошибки не дает.

OrdSL = NormalizeDouble(OrderStopLoss(),Digits);
NewSL = NormalizeDouble(OrderOpenPrice()-SL*Point,Digits);
if(NewSL > OrdSL) OrderModify(OrderTicket(),OrderOpenPrice(),NewSL,0,0);
А вся разница в нормализации OrderStopLoss.
1. Это на тестере? История откуда?
2. Дело может быть в сравнении результата вычисления (OrderOpenPrice()-SL*Point), который не нормализован, с нормализованной ценой.
 

Ошибка вылезает только в тестере. Тестовая печать дает два одинаковых значения, а if(NewSL > OrdSL) говорит что есть разница и надо сменить стоп-лосс.

История из HC. хотя это тут при чем?

 
PSmith:

Ошибка вылезает только в тестере. Тестовая печать дает два одинаковых значения, а if(NewSL > OrdSL) говорит что есть разница и надо сменить стоп-лосс.

История из HC. хотя это тут при чем?

Попробуй вывести DoubleToStr( NewSL, 8 ) и DoubleToStr( OrderOpenPrice()-SL*Point, 8 ), может, станет понятно.
А история при том, что если он "левая", то может быть ненормализована. И, соответственно, параметры ордеров будут кривыми.
 

Я не стал долго разбираться просто теперь делаю всегда так

OpenPrice = NormalizeDouble(OrderOpenPrice(),Digits);
ClosePrice = NormalizeDouble(OrderClosePrice(),Digits);
OrdSL = NormalizeDouble(OrderStopLoss(),Digits);
OrdTP = NormalizeDouble(OrderTakeProfit(),Digits);
 
Renat:
Лучше всего сравнивать дельту после вычитания или делать сравнение на допустимую дельту. У нас в стандартной поставке в stdlib.mq4 есть специальная функция:

//+------------------------------------------------------------------+
//| right comparison of 2 doubles                                    |
//+------------------------------------------------------------------+
bool CompareDoubles(double number1,double number2)
  {
   if(NormalizeDouble(number1-number2,8)==0) return(true);
   else return(false);
  }


Вот нормально работающий выход.

Спасибо всем за участие.

 
deftvk:
Renat:
Лучше всего сравнивать дельту после вычитания или делать сравнение на допустимую дельту. У нас в стандартной поставке в stdlib.mq4 есть специальная функция:

//+------------------------------------------------------------------+
//| right comparison of 2 doubles                                    |
//+------------------------------------------------------------------+
bool CompareDoubles(double number1,double number2)
  {
   if(NormalizeDouble(number1-number2,8)==0) return(true);
   else return(false);
  }


Вот нормально работающий выход.

Спасибо всем за участие.

Не совсем понятно, а почему 8, а не 4? На всякий пожарный что ли? Или этот код предлагается в общем случае и не только для цен?
if(NormalizeDouble(number1-number2,8)
Поясните, пожалуйста!
 
Берем точность с запасом. Поскольку, наверное, нет ни одного инструмента с точностью больше 4-х знаков после точки, ИМХО, достаточно брать 6 знаков. При сравнениях на равенство я, например, беру точность Digits + 2, при этом стараюсь по возможности обходиться без подобных сравнений.
Причина обращения: