Доброго времени суток.
Не получается создать индикатор, который бы отображал несколько разноцветных линий. Очень мало нашел примеров использований нескольких буферов indicator_color_index.
В общем с одной линией и соответственно одним indicator_color_index все получилось. С двумя и тремя все тоже получилось, но цвета удалось задать только статически и почему то индикатор никак не реагировал на изменение ширины линии через PlotIndexSetInteger(0, PLOT_LINE_WIDTH, 4);.
На форумах тоже ничего нашел, за исключением сообщения от 2018 года, где человек пытался создать используя 12 buffers и 6 plots, но не понял как буфер цвета связывается с буфером data. У меня собственно возник тот же вопрос вовремя разработки.
Прикрепил файл с неработающим индикатором. Если кто то пришлет исправленную версию или подскажет, как сделать так, чтоб заработало - буду благодарен
У вас была проблема с нумерованием графических построений (PLOTs), вот рабочий вариант:
//+------------------------------------------------------------------+ //| testmulticolor.mq5 | //| | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property link "https://www.mql5.com" #property version "1.00" #property indicator_chart_window #property indicator_buffers 6 #property indicator_plots 3 #property indicator_type1 DRAW_COLOR_LINE #property indicator_color1 clrRed, clrBlueViolet, clrAntiqueWhite #property indicator_type2 DRAW_COLOR_LINE #property indicator_color2 clrBlue, clrOrange, clrOrangeRed #property indicator_type3 DRAW_COLOR_LINE #property indicator_color3 clrGreen, clrGreenYellow, clrLime // ---- LINE 1 ---- double L1_Data[]; double L2_Data[]; double L3_Data[]; double L1_Color[]; double L2_Color[]; double L3_Color[]; input color L1_UserColor = clrBlue; // Третий цвет // ---- LINE 2 ---- input color L2_UserColor = clrYellow; // ---- LINE 3 ---- input color L3_UserColor = clrAqua; //------------------------------------------------------------- int OnInit() { // Линия 1 SetIndexBuffer(0, L1_Data, INDICATOR_DATA); SetIndexBuffer(1, L1_Color, INDICATOR_COLOR_INDEX); SetIndexBuffer(2, L2_Data, INDICATOR_DATA); SetIndexBuffer(3, L2_Color, INDICATOR_COLOR_INDEX); SetIndexBuffer(4, L3_Data, INDICATOR_DATA); SetIndexBuffer(5, L3_Color, INDICATOR_COLOR_INDEX); ArraySetAsSeries(L1_Data, true); ArraySetAsSeries(L1_Color, true); ArraySetAsSeries(L2_Data, true); ArraySetAsSeries(L2_Color, true); ArraySetAsSeries(L3_Data, true); ArraySetAsSeries(L3_Color, true); PlotIndexSetInteger(0, PLOT_DRAW_TYPE, DRAW_COLOR_LINE); PlotIndexSetInteger(0, PLOT_LINE_WIDTH, 2); PlotIndexSetInteger(0, PLOT_COLOR_INDEXES,3); PlotIndexSetInteger(0, PLOT_LINE_COLOR,0,clrBlueViolet); PlotIndexSetInteger(0, PLOT_LINE_COLOR,1,clrRed); PlotIndexSetInteger(0, PLOT_LINE_COLOR,2,L1_UserColor); // Линия 2 PlotIndexSetInteger(1, PLOT_DRAW_TYPE, DRAW_COLOR_LINE); PlotIndexSetInteger(1, PLOT_LINE_WIDTH, 2); PlotIndexSetInteger(1, PLOT_COLOR_INDEXES,3); PlotIndexSetInteger(1, PLOT_LINE_COLOR,0,clrAntiqueWhite); PlotIndexSetInteger(1, PLOT_LINE_COLOR,1,clrWhite); PlotIndexSetInteger(1, PLOT_LINE_COLOR,2,L2_UserColor); // Линия 3 PlotIndexSetInteger(2, PLOT_DRAW_TYPE, DRAW_COLOR_LINE); PlotIndexSetInteger(2, PLOT_LINE_WIDTH, 2); PlotIndexSetInteger(2,PLOT_COLOR_INDEXES,3); PlotIndexSetInteger(2,PLOT_LINE_COLOR,0,clrLime); PlotIndexSetInteger(2,PLOT_LINE_COLOR,1,clrAquamarine); PlotIndexSetInteger(2,PLOT_LINE_COLOR,2,L3_UserColor); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate(const int32_t rates_total, const int32_t 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 int32_t &spread[]) { ArraySetAsSeries(time, true); ArraySetAsSeries(open, true); ArraySetAsSeries(high, true); ArraySetAsSeries(low, true); ArraySetAsSeries(close, true); ArraySetAsSeries(tick_volume, true); ArraySetAsSeries(volume, true); ArraySetAsSeries(spread, true); for(int i = 0; i < rates_total; i++) { // ---------------- LINE 1 ---------------- L1_Data[i] = close[i]; if(i == 0) L1_Color[i] = 0; else if(close[i] > close[i-1]) L1_Color[i] = 0; else if(close[i] < close[i-1]) L1_Color[i] = 1; else L1_Color[i] = 2; // ---------------- LINE 2 ---------------- L2_Data[i] = high[i]; if(i == 0) L2_Color[i] = 0; else if(high[i] > high[i-1]) L2_Color[i] = 0; else if(high[i] < high[i-1]) L2_Color[i] = 1; else L2_Color[i] = 2; // ---------------- LINE 3 ---------------- L3_Data[i] = low[i]; if(i == 0) L3_Color[i] = 0; else if(low[i] < low[i-1]) L3_Color[i] = 0; else if(low[i] > low[i-1]) L3_Color[i] = 1; else L3_Color[i] = 2; } return rates_total; } //+------------------------------------------------------------------

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Доброго времени суток.
Не получается создать индикатор, который бы отображал несколько разноцветных линий. Очень мало нашел примеров использований нескольких буферов indicator_color_index.
В общем с одной линией и соответственно одним indicator_color_index все получилось. С двумя и тремя все тоже получилось, но цвета удалось задать только статически и почему то индикатор никак не реагировал на изменение ширины линии через PlotIndexSetInteger(0, PLOT_LINE_WIDTH, 4);.
На форумах тоже ничего нашел, за исключением сообщения от 2018 года, где человек пытался создать используя 12 buffers и 6 plots, но не понял как буфер цвета связывается с буфером data. У меня собственно возник тот же вопрос вовремя разработки.
Прикрепил файл с неработающим индикатором. Если кто то пришлет исправленную версию или подскажет, как сделать так, чтоб заработало - буду благодарен