Для СервисДеска Баг с цветовой настройкой в индикаторах

 

Код из справки, какой бы мы цвет не установили при запуске индикатора при смене периода графика цвет индикатора слетает на по умолчанию. Скорее всего это из за того что цвет берется из массива ColorOfDay а при смене периода происходит переинициализация индикатора. Я уже как то писал о том что в индикаторах невозможно сохранить данные при смене периодов. https://www.mql5.com/ru/forum/1111/page2247#comment_8221372

Считаю данное поведение не верным. При смене периода цвет должен оставаться тем который задал пользователь, а не программист...


#property indicator_separate_window 
#property indicator_buffers 5 
#property indicator_plots   1 
//---- plot ColorCandles 
#property indicator_label1  "ColorCandles" 
#property indicator_type1   DRAW_COLOR_CANDLES 
#property indicator_style1  STYLE_SOLID 
#property indicator_width1  1 
//--- indicator buffers 
double         OpenBuffer[]; 
double         HighBuffer[]; 
double         LowBuffer[]; 
double         CloseBuffer[]; 
double         ColorCandlesColors[]; 
color          ColorOfDay[6]={CLR_NONE,clrMediumSlateBlue, 
                              clrDarkGoldenrod,clrForestGreen,clrBlueViolet,clrRed}; 
//+------------------------------------------------------------------+ 
//| Custom indicator initialization function                         | 
//+------------------------------------------------------------------+ 
void OnInit() 
  { 
//--- indicator buffers mapping 
   SetIndexBuffer(0,OpenBuffer,INDICATOR_DATA); 
   SetIndexBuffer(1,HighBuffer,INDICATOR_DATA); 
   SetIndexBuffer(2,LowBuffer,INDICATOR_DATA); 
   SetIndexBuffer(3,CloseBuffer,INDICATOR_DATA); 
   SetIndexBuffer(4,ColorCandlesColors,INDICATOR_COLOR_INDEX); 
//--- set number of colors in color buffer 
   PlotIndexSetInteger(0,PLOT_COLOR_INDEXES,6); 
//--- set colors for color buffer 
   for(int i=1;i<6;i++) 
      PlotIndexSetInteger(0,PLOT_LINE_COLOR,i,ColorOfDay[i]); 
//--- set accuracy 
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits); 
   printf("We have %u colors of days",PlotIndexGetInteger(0,PLOT_COLOR_INDEXES)); 
//--- 
  } 
//+------------------------------------------------------------------+ 
//| 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 i; 
   MqlDateTime t; 
//---- 
   if(prev_calculated==0) i=0; 
   else i=prev_calculated-1; 
//---- 
   while(i<rates_total) 
     { 
      OpenBuffer[i]=open[i]; 
      HighBuffer[i]=high[i]; 
      LowBuffer[i]=low[i]; 
      CloseBuffer[i]=close[i]; 
      //--- set color for every candle 
      TimeToStruct(time[i],t); 
      ColorCandlesColors[i]=t.day_of_week; 
      //--- 
      i++; 
     } 
//--- return value of prev_calculated for next call 
   return(rates_total); 
  } 
//+------------------------------------------------------------------+
Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2018.07.29
  • www.mql5.com
Общее обсуждение: Ошибки, баги, вопросы
 
Вариантом решения может быть получение цвета из массива INDICATOR_COLOR_INDEX именно цвета а не индекса ..
 
А почему вам не подходит задание цвета при помощи #property indicator_colorN ?
 
Andrey Voytenko:
А почему вам не подходит задание цвета при помощи #property indicator_colorN ?

Чтобы это понять надо найти ВСЕ темы где этот вопрос так или иначе Владимиром обсуждался.

 
Andrey Voytenko:
А почему вам не подходит задание цвета при помощи #property indicator_colorN ?

Этот цвет потом не возможно вытащить для дальнейшего использования ...

 
Vladimir Pastushak:

Этот цвет потом не возможно вытащить для дальнейшего использования ...

А что мешает создать дополнительный буфер и хранить там цвет?!

 
Andrey Voytenko:

А что мешает создать дополнительный буфер и хранить там цвет?!

Цвет задается в настройках индикатора, если использовать дополнительный цветовой буфер то он хранит не сам цвет а индекс цвета. Цвет вытащить нельзя.

Если использовать буфер через плот тогда цвета индикатора слетают при смене периода графика.

В общем там баг с цветами...

 
Vladimir Pastushak:

Цвет задается в настройках индикатора, если использовать дополнительный цветовой буфер то он хранит не сам цвет а индекс цвета. Цвет вытащить нельзя.

Поясню, что я предлагаю:

1. Задаем цвета стандартным способом

#property indicator_color1  clrNONE,clrMediumSlateBlue,clrDarkGoldenrod,clrForestGreen,clrBlueViolet,clrRed

2. Добавляем еще одни буфер для хранения самого цвета а не его индекса.

double         ColorBuffer[];

Сохраняем цвета в массив для удобного использования

void OnInit(){

//...

 SetIndexBuffer(5,ColorBuffer,INDICATOR_DATA);

//...

for(int i=0;i<6;i++)
      ColorOfDay[i]=(color)PlotIndexGetInteger(0,PLOT_LINE_COLOR,i);

//...
}

А в основном цикле сохраняем цвет в наш ColorBuffer.


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[])

{

//...

while(i<rates_total)

{

//...

ColorIndexBuffer[i]=t.day_of_week;
ColorBuffer[i]=ColorOfDay[t.day_of_week];

//...

}

}

3. Осталось только обновить значение цвета в ColorBuffer при смене цвета пользователем. Это легко сделать через событие CHARTEVENT_CHART_CHANGE.

В итоге через CopyBuffer(handle, 5, ...) получите ваш цвет!

 
Vladimir Pastushak:

Если использовать буфер через плот тогда цвета индикатора слетают при смене периода графика.

В общем там баг с цветами...

В данном индикаторе цвета задаются в OnInit(), они и должны слетать. Бага не вижу.

 
Vladimir Pastushak:

Цвет задается в настройках индикатора, если использовать дополнительный цветовой буфер то он хранит не сам цвет а индекс цвета. Цвет вытащить нельзя.

Если использовать буфер через плот тогда цвета индикатора слетают при смене периода графика.

В общем там баг с цветами...

Давно уже решили бы свою нестандартную задачу с помощью раздела Глобальные переменные терминала.  Но можно продолжать упорствовать, конечно.

 
Rashid Umarov:

Давно уже решили бы свою нестандартную задачу с помощью раздела Глобальные переменные терминала.  Но можно продолжать упорствовать, конечно.

Вы считаете что так будет правильно ?