Особенности языка mql5, тонкости и приёмы работы - страница 335
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Высокопроизводительные функции работы со временем, действующие для всего диапазона дат и времени MQL5 (с 1 января 1970 года по 31 декабря 3000 года):
(На основе алгоритма преобразования календарей Нери–Шнайдера: здесь)
Прилагаемый файл скрипта содержит исходные коды и полные проверки.
Что такое ULL и U?
Эти беззнаковые делители (3600ULL, 86400ULL и т. д.) принудительно запускают беззнаковое деление и вычисление остатка по модулю, особенно когда числитель имеет тип datetime ( внутренне обрабатываемый как signed long 64).
Перед выполнением деления или вычисления модуля значение datetime будет преобразовано в ulong. Это обеспечивает более быструю оптимизацию со стороны компилятора.
Деление и вычисление остатка с знаком потребуют дополнительных инструкций для обработки знака.
Проверьте это на сайте https://godbolt.org/
Подписанные и неподписанные операции div/mod:
Результаты:
Stefano Cerbioni Expert Advisor is strictly bound to the chart it is running on. There is no native, event-driven way to detect when a user switches focus (clicks) between different chart tabs within the terminal unless the EA is present on every single chart.
[...]
Это событие должно:
срабатывать всякий раз, когда пользователь нажимает на вкладку другого графика в терминале.
быть доступным для любого советника, запущенного в терминале, независимо от того, к какому графику он физически привязан (или, по крайней мере, предоставлять глобальное свойство графика, доступное через OnChartEvent).
Это не совсем то, о чём вы просили, но вы можете использовать этот недокументированный параметр lparam CHARTEVENT_CHART_CHANGE для обнаружения переключения вкладок; однако он работает только при переключении между вкладками в режиме максимального развертывания (изменение размера окна), а не когда они расположены рядом.
Вы могли бы создать минималистичный индикатор на графике, который будет передавать пользовательское событие вашему советнику — это и станет вашим триггером «push».
Если вам нужны окна, расположенные рядом, то вы могли бы использовать CHARTEVENT_CLICK, но для этого либо понадобится дополнительный переключатель (bool) для включения/выключения события, либо оно будет срабатывать каждый раз, когда вы нажимаете на график.
Я согласен, что должен быть более удобный способ решения этой проблемы.
Подписанные и неподписанные операции div/mod:
Спасибо, это очень интересный нюанс, причины которого хотелось бы понять. Чтобы в будущем писать более оптимально в общем случае.
ЗЫ Увидел объяснение. Еще раз спасибо.
Альтернатива функции StructToTime() на языке MQL:
Замена функции TimeToStruct() в MQL:
Великолепная работа! Наверное, MQ стоит рассмотреть это решение для замены своих штатных функций.
Здесь ускорение имеет большое практическое значение - Тестер.
Как быстро инвертировать стратегию?
Просто меняешь
на
и по такой же логике меняешь Sell на Buy
математика элементарная, но не очевидная
Это не совсем то, о чём вы просили, но вы можете использовать этот недокументированный параметр lparam CHARTEVENT_CHART_CHANGE для обнаружения переключения вкладок; однако он работает только при переключении между вкладками в режиме максимального развертывания (изменение размера окна), а не когда они расположены рядом.
Вы могли бы создать минималистичный индикатор на графике, который будет передавать пользовательское событие вашему советнику — это и станет вашим триггером «push».
Если вам нужны окна, расположенные рядом, то вы могли бы использовать CHARTEVENT_CLICK, но для этого либо понадобится дополнительный переключатель (bool) для включения/выключения события, либо оно будет срабатывать каждый раз, когда вы нажимаете на график.
Я согласен, что должен быть более удобный способ решения этой проблемы.
Можно отслеживать в OnChartEvent, при нажатиях мыши, id активного графика.
Вы можете отслеживать идентификатор активного графика в методе `OnChartEvent` при нажатии кнопки мыши.
Это самая сложная часть, потому что всё зависит от того, как вы используете MT.
Если у вас один монитор и один график в максимальном размере, то всё просто — подойдут либо CHART_BRING_TO_TOP либо CHART_IS_MAXIMIZED.
Если у вас несколько мониторов, несколько окон графиков, расположенных рядом, или отдельные графики, то, вероятно, правильным решением будет отслеживание щелчков мышью и нажатий клавиш.
Было бы гораздо проще, если бы существовало свойство графика, указывающее, активно ли окно графика, или обработчик событий, как упоминал ранее Стефано.
Правка:
На самом деле, после краткого тестирования, CHART_BRING_TO_TOP похоже, выполняет функцию «активного окна», хотя название довольно неудачное и вводящее в заблуждение. Документация MQL5 явно нуждается в обновлении...
Отличная работа! Возможно, MQ стоит рассмотреть это решение в качестве замены своих стандартных функций.
Повышение производительности в данном случае имеет огромное практическое значение — Tester.
Я добавил эти функции в библиотеку TimeUtils (здесь: https://www.mql5.com/ru/code/53970).
Буду рад любым предложениям. Спасибо.