Ну как может быть такое: вот в таком коде:
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 начинает работать как надо.
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.
2. Дело может быть в сравнении результата вычисления (OrderOpenPrice()-SL*Point), который не нормализован, с нормализованной ценой.
Ошибка вылезает только в тестере. Тестовая печать дает два одинаковых значения, а if(NewSL > OrdSL) говорит что есть разница и надо сменить стоп-лосс.
История из HC. хотя это тут при чем?
Ошибка вылезает только в тестере. Тестовая печать дает два одинаковых значения, а if(NewSL > OrdSL) говорит что есть разница и надо сменить стоп-лосс.
История из HC. хотя это тут при чем?
А история при том, что если он "левая", то может быть ненормализована. И, соответственно, параметры ордеров будут кривыми.
Я не стал долго разбираться просто теперь делаю всегда так
OpenPrice = NormalizeDouble(OrderOpenPrice(),Digits); ClosePrice = NormalizeDouble(OrderClosePrice(),Digits); OrdSL = NormalizeDouble(OrderStopLoss(),Digits); OrdTP = NormalizeDouble(OrderTakeProfit(),Digits);
Лучше всего сравнивать дельту после вычитания или делать сравнение на допустимую дельту. У нас в стандартной поставке в stdlib.mq4 есть специальная функция:
//+------------------------------------------------------------------+ //| right comparison of 2 doubles | //+------------------------------------------------------------------+ bool CompareDoubles(double number1,double number2) { if(NormalizeDouble(number1-number2,8)==0) return(true); else return(false); }
Вот нормально работающий выход.
Спасибо всем за участие.
Лучше всего сравнивать дельту после вычитания или делать сравнение на допустимую дельту. У нас в стандартной поставке в stdlib.mq4 есть специальная функция:
//+------------------------------------------------------------------+ //| right comparison of 2 doubles | //+------------------------------------------------------------------+ bool CompareDoubles(double number1,double number2) { if(NormalizeDouble(number1-number2,8)==0) return(true); else return(false); }
Вот нормально работающий выход.
Спасибо всем за участие.
if(NormalizeDouble(number1-number2,8)
Поясните, пожалуйста!
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
вот в таком коде:
Выдает в логе:
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: Значения НЕ равны