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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Vladimir Pastushak
91194
Vladimir Pastushak  

Код из справки, какой бы мы цвет не установили при запуске индикатора при смене периода графика цвет индикатора слетает на по умолчанию. Скорее всего это из за того что цвет берется из массива 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
Общее обсуждение: Ошибки, баги, вопросы
Vladimir Pastushak
91194
Vladimir Pastushak  
Вариантом решения может быть получение цвета из массива INDICATOR_COLOR_INDEX именно цвета а не индекса ..
Andrey Voytenko
30107
Andrey Voytenko  
А почему вам не подходит задание цвета при помощи #property indicator_colorN ?
Alexey Viktorov
25989
Alexey Viktorov  
Andrey Voytenko:
А почему вам не подходит задание цвета при помощи #property indicator_colorN ?

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

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

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

Andrey Voytenko
30107
Andrey Voytenko  
Vladimir Pastushak:

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

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

Vladimir Pastushak
91194
Vladimir Pastushak  
Andrey Voytenko:

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

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

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

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

Andrey Voytenko
30107
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, ...) получите ваш цвет!

Andrey Voytenko
30107
Andrey Voytenko  
Vladimir Pastushak:

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

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

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

Rashid Umarov
Админ
16668
Rashid Umarov  
Vladimir Pastushak:

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

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

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

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

Vladimir Pastushak
91194
Vladimir Pastushak  
Rashid Umarov:

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

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

12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий