Перенос индикаторов из MQL4 в MQL5
Введение
Доброго дня, дорогие читатели!
В сегодняшней статье я предоставлю вам алгоритм переноса простейших ценовых расчетов с MQL4 на MQL5. С учетом отличий MQL5 от MQL4, добавлена библиотека функций mql4_2_mql5.mqh, которой мы научимся пользоваться после прочтения этой статьи.
1. Подготовка индикатора к переносу
В данной статье рассматривается перенос только индикаторных расчетов, если в индикаторе встречаются графические элементы или более сложные ценовые расчеты, то с ними будут возникать сложности.
Для начала нужно подготовить mql4-код для переноса. Рассмотрим, что для этого нужно сделать.
Открываем редактор MetaEditor 4 с необходимым индикатором, например, MACD, и начинаем редактировать входные параметры:
//---- indicator parameters extern int FastEMA=12; extern int SlowEMA=26; extern int SignalSMA=9; //---- indicator buffers double MacdBuffer[]; double SignalBuffer[];
нам нужно привести это всё к виду:
double &MacdBuffer[],double &SignalBuffer[],int FastEMA,int SlowEMA,int SignalSMA
Cначала в строчке идут буферы индикатора с добавлением символа & перед названием буфера, так как нам нужно передать ссылки на массив, в котором будут происходить все изменения, но не сам массив!!!
Далее входные параметры. В нашем mql4-индикаторе заменяем строчку:
int start()
на
int start(int rates_total, int prev_calculated, double &MacdBuffer[], double &SignalBuffer[], int FastEMA, int SlowEMA, int SignalSMA)
Как мы видим, добавились ещё 2 обязательных элемента:
int rates_total, int prev_calculated,
Дальнейшая часть представляет ранее сформированную нами строчку.
Теперь копируем весь блок до последнего символа.
//+------------------------------------------------------------------+ //| Moving Averages Convergence/Divergence | //+------------------------------------------------------------------+ int start(int rates_total ,int prev_calculated ,double &MacdBuffer[] ,double &SignalBuffer[] ,int FastEMA ,int SlowEMA ,int SignalSMA) { int limit; int counted_bars=IndicatorCounted(); //---- last counted bar will be recounted if(counted_bars>0) counted_bars--; limit=Bars-counted_bars; //---- macd counted in the 1-st buffer for(int i=0; i<limit; i++) MacdBuffer[i]=iMA(NULL,0,FastEMA,0,MODE_EMA,PRICE_CLOSE,i) -iMA(NULL,0,SlowEMA,0,MODE_EMA,PRICE_CLOSE,i); //---- signal line counted in the 2-nd buffer for(i=0; i<limit; i++) SignalBuffer[i]=iMAOnArray(MacdBuffer,Bars,SignalSMA,0,MODE_SMA,i); //---- done return(0); } //+------------------------------------------------------------------
2. Создание шаблона MQL5 для MQL4 программ
Теперь нам необходимо подготовить среду для нашего блока.
Для этого в редакторе MetaEditor 5 выбираем пункт меню "Создать...", далее выбираем "Пользовательский индикатор".
Входные параметры (рис.1) создаём согласно входным параметрам mql4-индикатора:
//---- indicator parameters extern int FastEMA=12; extern int SlowEMA=26; extern int SignalSMA=9;

Рисунок 1. Входные параметры индикатора MACD
Далее создаём индикаторные буферы (рис. 2) согласно записям о них в mql4-программе:
//---- indicator buffers double MacdBuffer[]; double SignalBuffer[];

Рисунок 2. Индикаторные буферы MACD
У нас сформировался шаблон для нашего нового индикатора.
В нем необходимо сделать модификации: добавить строчки выше входных параметров
#include <mql4_2_mql5.mqh> //--- input parameters
внести в функцию:
int OnInit()
строчку
InitMql4();и добавить в теле программы строку, которая отвечает за запуск среды для mql4 программ:
int bars=MQL4Run(rates_total,prev_calculated); // bars - количество баров, доступных mql4 программам
Как видим данная функция вернёт нам количество баров, доступных для MQL4 среды, также здесь появляется новая переменная
int CountedMQL4;
эта переменая является аналогом mql5-переменной
prev_calculated,
Переменная CountedMQL4 обьявлена в подключаемом файле и передаёт количество рассчитанных данных.
Далее вставляем наш обработанный блок mql4 в сформированный шаблон на mql5 после последнего символа.
Теперь нам необходимо запустить наш индикатор.
Для этого в теле программы нужно добавить строчку:
Start(bars,
CountedMQL4,
MacdBuffer,
SignalBuffer,
FastEMA,
SlowEMA,
SignalSMA);
Как видим, эта строчка передаст данные, необходимые для нашей mql4 программы, также ссылки на результирующие буферы, имена которых мы возьмём из нашего шаблона созданного в mql5.
Должно получиться вот так:
//+------------------------------------------------------------------+ //| MACD_MQ4.mq5 | //| Copyright 2010, MetaQuotes Software Corp. | //| http://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2010, MetaQuotes Software Corp." #property link "http://www.mql5.com" #property version "1.00" #property indicator_separate_window #property indicator_buffers 2 #property indicator_plots 2 //--- plot MacdBuffer #property indicator_label1 "MacdBuffer" #property indicator_type1 DRAW_LINE #property indicator_color1 Red #property indicator_style1 STYLE_SOLID #property indicator_width1 1 //--- plot SignalBuffer #property indicator_label2 "SignalBuffer" #property indicator_type2 DRAW_LINE #property indicator_color2 Red #property indicator_style2 STYLE_SOLID #property indicator_width2 1 //--- input parameters #include <mql4_2_mql5.mqh> input int FastEMA=12; input int SlowEMA=26; input int SignalSMA=9; //--- indicator buffers double MacdBuffer[]; double SignalBuffer[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping SetIndexBuffer(0,MacdBuffer,INDICATOR_DATA); SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA); //--- InitMql4(); //--- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const datetime& time[], const double& open[], const double& high[], const double& low[], const double& close[], const long& tick_volume[], const long& volume[], const int& spread[]) { //--- int bars=MQL4Run(rates_total,prev_calculated); // bars - количество баров доступных mql4 программам Start(bars, CountedMQL4, MacdBuffer, SignalBuffer, FastEMA, SlowEMA, SignalSMA);//--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+ //| Moving Averages Convergence/Divergence | //+------------------------------------------------------------------+ int Start(int rates_total, int prev_calculated, double &MacdBuffer[], double &SignalBuffer[], int FastEMA, int SlowEMA, int SignalSMA) { int limit; int counted_bars=IndicatorCounted(); //---- last counted bar will be recounted if(counted_bars>0) counted_bars--; limit=Bars-counted_bars; //---- macd counted in the 1-st buffer for(int i=0; i<limit; i++) MacdBuffer[i]=iMA(NULL,0,FastEMA,0,MODE_EMA,PRICE_CLOSE,i) -iMA(NULL,0,SlowEMA,0,MODE_EMA,PRICE_CLOSE,i); //---- signal line counted in the 2-nd buffer for(i=0; i<limit; i++) SignalBuffer[i]=iMAOnArray(MacdBuffer,Bars,SignalSMA,0,MODE_SMA,i); //---- done return(0); }
это только первая часть переноса, теперь приступаем к отладке индикатора.
3. Особенности работы с индикаторными буферами в MQL5
Так как многие предопределенные переменные языка MQL4 совпадают с именами предопределенных переменных в MQL5, необходимо совершить следующие замены в переносимом блоке MQL4:
| MQL4 |
MQL5 |
|---|---|
| IndicatorCounted() |
prev_calculated |
| Bars | rates_total |
| iMA( | iMAMql4( |
| iMAOnArray( | iMAOnArrayMql4( |
//+--------------------+------------------+ //| MQL4 | MQL5 | //+--------------------+------------------+ //|IndicatorCounted() | prev_calculated | //| Bars | rates_total | //| iMA( | iMAMql4( | //| iMAOnArray( | iMAOnArrayMql4( | //+--------------------+------------------+
По поводу особенностей организации хранения данных в MQL5 в справке к SetIndexBuffer() указано:
Примечание
После связывания динамический массив buffer[] будет иметь индексацию как в обычных массивах, даже если для связываемого массива будет предварительно установлена индексация как в таймсериях. Если необходимо изменить порядок доступа к элементам индикаторного массива, необходимо применить функцию ArraySetAsSeries() после связывания массива функцией SetIndexBuffer().
То есть первоначальная политика обращения к индикаторных буферам теперь соответствует работе с обычными массивами, поэтому всегда нужно ставить связку:
ArraySetAsSeries(MacdBuffer,true); ArraySetAsSeries(SignalBuffer,true);
В результате у нас получается вот такой код:
//+------------------------------------------------------------------+ //| MACD_MQL4.mq5 | //| Copyright 2010, MetaQuotes Software Corp. | //| http://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2010, MetaQuotes Software Corp." #property link "http://www.mql5.com" #property version "1.00" #property indicator_separate_window #property indicator_buffers 2 #property indicator_plots 2 //--- plot MacdBuffer #property indicator_label1 "MacdBuffer" #property indicator_type1 DRAW_LINE #property indicator_color1 Red #property indicator_style1 STYLE_SOLID #property indicator_width1 1 //--- plot SignalBuffer #property indicator_label2 "SignalBuffer" #property indicator_type2 DRAW_LINE #property indicator_color2 Red #property indicator_style2 STYLE_SOLID #property indicator_width2 1 #include <mql4_2_mql5.mqh> //--- input parameters input int FastEMA=12; input int SlowEMA=26; input int SignalSMA=9; //--- indicator buffers double MacdBuffer[]; double SignalBuffer[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping SetIndexBuffer(0,MacdBuffer,INDICATOR_DATA); SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA); //--- InitMql4(); //--- ArraySetAsSeries(MacdBuffer,true); ArraySetAsSeries(SignalBuffer,true); //--- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { //--- int bars=MQL4Run(rates_total,prev_calculated); // bars - количество баров, доступных mql4 программам Start(bars, CountedMQL4, MacdBuffer, SignalBuffer, FastEMA, SlowEMA, SignalSMA); //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+ //| Moving Averages Convergence/Divergence | //+------------------------------------------------------------------+ //+--------------------+------------------+ //| MQL4 | MQL5 | //+--------------------+------------------+ //|IndicatorCounted() | prev_calculated | //| Bars | rates_total | //| iMA( | iMAMql4( | //| iMAOnArray( | iMAOnArrayMql4( | //+--------------------+------------------+ int Start(int rates_total, int prev_calculated, double &MacdBuffer[], double &SignalBuffer[], int FastEMA, int SlowEMA, int SignalSMA) { int limit; int counted_bars=prev_calculated; //---- last counted bar will be recounted if(counted_bars>0) counted_bars--; limit=rates_total-counted_bars; //---- macd counted in the 1-st buffer for(int i=0; i<limit; i++) MacdBuffer[i]=iMAMql4(NULL,0,FastEMA,0,MODE_EMA,PRICE_CLOSE,i) -iMAMql4(NULL,0,SlowEMA,0,MODE_EMA,PRICE_CLOSE,i); //---- signal line counted in the 2-nd buffer for(int i=0; i<limit; i++) SignalBuffer[i]=iMAOnArrayMql4(MacdBuffer,rates_total,SignalSMA,0,MODE_SMA,i); //---- done return(0); } //+------------------------------------------------------------------+
Результат его выполнения приведен на рис. 3:

Рисунок 3. Сравнение индикатора MACD, переписанного с MQL4 и стандартного индикатора MACD в MQL5.
4. Пример перенесения индикатора Stochastic
Создадим в MetaEditor 5 новый шаблон для нашего индикатора (рис. 4-5):

Рисунок 4. Входные параметры

Рисунок 5. Буферы
В процессе отладки выяснилось, что необходимо перенести внутрь функции start некоторые расчеты из функции "OnInit" mql4 простым копированием:
int draw_begin1=KPeriod+Slowing; int draw_begin2=draw_begin1+DPeriod;Также необходи изменить количество буферов прорисовки, так как в нашей mql4 программе 2 буфера используется для внутренних расчетов и 2 - для отрисовки:
#property indicator_plots 2
И статус буферов, которые будет использовать наша mql4 программа для внутренних расчетов:
SetIndexBuffer(2,HighesBuffer,INDICATOR_CALCULATIONS); SetIndexBuffer(3,LowesBuffer,INDICATOR_CALCULATIONS);Проведем необходимые замены:
//+------------------------------------------------------------------+ //| Stochastic_MQL4.mq5 | //| Copyright 2010, MetaQuotes Software Corp. | //| http://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2010, MetaQuotes Software Corp." #property link "http://www.mql5.com" #property version "1.00" #property indicator_separate_window #property indicator_minimum 0 #property indicator_maximum 100 #property indicator_buffers 4 #property indicator_plots 2 //--- plot MainBuffer #property indicator_label1 "MainBuffer" #property indicator_type1 DRAW_LINE #property indicator_color1 Red #property indicator_style1 STYLE_SOLID #property indicator_width1 1 //--- plot SignalBuffer #property indicator_label2 "SignalBuffer" #property indicator_type2 DRAW_LINE #property indicator_color2 Red #property indicator_style2 STYLE_SOLID #property indicator_width2 1 #include <mql4_2_mql5.mqh> //--- input parameters input int Kperiod=14; input int Dperiod=5; input int Slowing=5; //--- indicator buffers double MainBuffer[]; double SignalBuffer[]; double HighesBuffer[]; double LowesBuffer[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping SetIndexBuffer(0,MainBuffer,INDICATOR_DATA); SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA); SetIndexBuffer(2,HighesBuffer,INDICATOR_CALCULATIONS); SetIndexBuffer(3,LowesBuffer,INDICATOR_CALCULATIONS); //--- InitMql4(); //--- ArraySetAsSeries(MainBuffer,true); ArraySetAsSeries(SignalBuffer,true); ArraySetAsSeries(HighesBuffer,true); ArraySetAsSeries(LowesBuffer,true); //--- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { //--- int bars=MQL4Run(rates_total,prev_calculated); // bars - количество баров, доступных mql4-программам start(bars, CountedMQL4, MainBuffer, SignalBuffer, HighesBuffer, LowesBuffer, Kperiod, Dperiod, Slowing); //--- return value of prev_calculated for next call return(rates_total); } //+--------------------+------------------+ //| MQL4 | MQL5 | //+--------------------+------------------+ //|IndicatorCounted() | prev_calculated | //| Bars | rates_total | //| iMA( | iMAMql4( | //| iMAOnArray( | iMAOnArrayMql4( | //+--------------------+------------------+ int start(int rates_total, int prev_calculated, double &MainBuffer[], double &SignalBuffer[], double &HighesBuffer[], double &LowesBuffer[], int KPeriod, int DPeriod, int Slowing) { int draw_begin1=KPeriod+Slowing; int draw_begin2=draw_begin1+DPeriod; int i,k; int counted_bars=prev_calculated; double price; //---- if(rates_total<=draw_begin2) return(0); //---- initial zero if(counted_bars<1) { for(i=1;i<=draw_begin1;i++) MainBuffer[rates_total-i]=0; for(i=1;i<=draw_begin2;i++) SignalBuffer[rates_total-i]=0; } //---- minimums counting i=rates_total-KPeriod; if(counted_bars>KPeriod) i=rates_total-counted_bars-1; while(i>=0) { double min=1000000; k=i+KPeriod-1; while(k>=i) { price=Low[k]; if(min>price) min=price; k--; } LowesBuffer[i]=min; i--; } //---- maximums counting i=rates_total-KPeriod; if(counted_bars>KPeriod) i=rates_total-counted_bars-1; while(i>=0) { double max=-1000000; k=i+KPeriod-1; while(k>=i) { price=High[k]; if(max<price) max=price; k--; } HighesBuffer[i]=max; i--; } //---- %K line i=rates_total-draw_begin1; if(counted_bars>draw_begin1) i=rates_total-counted_bars-1; while(i>=0) { double sumlow=0.0; double sumhigh=0.0; for(k=(i+Slowing-1);k>=i;k--) { sumlow+=Close[k]-LowesBuffer[k]; sumhigh+=HighesBuffer[k]-LowesBuffer[k]; } if(sumhigh==0.0) MainBuffer[i]=100.0; else MainBuffer[i]=sumlow/sumhigh*100; i--; } //---- last counted bar will be recounted if(counted_bars>0) counted_bars--; int limit=rates_total-counted_bars; //---- signal line is simple moving average for(i=0; i<limit; i++) SignalBuffer[i]=iMAOnArrayMql4(MainBuffer,rates_total,DPeriod,0,MODE_SMA,i); //---- return(0); } //+------------------------------------------------------------------+
В результате получили полноценный стохастик на MQL5 с ценовыми конструкциями MQL4.
Результат его работы представлен на рис. 6:

Рисунок 6. Сравнение индикатора Stochastic, переписанного с MQL4 и стандартного индикатора Stochastic в MQL5.
5. Пример перенесения индикатора RSI
Соберём информацию о нашем индикаторе://---- input parameters extern int RSIPeriod=14; //---- buffers double RSIBuffer[]; double PosBuffer[]; double NegBuffer[];
И создадим в MetaEditor 5 его шаблон (рис. 7-8).

Рисунок 7. Входной параметр индикатора RSI

Рисунок 8. Буферы индикатора RSI
Общее количество буферов - 3:
#property indicator_buffers 3
Количество буферов прорисовки равно одному:
#property indicator_plots 1
Задаем статус расчетных буферов:
SetIndexBuffer(1,PosBuffer,INDICATOR_CALCULATIONS); SetIndexBuffer(2,NegBuffer,INDICATOR_CALCULATIONS)
Cкомпонуем и проведем необходимые замены:
//+------------------------------------------------------------------+ //| RSI_MQL4.mq5 | //| Copyright 2010, MetaQuotes Software Corp. | //| http://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2010, MetaQuotes Software Corp." #property link "http://www.mql5.com" #property version "1.00" #property indicator_separate_window #property indicator_buffers 3 #property indicator_plots 1 //--- plot RSIBuffer #property indicator_label1 "RSIBuffer" #property indicator_type1 DRAW_LINE #property indicator_color1 Green #property indicator_style1 STYLE_SOLID #property indicator_width1 1 //--- plot PosBuffer #property indicator_label2 "PosBuffer" #property indicator_type2 DRAW_LINE #property indicator_color2 Red #property indicator_style2 STYLE_SOLID #property indicator_width2 1 //--- plot NegBuffer #property indicator_label3 "NegBuffer" #property indicator_type3 DRAW_LINE #property indicator_color3 Red #property indicator_style3 STYLE_SOLID #property indicator_width3 1 #include <mql4_2_mql5.mqh> //--- input parameters input int RSIPeriod=14; //--- indicator buffers double RSIBuffer[]; double PosBuffer[]; double NegBuffer[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping SetIndexBuffer(0,RSIBuffer,INDICATOR_DATA); SetIndexBuffer(1,PosBuffer,INDICATOR_CALCULATIONS); SetIndexBuffer(2,NegBuffer,INDICATOR_CALCULATIONS); //--- InitMql4(3); ArraySetAsSeries(RSIBuffer,true); ArraySetAsSeries(PosBuffer,true); ArraySetAsSeries(NegBuffer,true); return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { int bars=MQL4Run(rates_total,prev_calculated); // bars - количество баров, доступных mql4 программам RSImql4(bars, CountedMQL4, RSIBuffer, PosBuffer, NegBuffer, RSIPeriod); return(rates_total); } //+--------------------+------------------+ //| MQL4 | MQL5 | //+--------------------+------------------+ //|IndicatorCounted() | prev_calculated | //| Bars | rates_total | //| iMA( | iMAMql4( | //| iMAOnArray( | iMAOnArrayMql4( | //+--------------------+------------------+ int RSImql4(int rates_total, int prev_calculated, double &RSIBuffer[], double &PosBuffer[], double &NegBuffer[], int RSIPeriod) { int i,counted_bars=prev_calculated; double rel,negative,positive; //----fd if(rates_total<=RSIPeriod) return(0); //---- initial zero if(counted_bars<1) for(i=1;i<=RSIPeriod;i++) RSIBuffer[rates_total-i]=0.0; //---- i=rates_total-RSIPeriod-1; if(counted_bars>=RSIPeriod) i=rates_total-counted_bars-1; while(i>=0) { double sumn=0.0,sump=0.0; if(i==rates_total-RSIPeriod-1) { int k=rates_total-2; //---- initial accumulation while(k>=i) { rel=Close[k]-Close[k+1]; if(rel>0) sump+=rel; else sumn-=rel; k--; } positive=sump/RSIPeriod; negative=sumn/RSIPeriod; } else { //---- smoothed moving average rel=Close[i]-Close[i+1]; if(rel>0) sump=rel; else sumn=-rel; positive=(PosBuffer[i+1]*(RSIPeriod-1)+sump)/RSIPeriod; negative=(NegBuffer[i+1]*(RSIPeriod-1)+sumn)/RSIPeriod; } PosBuffer[i]=positive; NegBuffer[i]=negative; if(negative==0.0) RSIBuffer[i]=0.0; else RSIBuffer[i]=100.0-100.0/(1+positive/negative); i--; } //---- return(0); } //+------------------------------------------------------------------+
Здесь, в отличие от предыдущего индикатора, заменили название: теперь вместо привычной функции int Start() в MQL4
int start()
{
в MQL5 мы используем
int RSImql4(
Переименованы как имя самой функции, так и строка, вызывающая ее, в теле MQL5-программы.
Результат работы библиотечки приведен на рис. 9.

Рисунок 9. Сравнение индикатора RSIc, переписанного с MQL4 и стандартного индикатора RSI в MQL5.
6. Установка
Для установки данного модуля необходимо поместить файл mql4_2_mql5.mqh в папку MQL5\Include\.
Тестовые файлы поместить в папку MQL5\Indicators.
7. Дополнение
При желании можно расширить функционал модуля путем подключения библиотеки из статьи Переход с MQL4 на MQL5. Добавьте файл InitMQL4.mqh из этой статьи в каталог MQL5\Include и следующие строчки перед входными параметрами:
#include <InitMQL4.mqh>
Cо списком необходимых замен вы можете ознакомится в статье Переход с MQL4 на MQL5.
Заключение
В данной статье представлен алгоритм переноса простейших ценовых конструкций из MQL4 в среду MQL5 с использованием специальной библиотеки mql4_2_mql5.mqh.
В процессе отладки могут возникнуть мелкие трудности, но для людей, знакомых с MQL4, исправить эти проблемы не составит особого труда.
Учитывая особенности доступа к данным в среде MQL5, пересчет индикаторов может занять некоторое время, поскольку приходится создавать и пересчитывать необходимые данные для программ из среды MQL4. Для полноценного переноса индикатора в среду MQL5 его стоит переписать с учетом особенностей хранения и доступа к данным среды MQL5.
Post Scriptum
Прошу обратить внимание на фразу: "Учитывая особенности доступа к данным в среде mql5 пересчет индикаторов
может занять некоторое время, поскольку приходиться создавать и
пересчитывать необходимые данные для программ из среды mql4.". Иногда такое ожидание может занять до нескольких секунд (см. рис. 10-11):

Рисунок 10. Данные не просчитались Рисунок 11. Данные доступны
Это связано с особенностью терминала MetaTrader 5, которая проявляется в том, что при создании хендла индикатора в кеше терминала создается расчетная часть только в одном экземпляре. Если такого индикатора в кеше терминала еще нет (с такими входными параметрами), вызов
iMA(Symb,TimFram,iMAPeriod,ma_shift,ma_method,applied_price);
создает
индикатор скользящей средней, и только один раз. В следующий раз, при попытке создания уже существующего индикатора, терминал
просто выдаст его хендл.
Соответственно, расчет индикатора будет произведен только один раз, и не сразу после того, как создан хендл индикатора.
Предупреждение: все права на данные материалы принадлежат MetaQuotes Ltd. Полная или частичная перепечатка запрещена.
Данная статья написана пользователем сайта и отражает его личную точку зрения. Компания MetaQuotes Ltd не несет ответственности за достоверность представленной информации, а также за возможные последствия использования описанных решений, стратегий или рекомендаций.
Оптимальный метод подсчета объема совокупной позиции по заданному магическому номеру
Как написать индикатор на основе другого индикатора
Конкурс советников внутри советника
Исследование быстродействия скользящих средних в MQL5
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Видимо опечатка:
int CountedMQL4;
эта переменая является аналогом mql4-переменной
prev_calculated,
Следует читать аналогом mql5-переменной
К сожалению, скачанные примеры не работают (я думал, что делаю что-то не так, поэтому просто скачал все примеры). Индикатор выдает пустое окно.
Вы можете это esay Zigzag это есть mql4 может Covert к mt5?
он Зигзаг показывает следующий высокий ТФ например он График H4 Tf но показывает Зигзаг Daily слева h4
файл Sorce Attachemt

Спасибо