Ошибка, связанная с точностью представления данных. Прошу разработчиков обратить внимание! - страница 2

 
Давайте все условия тестирования. По кусочкам восстанавливать картину сложно, поэтому нет смысла. Код, брокер, моделирование и так далее.
 
Брокер "Альпари", сервер Alpari-Classic 217.74.44.23, исторические котировки их же: http://databank.alpari.org/h_mt/m1_eurgbp.zip, моделирование: "каждый тик" ("Every tick (the most precise method based on all available least timeframes)"), период графика M1, участок кода, который имеет отношение к данной ситуации (весь код не дам):
if(NormalizeDouble(OrderTakeProfit(),Digits)<NormalizeDouble(PCL1+Spread,Digits) && NormalizeDouble(Bid,Digits)>=NormalizeDouble(PCL1+Spread+Point*MinDiff,Digits))
  {
   OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),NormalizeDouble(PCL1+Spread,Digits),0);
   return(0);
   }


(Проверка: если TakeProfit для короткой позиции "ниже", чем некоторый уровень PCL1+Spread, то TakeProfit переносится на этот уровень.)

В рассматриваемом примере последний раз TakeProfit был перенесен в 01:32 17.06.04 на уровень 0.6569; самый правый на рисунке бар - в 01:47 имеет Low=0.6567 (это Bid, Ask=0.6569).

 
Попробуйте вывести в Print данные о текущих ценах Ask, Bid и параметрах ордеров в этот момент времени.
 
Добрый день.
Еще один вопрос на эту же тему. Фрагмент программы:
if(OrderStopLoss()<Bid-Point*TrailingStop)
  {
   FileWrite(handle,TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS)+" Bid:"+Bid+" Ask:"+Ask+" OldSL:"+OrderStopLoss()+" NewSL:"+(Bid-Point*TrailingStop));
   FileFlush(handle);
   OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,CLR_NONE);
  }


В результате имеем:

13:51:46 2004.06.18 15:39  Proba1 EURUSD,M1: OrderModify error 1


В создаваемом нами файле имеем:

2004.06.18 15:39:24 Bid:1.20940000 Ask:1.20960000 OldSL:1.16140000 NewSL:1.20640000
2004.06.18 15:39:26 Bid:1.20940000 Ask:1.20960000 OldSL:1.20640000 NewSL:1.20640000
2004.06.18 15:39:31 Bid:1.20940000 Ask:1.20960000 OldSL:1.20640000 NewSL:1.20640000


Возникает вопрос: почему при равенстве OrderStopLoss() и Bid-Point*TrailingStop срабатывает условие "МЕНЬШЕ"? Можно предположить, что точность левой и правой части условия выше, чем Digits=4 знака после десятичной точки, но откуда берутся дополнительные дробные доли? OrderStopLoss() по идее должно иметь точность Digits=4, переменная TrailingStop - целое (int), предопределенная переменная Point должна иметь точность Digits=4 по определению. Исторические котировки нормализированы с точностью до 4-х знаков после десятичной точки. Кроме того, в файл записываются данные с точностью до 8-ми знаков после десятичной точки, мы можем видеть, что дробных частей, меньше чем 0.0001 нет.

P.S. При записи

NormalizeDouble(OrderStopLoss(),Digits)<NormalizeDouble(Bid-Point*TrailingStop,Digits)

вышеуказанной ошибки не возникает, если нормализовать только правую часть - возникает в половине случаев, если нормализовать каждое слагаемое

NormalizeDouble(Bid,Digits)-NormalizeDouble(Point*TrailingStop,Digits)

- возникает во всех случаях как и раньше. Напрашивается вывод - ошибки вносятся в процессе вычисления языком MQL?

 
- возникает во всех случаях как и раньше. Напрашивается вывод - ошибки вносятся в процессе вычисления языком MQL?

Вывод несколько другой - Вам нужно почитать про работу с вещественными числами. А начать нужно с основ представления вещественных чисел и погрешностей (причем к этим погрешностям ни C, ни C++, ни MQL4 никакого отношения не имеют).

Обсуждение по теме: "MQL4: Вопрос к мастерам MQL4. Опять про Double Compare."
Поиск: https://www.mql5.com/ru/search/?keyword=%D0%A1%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5+%D0%B2%D0%B5%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85
 
Спасибо, почитал. Но ответа на свой вопрос не получил: откуда берется погрешность? В ссылках описываются только предположения участников форума на этот счет и методы борьбы с этим.