Смотри, как бесплатно скачать роботов
Ищи нас в Facebook!
Ставь лайки и следи за новостями
Интересный скрипт?
Поставь на него ссылку - пусть другие тоже оценят
Понравился скрипт?
Оцени его работу в терминале MetaTrader 5
Библиотеки

Высокопроизводительная библиотека iTimeSeries - библиотека для MetaTrader 5

Просмотров:
2530
Рейтинг:
(34)
Опубликован:
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.

AV Benchmark

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

New Benchmark

Итоговое время вычисления 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);

Перевод с английского произведен MetaQuotes Ltd.
Оригинальная публикация: https://www.mql5.com/en/code/18305

Standard Deviation Channel MT5 Standard Deviation Channel MT5

Канал строится на основе стандартного отклонения цены закрытия

Vertical line Vertical line

Индикатор рисует, а затем перемещает нарисованную вертикальную линию (OBJ_VLINE) на заданное время (часы и минуты).

Colored Zerolag MACD Colored Zerolag MACD

Это версия ZeroLag MACD для MQL5.

Binary Options Simulated Trading Indicator for MT5 Binary Options Simulated Trading Indicator for MT5

Индикатор для симуляции торговли бинарными опционами в MetaTrader 5.