Ставь лайки и следи за новостями
Поставь на него ссылку - пусть другие тоже оценят
Оцени его работу в терминале MetaTrader 5
Высокопроизводительная библиотека iTimeSeries - библиотека для MetaTrader 5
- Просмотров:
- 2588
- Рейтинг:
- Опубликован:
- 2017.05.25 12:43
- Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу
Одной из основных проблем с MQL5 до сих пор было удаление встроенных функций для работы с таймсериями. Несмотря на то, что такой подход расширил для программистов возможности разработки, он также замедлил работу из-за обязательного шага по созданию и удалению новых ячеек памяти каждый раз, когда требуется доступ к данным таймсерии.
... if(CopyTime(symbol,timeframe,time,1,checkcandle)==1) { ...
Рассмотрим популярный алгоритм iBarShift. Чтобы вернуть индекс бара по его дате и времени, сначала мы должны вызвать ::CopyTime(...), которая создает динамический массив, изменяет его размер, копирует данные, а затем удаляет это всё из памяти. Это не является проблемой для нескольких отдельных вызовов, но поскольку функции по работе с таймсериями обычно вызываются по много раз на нескольких разных таймфреймах, повышенные затраты памяти приводят к значительному замедлению работы программы. Представьте на мгновение перерасход потраченных впустую ресурсов, возникающий для выделения новых ячеек памяти каждый раз, когда программа вызывает этот тип метода при использовании данных таймсерий.
Чтобы ускорить дело, представленная библиотека реализует классы стандартной библиотеки CObject и CArrayObj, чтобы копировать массив данных один раз, а потом снова получать доступ в него из всех вызовов таймсерий по данному конкретному символу и периоду. Правда, это палка о двух концах, потому что фаза инициализации длится дольше, чем обычная имплементация. Однако все последующие вызовы получают доступ к данным примерно за 1/100 периода времени. В примере с iBarShift() этот новый алгоритм работает быстрее путем создания массива int[], который хранит переменную — индекс бара и затем обращается к ней с использованием time (приведенной к типу int) в качестве адреса массива. Другими словами, вы передаете time в качестве прямого адреса для получения доступа к данным.
Два важных предостережения:
Основная часть времени расходуется на этапе инициализации. Если вы не планируете многократного — более нескольких тысяч раз в течение формирования бара — доступа к данным таймсерий, вам следует рассмотреть альтернативные методы.
Объекты класса CiTimeSeries настроены на автоматическое обновление сохраненных данных, когда формируется новый бар. Установка этого параметра в режим "false" переведет объект в высокопроизводительный режим, позволяющий быстро выполнять вызовы с критически важных "горячих точек", но в ходе последующего цикла обслуживания требуется ручное обновление.
Пример:
#include <itimeseries_nicholishen.mqh> //--- глобальное объявление объекта iTimeSeries CiTimeSeries iBar; int OnInit() { //--- фаза инициализации iBar.Init( NULL, PERIOD_CURRENT, false // автообновление ); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- if(hot_path_operations) { // пример index = iBar.Shift(time); } else if(maintenance_path_operations) { iBar.Refresh(); } }
Кроме того, вы можете вызывать напрямую глобальные функции (как и в MQL4), без создания экземляра CiTimeSeries, но в первый раз время доступа будет медленным, потому что потребуется первая инициализация глобального объекта "на заднем плане" работы программы. С использованием библиотеки этот путь может быть еще медленнее, если вы вызываете только одну функцию таймсерий несколько раз. Однако есть определенное преимущество в производительности, когда ваш алгоритм требует вызова более чем нескольких тысяч итераций данных таймсерии по одному и тому же набору символа и периода.
Разработчик самого популярнго на сегодняшний день алгоритма iBarShift провел сравнительный тест "iBarShift", который вы можете найти здесь https://www.mql5.com/en/code/1864.
Поскольку на сегодняшний момент это самый точный и быстрый метод, я решил использовать его в качестве эталона для тестирования.
Итоговое время вычисления 100 000 прямых (глобальных) вызовов функций оказалось в 50 раз быстрее, чем для самого быстрого из методов, доступных в настоящее время. Вызов публичных методов после инициализации в "режиме производительности" быстрее в 100 раз.
Доступные публичные методы и глобальные функции:
Замечание: Глобальные функции — те же, что в MetaTrader 4 , т.е. iBarShift, iTime и т.д.
//--- инициализирует один символ и период; установить Auto-refresh в false для режима производительности bool Init(string symbol=NULL, ENUM_TIMEFRAMES period = PERIOD_CURRENT, const bool autoRefresh = true ); //--- инициализирует один символ и все периоды массива ENUM_TIMEFRAMES; установить Auto-refresh в false для режима производительности bool Init(string symbol, ENUM_TIMEFRAMES &period[], const bool autoRefresh = true );
//--- инициализирует все периоды bool InitAllPeriods ( string symbol = NULL, const bool autoRefresh=true);
//--- установить auto-refresh в false чтобы управлять обновлением данных вручную void AutoRefresh(const bool ref) { m_autoRefresh=ref; } bool AutoRefresh() const { return m_autoRefresh; }
//--- вызов обновления вручную; обновляет данные на всех инициализированных периодах bool Refresh();
CRatesArray *GetArrayObjPointer(string symbol, ENUM_TIMEFRAMES period);
- .Open = iOpen https://docs.mql4.com/series/iopen
- .High = iHigh https://docs.mql4.com/series/ihigh
- .Low = iLow https://docs.mql4.com/series/ilow
- .Close = iClose https://docs.mql4.com/series/iclose
- .Highest = iHighest https://docs.mql4.com/series/ihighest
- .Lowest = iLowest https://docs.mql4.com/series/ilowest
- .Volume = iVolume https://docs.mql4.com/series/ivolume
- .BarsTotal = iBars https://docs.mql4.com/series/ibars
- .Time = iTime https://docs.mql4.com/series/itime
- .Shift = iBarShift https://docs.mql4.com/series/ibarshift
Перевод с английского произведен MetaQuotes Ltd.
Оригинальная публикация: https://www.mql5.com/en/code/18305
Канал строится на основе стандартного отклонения цены закрытия
Vertical lineИндикатор рисует, а затем перемещает нарисованную вертикальную линию (OBJ_VLINE) на заданное время (часы и минуты).
Это версия ZeroLag MACD для MQL5.
Binary Options Simulated Trading Indicator for MT5Индикатор для симуляции торговли бинарными опционами в MetaTrader 5.