В каком порядке делать SetIndexBuffer() и зависит ли он он порядка директив #property indicator_x ?

 

Привет,

Каждый раз это вводит в ступор и приходится подбирать методом тыка ... может ли кто-то на пальцах обьяснить правила привязки индикаторного буфера к опр. динамическому массиву?

Есть такое :

#property indicator_separate_window
#property indicator_buffers 8
#property indicator_plots   4

#property indicator_label1  "Volume"
#property indicator_type1   DRAW_COLOR_HISTOGRAM
#property indicator_color1  clrDeepSkyBlue, clrRed, clrLightGray, clrLime, clrBlack, clrDarkViolet
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2

#property indicator_label2  "AverageVolume"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrDeepSkyBlue
#property indicator_style2  STYLE_DOT
#property indicator_width2  1

#property indicator_label3  "Delta"
#property indicator_type3   DRAW_COLOR_HISTOGRAM
#property indicator_color3  clrDarkOrange
#property indicator_style3  STYLE_SOLID
#property indicator_width3  2

#property indicator_label4  "AverageDelta"
#property indicator_type4   DRAW_LINE
#property indicator_color4  Black
#property indicator_style4  STYLE_SOLID
#property indicator_width4  1

Потом чтобы привязать буфер к соотв. массиву делаю в OnInit и все правильно работает :

SetIndexBuffer(0, VolumeBuffer, INDICATOR_DATA);
SetIndexBuffer(1, VolumeColors, INDICATOR_COLOR_INDEX);
SetIndexBuffer(2, AverageVolumeBuffer, INDICATOR_DATA);
SetIndexBuffer(3, DeltaBuffer, INDICATOR_DATA);
SetIndexBuffer(4, DeltaColors, INDICATOR_COLOR_INDEX);
SetIndexBuffer(5, AverageDeltaBuffer, INDICATOR_DATA);
SetIndexBuffer(6, VolumeCalculations, INDICATOR_CALCULATIONS);
SetIndexBuffer(7, DeltaCalculations, INDICATOR_CALCULATIONS);

Но если поменять порядок привязки, то все становится очень плохо, особенно с цветами :

SetIndexBuffer(0, VolumeBuffer, INDICATOR_DATA);
SetIndexBuffer(1, VolumeColors, INDICATOR_COLOR_INDEX);
SetIndexBuffer(2, AverageVolumeBuffer, INDICATOR_DATA);
SetIndexBuffer(3, VolumeCalculations, INDICATOR_CALCULATIONS);
SetIndexBuffer(4, DeltaBuffer, INDICATOR_DATA);
SetIndexBuffer(5, DeltaColors, INDICATOR_COLOR_INDEX);
SetIndexBuffer(6, AverageDeltaBuffer, INDICATOR_DATA);
SetIndexBuffer(7, DeltaCalculations, INDICATOR_CALCULATIONS);
  1. Почему? 
  2. Каким должен быть порядок привязки буферов?
  3. Как понять в каком порядке располагать привязки буферов чтобы каждый SetIndexBuffer() соответствовал своему #property indicator_х?
 

//удалил

Наверное, вот этот кусок справки

"Может также принимать значение INDICATOR_COLOR_INDEX, тогда данный буфер предназначен для хранения индексов цветов для предыдущего индикаторного буфера."

 
Silent:

//удалил

Наверное, вот этот кусок справки

"Может также принимать значение INDICATOR_COLOR_INDEX, тогда данный буфер предназначен для хранения индексов цветов для предыдущего индикаторного буфера."

Нет, не похоже, буфер для INDICATOR_COLOR_INDEX привязывается сразу после буфера с данными для этого буфера в ообих случаях, например :

SetIndexBuffer(0, VolumeBuffer, INDICATOR_DATA);
SetIndexBuffer(1, VolumeColors, INDICATOR_COLOR_INDEX);

Т.е. и в правильном и в неправильном вариантах это правило соблюдается, но в неправильном варианте цвета все равно исчезают, точнее исчезают цвета всех буферов, начиная с индекса 4.

Чтобы было наглядней, в правильном варианте индексы привязываются так :

SetIndexBuffer(0, VolumeBuffer, INDICATOR_DATA);        // #property indicator_label1 - data for Histogram
SetIndexBuffer(1, VolumeColors, INDICATOR_COLOR_INDEX);  // #property indicator_label1 - color for Histogram
SetIndexBuffer(2, AverageVolumeBuffer, INDICATOR_DATA); // #property indicator_label2 - data only for Moving Average
SetIndexBuffer(3, DeltaBuffer, INDICATOR_DATA);         // #property indicator_label3 - data for another Histogram
SetIndexBuffer(4, DeltaColors, INDICATOR_COLOR_INDEX);   // #property indicator_label3 - color for another Histogram
SetIndexBuffer(5, AverageDeltaBuffer, INDICATOR_DATA);  // #property indicator_label4 - data for another Moving Average

И, я так думаю, вставляя в любом месте посередине буфер для INDICATOR_CALCULATIONS, эта индексация сдвигается и все ломается, но правильно ли это предположение и почему нигде в мануале не упоминается в какой последовательности и какие типы буферов можно привязывать?

За ссылку на правила для буфера цвета - спасибо.

 
artemiusgreat:

Нет, не похоже, буфер для INDICATOR_COLOR_INDEX привязывается сразу после буфера с данными для этого буфера в ообих случаях, например :

Т.е. и в правильном и в неправильном вариантах это правило соблюдается, но в неправильном варианте цвета все равно исчезают, точнее исчезают цвета всех буферов, начиная с индекса 4.

Чтобы было наглядней, в правильном варианте индексы привязываются так :

И, я так думаю, вставляя в любом месте посередине буфер для INDICATOR_CALCULATIONS, эта индексация сдвигается и все ломается, но правильно ли это предположение и почему нигде в мануале не упоминается в какой последовательности и какие типы буферов можно привязывать?

За ссылку на правила для буфера цвета - спасибо.

Вот

"Нумерация свойств (модификаторов) при использовании директивы #property начинается с 1 (единицы), в то время как функция использует нумерацию с 0 (нуля). При неправильном задании номера уровня отображение индикатора может отличаться от того, которое предполагается."

IndicatorSetDouble

 

artemiusgreat:

Каким должен быть порядок привязки буферов?

1. Буфер, который должен рисоваться поверх, должен иметь больший индекс.

2. Цвет идет сразу за своим буфером (с учетом стиля, см. 5)

3. Вспомогательные всегда в конце

4. Надо учитывать, что нумерация свойств начинается с 1, а буферов в SetIndexBuffer с 0.

5. Надо учитывать количество буферов на прорисовку стиля.