Скачать MetaTrader 5

Неправильный 0,7

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Forex Trader
114299
Forex Trader  
Хотелось бы обратится к разработчикам.
Открываем на любой валюте (я пробовал на EURUSD) позицию в 0,7 лота и пишем советник, состоящий из следующего кода.
OrderSelect(0,SELECT_BY_POS);
   if ( OrderLots()>0.7 )
      Alert("BAD LOT!!!");
   if ( OrderLots()==0.7 )
      Alert("GOOD LOT");
   Comment(OrderLots());


Очевидно коде представлено, что если число, которое дает MT>0.7, то выдаст сообщение BAD LOT!!!, если =0,7 - GOOD LOT.
Присоединяем советник к графику, и что видим?
Не правильно - видим BAD LOT!!!
Такое замтно только на 0,7.

Forex Trader
114299
Forex Trader  
Многократно уже говорили о том, что нельзя просто так сравнивать числа с двойной точностью (типа double).
В Вашем случае произошло вот что. Когда Вы выставили 0.7 лота, в записи об ордере сохранилочь не 0.7, а целое число 70 (количество лотов, умноженное на 100). Это сделано для убыстрения (причём очень значительного) расчётов. Когда Вы вызываете функцию OrderLots, хранящееся в поле количества лотов число сначала делится на 100, а потом уже отдаётся Вам.
Особенности операций с плавающей точкой в процессоре Intel таковы, что после деления 70 на 100 получается число 0.7000000000000001.
Такие дела.
MetaQuotes Software Corp.
Модератор
189025
MetaQuotes Software Corp.  
Когда Вы вызываете функцию OrderLots, хранящееся в поле количества лотов число сначала делится на 100, а потом уже отдаётся Вам.

Похоже, что нам надо самостоятельно делать нормализацию до второго знака при выдаче OrderLots().
Forex Trader
114299
Forex Trader  
Похоже, что нам надо самостоятельно делать нормализацию до второго знака при выдаче OrderLots().
....и других параметров ордеров - было бы очень неплохо
Forex Trader
114299
Forex Trader  
Когда Вы вызываете функцию OrderLots, хранящееся в поле количества лотов число сначала делится на 100, а потом уже отдаётся Вам.

Похоже, что нам надо самостоятельно делать нормализацию до второго знака при выдаче OrderLots().


Наконец-то.
Желательно и во всех других случаях (Бид, Аск и пр).
И на сервере.
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий