Индикаторные буферы. мт4

 
На момент запуска индикатора я не знаю сколько мне нужно будет буферов для рисования. Их количество будет зависеть от введённых настроек. Каким то образом данный вопрос решается динамически ? или нужно описывать все возможные 8 буферов и использовать только то количество которое нужно.
 
Alexey Oreshkin:
На момент запуска индикатора я не знаю сколько мне нужно будет буферов для рисования. Их количество будет зависеть от введённых настроек. Каким то образом данный вопрос решается динамически ? или нужно описывать все возможные 8 буферов и использовать только то количество которое нужно.
В неиспользуемые на данный момент буферы вписывайте EMPTY_VALUE, ну или какое там у вас задано "пустое" значение в индикаторе ... Но быть они должны все.
 
Artyom Trishkin:
В неиспользуемые на данный момент буферы вписывайте EMPTY_VALUE, ну или какое там у вас задано "пустое" значение в индикаторе ... Но быть они должны все.
Так то понятно. Думал можно по красивому сделать. Хорошо. Значит оставлю как есть. Спасибо за ответ.
 
Alexey Oreshkin:
Так то понятно. Думал можно по красивому сделать. Хорошо. Значит оставлю как есть. Спасибо за ответ.
Не за что ...
 
Alexey Oreshkin:
На момент запуска индикатора я не знаю сколько мне нужно будет буферов для рисования. Их количество будет зависеть от введённых настроек. Каким то образом данный вопрос решается динамически ? или нужно описывать все возможные 8 буферов и использовать только то количество которое нужно.

Если индикаторный буфер не будет использоваться, то его можно и не объявлять. Теперь в МТ4 нет ограничения на 8 индикаторных буферов, можно и больше задействовать. Даже рисовать можно больше восьми.

for(i=0;i<9;i++) if(Show[i])
     {
      switch(i)
        {
         case 0: {SetIndexBuffer(0,Buffer0); SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,Width,c0);} break;
         case 1: {SetIndexBuffer(1,Buffer1); SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,Width,c1);} break;
         case 2: {SetIndexBuffer(2,Buffer2); SetIndexStyle(2,DRAW_LINE,STYLE_SOLID,Width,c2);} break;
         case 3: {SetIndexBuffer(3,Buffer3); SetIndexStyle(3,DRAW_LINE,STYLE_SOLID,Width,c3);} break;
         case 4: {SetIndexBuffer(4,Buffer4); SetIndexStyle(4,DRAW_LINE,STYLE_SOLID,Width,c4);} break;
         case 5: {SetIndexBuffer(5,Buffer5); SetIndexStyle(5,DRAW_LINE,STYLE_SOLID,Width,c5);} break;
         case 6: {SetIndexBuffer(6,Buffer6); SetIndexStyle(6,DRAW_LINE,STYLE_SOLID,Width,c6);} break;
         case 7: {SetIndexBuffer(7,Buffer7); SetIndexStyle(7,DRAW_LINE,STYLE_SOLID,Width,c7);} break;
         case 8: {SetIndexBuffer(8,Buffer8); SetIndexStyle(8,DRAW_LINE,STYLE_SOLID,Width,c8);}
        }
      SetIndexLabel(i,Label[i]);
     } else SetIndexLabel(i,"");
 
Igor Korepin:

Если индикаторный буфер не будет использоваться, то его можно и не объявлять. Теперь в МТ4 нет ограничения на 8 индикаторных буферов, можно и больше задействовать. Даже рисовать можно больше восьми.

Больше 8 можно использовать для расчётов. Там их аж до 512. А для рисования каким образом больше 8 ? Если взять хелп, то мы видим следующее: (для примера взял SetIndexLabel): Порядковый номер линии. Должен быть от 0 до 7.

 

А по поводу объявить буферы, но не присваивать им стили рисования и остальные атрибуты...попробую, по логике идея здравая. 

 
Alexey Oreshkin:

А для рисования каким образом больше 8 ? Если взять хелп, то мы видим следующее: (для примера взял SetIndexLabel): Порядковый номер линии. Должен быть от 0 до 7.


Справка не актуальна местами или устарела. Мой индикатор может рисовать 9 линий.
 
Igor Korepin:
Справка не актуальна местами или устарела. Мой индикатор может рисовать 9 линий.

Круто! проверил и вот результат: 

13 буферов.
Разработчикам жирный минус в карму и плохое настроение пока не исправят справку ! 

 


Но динамически добавлять буферы, хотя бы только во время инициализации не получается. Если я к примеру в заголовке напишу #property indicator_buffers 10, то не важно что я делаю дальше, в окне данных всё равно будет 10 буферов. 

 
Alexey Oreshkin:

Но динамически добавлять буферы, хотя бы только во время инициализации не получается. Если я к примеру в заголовке напишу #property indicator_buffers 10, то не важно что я делаю дальше, в окне данных всё равно будет 10 буферов. 

Да, максимальное количество буферов для рисования линий указывается в заголовке. Превысить его уже нельзя. Меньше можно. Чтобы убрать из окна данных лишнее просто указываем пустое значение в функции SetIndexLabel(i,NULL);
 
Igor Korepin:
Да, максимальное количество буферов для рисования линий указывается в заголовке. Превысить его уже нельзя. Меньше можно. Чтобы убрать из окна данных лишнее просто указываем пустое значение в функции SetIndexLabel(i,NULL);
Кроме тех буферов что рисуют, можно создавать буфера для промежуточных расчетов. И общее количество буферов может превышать количество указанное в заголовке
 
Alexey Oreshkin:

Разработчикам жирный минус в карму и плохое настроение пока не исправят справку ! 

Прежде чем нести чепуху будьте внимательней - для справки  IndicatorBuffers

IndicatorBuffers - Документация на MQL4
  • docs.mql4.com
IndicatorBuffers - Документация на MQL4
Причина обращения: