Практический пример подключения индикатора из "MQL5 Market" в свои EA

Практический пример подключения индикатора из "MQL5 Market" в свои EA

12 мая 2025, 05:20
Mikhail Sergeev
0
17

Довольно часто пользователи спрашивают, как интегрировать индикатор, приобретённый на Маркете, в свои торговые советники. Пришло время предоставить простое надёжное и многофункциональное решение.

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


Это включаемый файл класса для подключения индикатора. Его нужно положить в папку "Include" вашего терминала.

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class i_FourAverage
{
public:
    //---
    int               Handle1;
    bool              FirstStart;
    //--- Буфферы подключаемого индикатора
    double Buffer1[];
    bool              Signal;
    //---
    bool              DownloadsIndicator(bool& recalculation, string symbol, ENUM_TIMEFRAMES timeframe, int shift,
                                         //----
                                         int preset,
                                         int periodFA = 32,
                                         int average_1 = 134,
                                         int average_2 = 47,
                                         int average_3 = 1,
                                         int average_4 = 45,
                                         int range = 50,
                                         //----
                                         int bars = 3);
    //---
    i_FourAverage()
    {
        FirstStart = true;
        Handle1 = -1;
    }
};
//+------------------------------------------------------------------+
//| Загрузка индикатора                                              |
//+------------------------------------------------------------------+
bool i_FourAverage::DownloadsIndicator(bool& recalculation, string symbol, ENUM_TIMEFRAMES timeframe, int shift,
                                       //----
                                       int preset,
                                       int periodFA = 32,
                                       int average_1 = 134,
                                       int average_2 = 47,
                                       int average_3 = 1,
                                       int average_4 = 45,
                                       int range = 50,
                                       //----
                                       int bars = 3)
{
    //---
    if(FirstStart)
    {
        //---

        //---
        Handle1 = iCustom(symbol, timeframe, "Market\\FourAverageMT5",
                          //----
                          preset,
                          "_",
                          periodFA,
                          average_1,
                          average_2,
                          average_3,
                          average_4,
                          range,
                          //---
                          0,
                          "_",
                          false,
                          0,
                          false,
                          0);

        //---
        FirstStart = false;
    }
    //---
    Signal = false;
    int shiftmulti = GetShiftMultiSymbol(symbol, timeframe, shift, false);
    if(shiftmulti == -1)
    {
        recalculation = true;
        return(false);
    }
    //--- Заполним массивы
    string name = "FourAverage";
    if(!FillArrayFromBuffer(Handle1, 0,  name, shiftmulti, bars, Buffer1, true)) return(false);
    //---
    //--- Удачное завершение рассчета
    recalculation = false;
    //---
    return(true);
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int GetShiftMultiSymbol(string symbol, ENUM_TIMEFRAMES timeframe, int shift = 1, bool no_search = false)
{
    if(Symbol() == symbol)
    {
        return(shift);
    }
    else
    {
        datetime time_bar1 = iTime(Symbol(), timeframe, shift);
        int shiftmulti = iBarShift(symbol, timeframe, time_bar1, no_search);
        return(shiftmulti);
    }
}

//+------------------------------------------------------------------+
//| Заполняем индикаторный буфер из индикатора                       |
//+------------------------------------------------------------------+
bool FillArrayFromBuffer
(
    int       indicator_handle,          // handle индикатора
    int       buffer_num,                // номер буфера индикатора
    string    name,                      // имя
    int       start_pos,                 // откуда начнем
    int       count,                     // сколько копируем
    double    &buffer[],                 // массив, куда будут скопированы данные
    bool      expand_and_revers = false  // увеличить размер и развернуть
)
{
    //--- сбросим код ошибки
    ResetLastError();
    //--- увеличим размер буфера
    if(expand_and_revers) ArrayResize(buffer, count);
    //--- заполняем часть массива значениями из индикаторного буфера под индексом 0
    if(CopyBuffer(indicator_handle, buffer_num, start_pos, count, buffer) < 0)
    {
        //Sleep(50);
        //for(int i = 0; i < 100; i++)
        //{
        //    if(BarsCalculated(indicator_handle) > 0) break;
        //    Sleep(50);
        //}
        //if(CopyBuffer(indicator_handle, buffer_num, start_pos, count, buffer) <= 0)
        //{
        //---
        string error = string(GetLastError());
        //--- если копирование не удалось, сообщим код ошибки
        PrintFormat(TextByLanguage("Не удалось скопировать данные из индикатора " + name + ", буффер № " + string(buffer_num) + ", код ошибки: " + error + ", старт: " + string(start_pos) + ", сколько: " + string(count),
                    "Failed to copy data from the indicator " + name + ", buffer № " + string(buffer_num) + " , error code: " + error + ", start pos: " + string(start_pos) + ", n: " + string(count)));
        //--- завершим с нулевым результатом - это означает, что индикатор будет считаться нерассчитанным
        return(false);
        //}
    }
    //--- развернём буфер
    if(expand_and_revers) ArrayReverse(buffer);
    //--- все получилось
    return(true);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
string TextByLanguage(string rus, string eng, string zh = " ", string pt = " ")
{
    if(TerminalInfoString(TERMINAL_LANGUAGE) == "Russian" && rus != " ") return(rus);
    else if(TerminalInfoString(TERMINAL_LANGUAGE) == "Chinese (Simplified)" && zh != " ") return(zh);
    else if(TerminalInfoString(TERMINAL_LANGUAGE) == "Chinese (Traditional)" && zh != " ") return(zh);
    else if(TerminalInfoString(TERMINAL_LANGUAGE) == "Portuguese (Brazil)" && pt != " ") return(pt);
    else if(TerminalInfoString(TERMINAL_LANGUAGE) == "Portuguese (Portugal)" && pt != " ") return(pt);
    else return(eng);
}

//+------------------------------------------------------------------+


Пример получение данных индикатора в эксперте.

#include <CFourAverage_iCustom.mqh>
static i_FourAverage ind_0;
//---
input int PeriodFA = 10;      // PeriodFA
input int Average_1 = 112;     // Average_1 
input int Average_2 = 148;    // Average_2 
input int Average_3 = 100;     // Average_3 
input int Average_4 = 146;    // Average_4 
input int Range = 31;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
//---

//---
    return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---

}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
    //---
    bool recalculate = false;
    string symbol = Symbol();  
    //---
    if(!ind_0.DownloadsIndicator(recalculate, symbol, PERIOD_CURRENT, 0,
                                 //----
                                 0,
                                 PeriodFA,
                                 Average_1,
                                 Average_2,
                                 Average_3,
                                 Average_4,
                                 Range,
                                 5)) return;
    //----
    if(ind_0.Buffer1[0] > 0) Print("BUY: FA = " + string(ind_0.Buffer1[0]));
    if(ind_0.Buffer1[0] < 0) Print("SELL: FA = " + string(ind_0.Buffer1[0]));
    // if(ind_0.Buffer1[1] > 0 && ind_0.Buffer1[2] < 0 ) Print("New Up trend");
}
//+------------------------------------------------------------------+



Дополнительные ресурсы и информация об индикаторе FourAverage

Скачать индикатор FourAverage