Ошибка в работе оператора if при сравнении чисел типа double

 

Билд 211


есть такая конструкция в функции тралла

RefreshRates();

if (Ask<Target[0] && OrderStopLoss()>Start)

{
Print("Ask",DoubleToStr(Ask,8), " Target[0]",DoubleToStr(Target[0],8)," SL=",DoubleToStr(OrderStopLoss(),8)," Stop=",DoubleToStr(Start,8), " OrdersTotal=",OrdersTotal());
OrderModify(OrderTicket(),OrderOpenPrice(),Start,OrderTakeProfit(),0,Gold);
}

в журналах получаю


11:53:53 2007.02.28 08:06 _PR_v01 GBPUSD,H4: Ask1.95910000 Target[0]1.95920000 SL=1.96780000 Stop=1.96280000 OrdersTotal=2
11:53:53 2007.02.28 08:06 _PR_v01 GBPUSD,H4: modify #6 sell 0.10 GBPUSD at 1.9628 sl: 1.9628 tp: 1.9462 ok
11:53:53 2007.02.28 08:06 _PR_v01 GBPUSD,H4: Ask1.95910000 Target[0]1.95920000 SL=1.96780000 Stop=1.96280000 OrdersTotal=2
11:53:53 2007.02.28 08:06 _PR_v01 GBPUSD,H4: modify #5 sell 0.20 GBPUSD at 1.9628 sl: 1.9628 tp: 1.9542 ok
11:53:53 2007.02.28 08:06 _PR_v01 GBPUSD,H4: Ask1.95910000 Target[0]1.95920000 SL=1.96280000 Stop=1.96280000 OrdersTotal=2
11:53:53 2007.02.28 08:06 _PR_v01 GBPUSD,H4: OrderModify error 1
11:53:53 2007.02.28 08:06 _PR_v01 GBPUSD,H4: Ask1.95910000 Target[0]1.95920000 SL=1.96280000 Stop=1.96280000 OrdersTotal=2
11:53:53 2007.02.28 08:06 _PR_v01 GBPUSD,H4: OrderModify error 1

.....


тоесть получается что 1.96280000>1.96280000


PS . код как код MQL не получается с новым редактором форума вставить из IE 6.0

 

В документации явно написано что ВСЕ цены должны быть нормализованы до Digit для данного инструмента. Видимо причина в этом, проверьте значения Target[0] и Start.

 
По идее есть минимальное допустимое изменение цены, называемое Point. Поэтому логично проверять есть ли между старым значением Stop Loss и новый значением Stop Loss разница более чем в один пункт.
 
Сравнение вещественных чисел - Поиск по MQL4.community - ссылка давно должна быть в FAQ.
 
Изучаем содержимое \experts\libraries\stdlib.mq4
 
KimIV:
Изучаем содержимое \experts\libraries\stdlib.mq4
right comparison of 2 doubles?
 
Rosh:
По идее есть минимальное допустимое изменение цены, называемое Point. Поэтому логично проверять есть ли между старым значением Stop Loss и новый значением Stop Loss разница более чем в один пункт.


Сам то так и делаю ... не просек ситуацию :-) В Вашем случае так будет вернее :

if (Target[0]-Ask>Point && OrderStopLoss()-Start>Point)
 
Cronex:

В документации явно написано что ВСЕ цены должны быть нормализованы до Digit для данного инструмента. Видимо причина в этом, проверьте значения Target[0] и Start.


Вообще то для данного инструмента GBPUSD количество знаков (значимых после запятой равно 4)

я специально вывел все 8 символов чтобы показать что посление 4 у всех переменных равны 0


хорошо

тип double

...Точность обеспечивается не более, чем 15 значащими цифрами.

взял да и умножил числа на 100000000


получился код

if (Ask<Target[0] && OrderStopLoss()>Start)
{
Print("Ask",DoubleToStr(Ask*100000000,8), " Target[0]",DoubleToStr(Target[0]*100000000,8)," SL=",DoubleToStr(OrderStopLoss()*100000000,8),

" Stop=",DoubleToStr(Start*100000000,8), " OrdersTotal=",OrdersTotal());
OrderModify(OrderTicket(),OrderOpenPrice(),Start,OrderTakeProfit(),0,Gold);
}


ну и лог соответственно


13:20:47 2007.02.28 08:06 _PR_v01 GBPUSD,H4: Ask195910000.00000000 Target[0]195920000.00000000 SL=196780000.00000000 Stop=196280000.00000000 OrdersTotal=2
13:20:47 2007.02.28 08:06 _PR_v01 GBPUSD,H4: modify #6 sell 0.10 GBPUSD at 1.9628 sl: 1.9628 tp: 1.9462 ok
13:20:47 2007.02.28 08:06 _PR_v01 GBPUSD,H4: Ask195910000.00000000 Target[0]195920000.00000000 SL=196780000.00000000 Stop=196280000.00000000 OrdersTotal=2
13:20:47 2007.02.28 08:06 _PR_v01 GBPUSD,H4: modify #5 sell 0.20 GBPUSD at 1.9628 sl: 1.9628 tp: 1.9542 ok
13:20:47 2007.02.28 08:06 _PR_v01 GBPUSD,H4: Ask195910000.00000000 Target[0]195920000.00000000 SL=196280000.00000000 Stop=196280000.00000000 OrdersTotal=2
13:20:47 2007.02.28 08:06 _PR_v01 GBPUSD,H4: OrderModify error 1
13:20:47 2007.02.28 08:06 _PR_v01 GBPUSD,H4: Ask195910000.00000000 Target[0]195920000.00000000 SL=196280000.00000000 Stop=196280000.00000000 OrdersTotal=2
13:20:47 2007.02.28 08:06 _PR_v01 GBPUSD,H4: OrderModify error 1


так что фактически они нормализованы для данного инструмента (без функции NormalizeDouble)

 
komposter:
KimIV:
Изучаем содержимое \experts\libraries\stdlib.mq4
right comparison of 2 doubles?

 
Вообще бы неплохо получить комментарии к моему последнему посту о умножении на 100000000 и о результатах всего этого
 
olyakish:
Вообще бы неплохо получить комментарии к моему последнему посту о умножении на 100000000 и о результатах всего этого
Комментариев было столько, что добавить больше нечего...
Причина обращения: