

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
Файлы: