Как нарисовать несколько разноцветных линий на графике MQL5?

 

Доброго времени суток. 

Не получается создать индикатор, который бы отображал несколько разноцветных линий. Очень мало нашел примеров использований нескольких буферов indicator_color_index.

В общем с одной линией и соответственно одним indicator_color_index все получилось. С двумя и тремя все тоже получилось, но цвета удалось задать только статически и почему то индикатор никак не реагировал на изменение ширины линии через PlotIndexSetInteger(0, PLOT_LINE_WIDTH, 4);.

На форумах тоже ничего нашел, за исключением сообщения от 2018 года, где человек пытался создать используя 12 buffers и 6 plots, но не понял как буфер цвета связывается с буфером data. У меня собственно возник тот же вопрос вовремя разработки.

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

Файлы:
 
madyu42:

Доброго времени суток. 

Не получается создать индикатор, который бы отображал несколько разноцветных линий. Очень мало нашел примеров использований нескольких буферов 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;
  }
//+------------------------------------------------------------------


 
Ilya Filatov #:

У вас была проблема с нумерованием графических построений (PLOTs), вот рабочий вариант:



Спасибо огромное!!! Понял принцип работы на исправленном варианте! Честное слово, всю голову сломал! Спасибо еще раз!