- Дополнительная защита программ (MQL5 Protector) - Разработка программ
- Диспетчер задач - Для продвинутых пользователей - Начало работы
- Виртуальный хостинг для круглосуточной работы
Здравствуйте уважаемые трейдеры и профессионалы MQL. При компиляции старых программ обнаружилось, что возникают проблемы со сравнением вещественных чисел и что-то еще. Скажите пожалуйста кто-нибудь наблюдал проблемы при компилировании mql программ сделанных на более ранних версиях чем MT5 Build 1861? Как с этим бороться?
Правьте код под новые билды, список некоторых изменений здесь
- 2018.06.14
- www.mql5.com
Здравствуйте уважаемые трейдеры и профессионалы MQL. При компиляции старых программ обнаружилось, что возникают проблемы со сравнением вещественных чисел и что-то еще. Скажите пожалуйста кто-нибудь наблюдал проблемы при компилировании mql программ сделанных на более ранних версиях чем MT5 Build 1861? Как с этим бороться?
проблема со сравнением была всегда
- www.mql5.com
Я наткнулся на несовместимость гораздо более страшную, чем компиляция (с компиляцией хоть сразу видно, где ошибка). Код "молча" по-разному работает на билдах до и после 1860:
void OnStart() { datetime dt = (datetime)((ulong)TimeCurrent() / PeriodSeconds()) * PeriodSeconds(); int x = Bars(_Symbol, _Period, dt, dt); Print(x); }
На билдах до 1860 выведет 1, а на новых - 0.
Я наткнулся на несовместимость гораздо более страшную, чем компиляция (с компиляцией хоть сразу видно, где ошибка). Код "молча" по-разному работает на билдах до и после 1860:
На билдах до 1860 выведет 1, а на новых - 0.
Добрый день!
Спасибо за Ваше сообщение, проверим.
Я наткнулся на несовместимость гораздо более страшную, чем компиляция (с компиляцией хоть сразу видно, где ошибка). Код "молча" по-разному работает на билдах до и после 1860:
На билдах до 1860 выведет 1, а на новых - 0.
0- это как раз правильное значение исходя из логики документации. А в MT4, кстати, эта функция работает неправильно и выдает 1.
"Если указаны параметры start_time и stop_time, то функция возвращает количество баров в диапазоне дат. Если эти параметры не указаны, то функция возвращает общее количество баров."
А в Вашем случает start_time == stop_time, то есть временной диапазон нулевой. В нулевой диапазон не может поместиться один бар.
0- это как раз правильное значение исходя из логики документации. А в MT4, кстати, эта функция работает неправильно и выдает 1.
"Если указаны параметры start_time и stop_time, то функция возвращает количество баров в диапазоне дат. Если эти параметры не указаны, то функция возвращает общее количество баров."
А в Вашем случает start_time == stop_time, то есть временной диапазон нулевой. В нулевой диапазон не может поместиться один бар.
Это спорное утверждение. Когда начало и конец равны - получаем диапазон из одной временной точки. Или один отсчет у Вас ассоциируется с пустотой?
Если уж цитировать документацию, то вместе с наиболее важными фрагментами, типа этого:
При запросе количества баров в заданном диапазоне дат учитываются только те бары, чье время открытия попадает в этот диапазон.
Т.е. бар тоже идентифицируется одной точкой, а не интервалом. Получается, что бар с временем открытия, равным заданной точке, удовлетворяет условиям и должно возвращаться значение 1.
Кроме того, поскольку функции "унаследованы" от МТ4, они должны работать как в МТ4, или если есть доказательства ошибки, то она должна была бы исправляться не только в МТ5, но и в МТ4.
Я наткнулся на несовместимость гораздо более страшную, чем компиляция (с компиляцией хоть сразу видно, где ошибка). Код "молча" по-разному работает на билдах до и после 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()));
Это спорное утверждение. Когда начало и конец равны - получаем диапазон из одной временной точки. Или один отсчет у Вас ассоциируется с пустотой?
Если уж цитировать документацию, то вместе с наиболее важными фрагментами, типа этого:
Получается, что бар с временем открытия, равным заданной точке, удовлетворяет условиям и должно возвращаться значение 1.
Кроме того, поскольку функции введены для совместимости с МТ4, они должны работать как в МТ4, или если есть доказательства ошибки, то она должна была бы исправляться не только в МТ5, но и в МТ4.
Вдумайтесь в смысл фразы "диапазон дат". В Вашем случае диапазон дат=0. Бар - это не мгновение.
Простите, а зачем несколько раз приволдить типы, тогда как TimeCurrent() уже datetime
Можно без (ulong), но так нагляднее, имхо. Без (datetime) получим предупреждение компилятора.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования