Ставь лайки и следи за новостями
Поставь на него ссылку - пусть другие тоже оценят
Оцени его работу в терминале MetaTrader 5
- Просмотров:
- 4616
- Рейтинг:
- Опубликован:
- 2018.03.29 11:09
- Обновлен:
- 2021.04.10 13:31
-
Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу
Советники в MetaTrader 4 пропускают тики, пришедшие в во время любых пауз: выполнение торговых приказов, вычисления, ожидание и т.д. Такая потеря информации может привести к серьезному искажению заложенной логики в ТС. Особенно для ТС, где используется анализ Ask-цен, спред и т.д.
Например, стандартное написание MetaTrader 4 советника не позволяет гарантированно выяснить OHLC-Ask для текущего бара, даже если советник был запущен до начала его формирования.
Данная библиотека/инструментарий позволяет наделить любой советник информацией о прошедших тиках между соседними NewTick-событиями - вызовы OnTick(). Для этого нужно в начале исходника прописать следующую строку:
#include <fxsaber\HistoryTicks\HistoryTicks.mqh> // Библиотека доступа советников к прошедшим тикам
Пример
В качестве демонстрации описанной возможности приложен советник, из кода которого хорошо видна логика происходящего.
#property strict #include <fxsaber\HistoryTicks\HistoryTicks.mqh> // Библиотека доступа советников к прошедшим тикам #define TOSTRING(A) #A + " = " + (string)(A) + " " void OnTick() { static int Num = 0; // Распечатываем все тики, что пришли во время выполнения предыдущей OnTick for (int i = 0; i < ArraySize(LastTicks); i++) Print(TOSTRING(Num++) + TOSTRING(LastTicks[i].time) + TOSTRING(LastTicks[i].bid) + TOSTRING(LastTicks[i].ask)); Print(TOSTRING(ArraySize(HistoryTicks))); // Количество всего сохраненных тиков за время работы советника Sleep(10000); // Несмотря на длительную паузу, накопление тиков для следующей OnTick будет происходить }
В коде видно, что стали доступны два тиковых массива:
- HistoryTicks - все тики с момента запуска советника;
- LastTicks - все тики с момента последнего события NewTick.
Индикатор
Работа таких советников возможна только при условии, что будет запущен индикатор HistoryTicks. Иначе на каждом тике любой такой советник будет выдавать следующее предупреждение:
2018.03.26 00:05:14.924 HistoryTicks_Example EURGBP,M1: Run the HistoryTicks_EURGBP-indicator!!!
Этот приложенный индикатор и транслирует получаемые им тики во все советники своего символа. Индикатор следит за тем, чтобы не было запущено несколько его копий на одном и том же символе. Также при его удалении с графика сохраняет все накопленные тики в соответствующий файл песочницы терминала.
Использование
В итоге алгоритм работы с модифицированными строкой советниками следующий (на примере EURUSD):
- Запустить индикатор HistoryTicks на любом графике EURUSD;
- Запустить советники на любых графиках EURUSD.
Теперь на каждом вызове OnTick можно прогонять в цикле логику ТС через все тики (массив LastTicks), будучи уверенным в отсутствии пропусков, а так же в OnTick достучаться до любого тика (с момента запуска советника) через массив HistoryTicks.
Особенности
- Используется библиотека TypeToBytes;
- Модифицированные таким образом (одна строка) советники будут работать только на Реал/Демо-счетах;
- Чтобы советник работал в Тестере Стратегий, упомянутую строку нужно закомментировать;
- В исходниках есть кроссплатформенные функции (файл Data_String.mqh), которые позволяют помещать/извлекать любые данные в/из строки. Например, это дает возможность производить удобный обмен произвольными данным между любыми MQL-программами за счет string-параметра (sparam) пользовательских событий;
- Данная библиотека может служить ядром для написания MQL4-варианта функции CopyTicks, что вместе с другими решениями двигает код к еще большей кроссплатформенности;
- В MetaTrader 5 из-за штатного MQL-доступа к тиковой истории смысл в таком дополнительном функционале отсутствует (хоть предложенное LastTicks-решение и видится более удобным). Однако, представленный подход к обмену различными данными может быть актуален и для MetaTrader 5;
- Замер скорости показал, что подобные решения вызывают задержку в несколько микросекунд, редко давая всплески до нескольких единиц миллисекунд. Поэтому вопрос производительности предложенного инструментария остро не встает;
- Передача данных идет через нулевое пользовательское событие (id == CHARTEVENT_CUSTOM). При необходимости изменить номер события потребуется править исходник;
- Тики в соответствующих массивах расположены от более ранних/старых к более поздним/свежим. Последний тик - конец массива.
![VR Smart Grid Lite](https://c.mql5.com/i/code/expert.png)
Стратегия частичного усреднения и закрытия сети ордеров против тренда.
![NYBOT Index](https://c.mql5.com/i/code/indicator.png)
Формула расчета индикатора соответствует индексу NYBOT (New York Board of Trade). Это индекс доллара по корзине из шести тех валют, чьи страны образуют наибольший внешнеторговый оборот США.
![RenkoOneBuffer](https://c.mql5.com/i/code/indicator.png)
Индикатор RenkoOneBuffer позволяет отображать графики Ренко в подокне индикатора. Тип графиков Ренко показывает лишь движения цены, большие заданного (box size). Он помогает устранить шум и сосредоточиться на основных трендах.
![DeleteTradeArrows](https://c.mql5.com/i/code/indicator.png)
Удаляет с графика объекты-стрелки, которыми отмечаются сделки на графике. Утилита реализована в виде индикатора, который сам ничего не рисует.