Подскажите как правильно динамически описать две цветные гистограммы

 

Здравствуйте. Знающие люди, помогите пожалуйса. Когда я описываю две цветные гистограммы в препроцессоре всё работает замечательно. Но как только я попытался сделать тоже самое динамически, то после описания первой гистограммы все последующие графики ломаются. Начиная с того что у них не изменяются названия и сами они не отображаются. В чём у меня ошибка?

вот пример того как я описываю первую гистограмму после чего всё и ломается

   SetIndexBuffer(1,buf1,INDICATOR_DATA);
   SetIndexBuffer(2,ColorBuf1,INDICATOR_COLOR_INDEX);
   PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_COLOR_HISTOGRAM);
   PlotIndexSetInteger(1,PLOT_LINE_STYLE,STYLE_SOLID);
   PlotIndexSetInteger(1,PLOT_LINE_WIDTH,3);   
   PlotIndexSetInteger(1,PLOT_COLOR_INDEXES,2);
   PlotIndexSetInteger(1,PLOT_LINE_COLOR,0,clrBlue);
   PlotIndexSetInteger(1,PLOT_LINE_COLOR,1,clrGreen);
   PlotIndexSetString(1,PLOT_LABEL,"buf1");

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

ошибка

Файлы:
TestDCH.mq5  6 kb
 

У Вас не заполнены буферы цветов.

bufMax[i] = 50;
buf1[i] = 20;
ColorBuf1[i] = 0;
buf2[i] = -50;
ColorBuf2[i] = 0;
 
Sergey Savinkin:

У Вас не заполнены буферы цветов.

Тип double всегда чемто заполнен, хотя и не факт что это 0. В данном случае это ни как не влияет на то что у второго графика не присвоился Label. У меня все другие графики тоже не работают, которые инициализируются после первой цветной гистограммы.
 
Aleksu:
Тип double всегда чемто заполнен, хотя и не факт что это 0. В данном случае это ни как не влияет на то что у второго графика не присвоился Label. У меня все другие графики тоже не работают, которые инициализируются после первой цветной гистограммы.

Если вы всё знаете и пытаетесь опровергнуть совет данный вам, зачем-же задавали вопрос?

Как вы думаете каким цветом будет выведен индикатор после такого кода

   PlotIndexSetInteger(1,PLOT_LINE_COLOR,0,clrBlue);
   PlotIndexSetInteger(1,PLOT_LINE_COLOR,1,clrGreen);
 
Alexey Viktorov:

Если вы всё знаете и пытаетесь опровергнуть совет данный вам, зачем-же задавали вопрос?

Как вы думаете каким цветом будет выведен индикатор после такого кода

С большей вероятностью, что синий, но пока элементы ColorBuf1 не инициализованны сказать точно нельзя, разные системы могут по разному это делать. Вот у меня в примере на картинке это синий, тоесть массив цветов ColorBuf1 был заполнен нулями. Повторюсь, проблема не в том что я как-то не так заполняю массив и график не отображается, проблема в том, что после первого описания цветной гистограммы (скорее всего я что-то не добавил в описание), все последующие графики не отображаются и у всех Label такой же как название индикатора а не то который я указываю.
 

Всем огромное спасибо, я разобрался в чём проблема.

Буфера индексируются отдельно а графики отдельно. Тоесть я присваивал значение следующим за моим графиком а нужно вот так

   SetIndexBuffer(1,buf1,INDICATOR_DATA);
   SetIndexBuffer(2,ColorBuf1,INDICATOR_COLOR_INDEX);
   PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_COLOR_HISTOGRAM);
   PlotIndexSetInteger(1,PLOT_LINE_STYLE,STYLE_SOLID);
   PlotIndexSetInteger(1,PLOT_LINE_WIDTH,3);   
   PlotIndexSetInteger(1,PLOT_COLOR_INDEXES,2);
   PlotIndexSetInteger(1,PLOT_LINE_COLOR,0,clrBlue);
   PlotIndexSetInteger(1,PLOT_LINE_COLOR,1,clrGreen);
   PlotIndexSetString(1,PLOT_LABEL,"buf1");
   
   SetIndexBuffer(3,buf2,INDICATOR_DATA);
   SetIndexBuffer(4,ColorBuf2,INDICATOR_COLOR_INDEX);
   PlotIndexSetInteger(2,PLOT_DRAW_TYPE,DRAW_COLOR_HISTOGRAM);
   PlotIndexSetInteger(2,PLOT_LINE_STYLE,STYLE_SOLID);
   PlotIndexSetInteger(2,PLOT_LINE_WIDTH,3);
   PlotIndexSetString(2,PLOT_LABEL,"buf2");
   PlotIndexSetInteger(2,PLOT_COLOR_INDEXES,2);
   PlotIndexSetInteger(2,PLOT_LINE_COLOR,0,clrGreen);
   PlotIndexSetInteger(2,PLOT_LINE_COLOR,1,clrBlue);
 
Aleksu:
С большей вероятностью, что синий, но

Без всяких НО цвет будет зелёный.

Сначала присваивается цвет Blue а затем Green отсюда и вопрос вырос... зачем-же назначать сначала синий, если потом в следующей строке его перекрашивать...

Ещё вопрос: Где нулевой буфер индикатора? Без него обходитесь?

В общем, судя по этим кускам кода которые представлены в ваших сообщениях, вы даже не пытаетесь разобраться что для чего и как правильно сделать... Видимо что-то случайно работает почти правильно и это вы считаете решением вопроса.

 
Alexey Viktorov:

Без всяких НО цвет будет зелёный.

Сначала присваивается цвет Blue а затем Green отсюда и вопрос вырос... зачем-же назначать сначала синий, если потом в следующей строке его перекрашивать...

Ещё вопрос: Где нулевой буфер индикатора? Без него обходитесь?

В общем, судя по этим кускам кода которые представлены в ваших сообщениях, вы даже не пытаетесь разобраться что для чего и как правильно сделать... Видимо что-то случайно работает почти правильно и это вы считаете решением вопроса.

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

PlotIndexSetInteger(1,PLOT_COLOR_INDEXES,3); //обьявляем что у нас в буфере индексев цветов ColorBuf1 будет 3 цвета
PlotIndexSetInteger(1,PLOT_LINE_COLOR,0,clrBlue); //под 0 индексом голубой
PlotIndexSetInteger(1,PLOT_LINE_COLOR,1,clrGreen);//под 1 индексом зеленый
PlotIndexSetInteger(1,PLOT_LINE_COLOR,2,clrRed);  //под 2 индексом красный

//это тоже самое что и препроцессорное

#property indicator_color2  Blue, Green, Red

Эти 4 строчки не присваивают цвет графику, а описывают, какому конкретному индексу в цветовом массиве ColorBuf1, соответствует, тот или иной цвет.

//4 строчки выше говорять о том что, если я вствлю 0 в ColorBuf1
ColorBuf1[i] = 0; //это голубой
//а если вставлю 1
ColorBuf1[i] = 1; //это зеленый
//а если вставлю 2
ColorBuf1[i] = 2; //это красный
З.Ы простите за правки но с этими дурацкими индексами можно посидеть
 
Ну я и писал, что ColorBuf1[i] не было в первоначальном коде. С его появлением у меня индикатор заработал. И даже названия линий появились.
 
Sergey Savinkin:
Ну я и писал, что ColorBuf1[i] не было в первоначальном коде. С его появлением у меня индикатор заработал. И даже названия линий появились.
Первые 2 индикатора у меня работали и без этого, но вы правы, это нужно было включить в код чтобы работало одинаково у всех, а вот третий индикатор у меня заработал только когда я правильно написал ему индекс графика
Причина обращения: