MT5 Build 1861 проблемные вопросы

 
Здравствуйте уважаемые трейдеры и профессионалы MQL. При компиляции старых программ обнаружилось, что возникают проблемы со сравнением вещественных чисел и что-то еще. Скажите пожалуйста кто-нибудь наблюдал проблемы при компилировании mql программ сделанных на более ранних версиях чем MT5 Build 1861? Как с этим бороться?
 
Ekaterina Belova:
Здравствуйте уважаемые трейдеры и профессионалы MQL. При компиляции старых программ обнаружилось, что возникают проблемы со сравнением вещественных чисел и что-то еще. Скажите пожалуйста кто-нибудь наблюдал проблемы при компилировании mql программ сделанных на более ранних версиях чем MT5 Build 1861? Как с этим бороться?

Правьте код под новые билды, список некоторых изменений здесь

Новая версия платформы MetaTrader 5 build 1860: Функции для работы с барами в MQL5 и улучшения в тестере стратегий
Новая версия платформы MetaTrader 5 build 1860: Функции для работы с барами в MQL5 и улучшения в тестере стратегий
  • 2018.06.14
  • www.mql5.com
Новая версия платформы MetaTrader 5 build 1860: Функции для работы с барами в MQL5 и улучшения в тестере стратегий15 июня 2018 года будет опубликов...
 
Ekaterina Belova:
Здравствуйте уважаемые трейдеры и профессионалы MQL. При компиляции старых программ обнаружилось, что возникают проблемы со сравнением вещественных чисел и что-то еще. Скажите пожалуйста кто-нибудь наблюдал проблемы при компилировании mql программ сделанных на более ранних версиях чем MT5 Build 1861? Как с этим бороться?

проблема со сравнением была всегда



Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
  • www.mql5.com
Вещественные типы (или типы с плавающей точкой) представляют значения, имеющие дробную часть. В языке MQL5 есть два типа для чисел с плавающей точкой. Способ представления вещественных чисел в машинной памяти определен стандартом IEEE 754 и не зависит от платформ, операционных систем и языков программирования. Константы с плавающей точкой...
 

Я наткнулся на несовместимость гораздо более страшную, чем компиляция (с компиляцией хоть сразу видно, где ошибка). Код "молча" по-разному работает на билдах до и после 1860:

void OnStart()
{
  datetime dt = (datetime)((ulong)TimeCurrent() / PeriodSeconds()) * PeriodSeconds();
  int x = Bars(_Symbol, _Period, dt, dt);
  Print(x);
}

На билдах до 1860 выведет 1, а на новых - 0.

 
Stanislav Korotky:

Я наткнулся на несовместимость гораздо более страшную, чем компиляция (с компиляцией хоть сразу видно, где ошибка). Код "молча" по-разному работает на билдах до и после 1860:

На билдах до 1860 выведет 1, а на новых - 0.

Добрый день!

Спасибо за Ваше сообщение, проверим.

 
Stanislav Korotky:

Я наткнулся на несовместимость гораздо более страшную, чем компиляция (с компиляцией хоть сразу видно, где ошибка). Код "молча" по-разному работает на билдах до и после 1860:

На билдах до 1860 выведет 1, а на новых - 0.

0- это как раз правильное значение исходя из логики документации. А в MT4, кстати, эта функция работает неправильно и выдает 1.

"Если указаны параметры start_time и stop_time, то функция возвращает количество баров в диапазоне дат. Если эти параметры не указаны, то функция возвращает общее количество баров."

А в Вашем случает start_time == stop_time, то есть временной диапазон нулевой. В нулевой диапазон не может поместиться один бар.

 
Evgeny Chernyshev:

Добрый день!

Спасибо за Ваше сообщение, проверим.

А здесь еще не проверяли?

 
Nikolai Semko:

0- это как раз правильное значение исходя из логики документации. А в MT4, кстати, эта функция работает неправильно и выдает 1.

"Если указаны параметры start_time и stop_time, то функция возвращает количество баров в диапазоне дат. Если эти параметры не указаны, то функция возвращает общее количество баров."

А в Вашем случает start_time == stop_time, то есть временной диапазон нулевой. В нулевой диапазон не может поместиться один бар.

Это спорное утверждение. Когда начало и конец равны - получаем диапазон из одной временной точки. Или один отсчет у Вас ассоциируется с пустотой?

Если уж цитировать документацию, то вместе с наиболее важными фрагментами, типа этого:

При запросе количества баров в заданном диапазоне дат учитываются только те бары, чье время открытия попадает в этот диапазон.

Т.е. бар тоже идентифицируется одной точкой, а не интервалом. Получается, что бар с временем открытия, равным заданной точке, удовлетворяет условиям и должно возвращаться значение 1.

Кроме того, поскольку функции "унаследованы" от МТ4, они должны работать как в МТ4, или если есть доказательства ошибки, то она должна была бы исправляться не только в МТ5, но и в МТ4.

 
Stanislav Korotky:

Я наткнулся на несовместимость гораздо более страшную, чем компиляция (с компиляцией хоть сразу видно, где ошибка). Код "молча" по-разному работает на билдах до и после 1860:

На билдах до 1860 выведет 1, а на новых - 0.

Простите, а зачем несколько раз приводить типы, тогда как TimeCurrent() уже datetime

datetime dt = (datetime)((ulong)TimeCurrent() / PeriodSeconds()) * PeriodSeconds();

Возможно Вы хотели сделать так

datetime dt = datetime((ulong)TimeCurrent() / PeriodSeconds()) * PeriodSeconds()); ???

Добавлено

А ещё точнее так

datetime dt = datetime((ulong)TimeCurrent() / ulong(PeriodSeconds()) * PeriodSeconds()));
 
Stanislav Korotky:

Это спорное утверждение. Когда начало и конец равны - получаем диапазон из одной временной точки. Или один отсчет у Вас ассоциируется с пустотой?

Если уж цитировать документацию, то вместе с наиболее важными фрагментами, типа этого:

Получается, что бар с временем открытия, равным заданной точке, удовлетворяет условиям и должно возвращаться значение 1.

Кроме того, поскольку функции введены для совместимости с МТ4, они должны работать как в МТ4, или если есть доказательства ошибки, то она должна была бы исправляться не только в МТ5, но и в МТ4.

Вдумайтесь в смысл фразы "диапазон дат". В Вашем случае диапазон дат=0. Бар - это не мгновение.

 
prostotrader:

Простите, а зачем несколько раз приволдить типы, тогда как TimeCurrent() уже datetime

Можно без (ulong), но так нагляднее, имхо. Без (datetime) получим предупреждение компилятора.

Причина обращения: