Индикаторы с большим количеством типов графического построения

 

Добрый день. У меня, сугугбо из некоторого интереса, появилось желание научиться писать индикаторы у которых много буфером со значениями самого индикатора так и с большим количеством графических построений. Я взял шаблон с элементарным индикатором, который находит паттерн "внутренний бар" и выводит неоторую информацию о нём. Выложить весь код я могу, но я пишу с использованием самописных библиотеки и классов. Не каждый захочет такие вещи проверять..)

В общем то, есть вариант проще. Я взял элементарный пример. Буфер паттерна с медвежьим телом размещается в одном бфере, а с бычьим - в другом. Над и под каждым из этим паттернов будет отображаться цветная стрелочка. Над и под бычьим -я выбрал синюю, а над и под медвежьим - красную.

Вот свойства индикатора:

#property indicator_type1 DRAW_COLOR_ARROW
#property indicator_color1  clrRed, clrTurquoise, clrGoldenrod

#property indicator_type2 DRAW_COLOR_ARROW
#property indicator_color2  clrRed, clrTurquoise, clrIndigo

#property indicator_type3 DRAW_COLOR_ARROW
#property indicator_color3  clrRed, clrTurquoise, clrGoldenrod

#property indicator_type4 DRAW_COLOR_ARROW
#property indicator_color4  clrRed, clrTurquoise, clrIndigo

Функция OnInit():

int OnInit() {
  ptrSym = new SymbolInstance(_Symbol);

  IndicatorSetString(INDICATOR_SHORTNAME, "Inside bar");
  IndicatorSetInteger(INDICATOR_DIGITS, _Digits);

  // === Связывание буферов с индексами, определение стилей ==========================
  SetIndexBuffer(0, insideBarWithBearishBody_buffer, INDICATOR_DATA);                    // 1-ый буфер - "Молот" с медвежьим телом бара
  SetIndexBuffer(1, insideBarWithBullishBody_buffer, INDICATOR_DATA);                    // 4-ый буфер - "Молот" с бычьим телом бара

  SetIndexBuffer(2, insideBarWithBearishBody_upperArrowColor, INDICATOR_COLOR_INDEX);    // 2-ой буфер - Цвет верхней стрелочки
  SetIndexBuffer(3, insideBarWithBearishBody_lowerArrowColor, INDICATOR_COLOR_INDEX);    // 3-ий буфер - Цвет нижней стрелочки
  SetIndexBuffer(4, insideBarWithBullishBody_upperArrowColor, INDICATOR_COLOR_INDEX);    // 5-ый буфер - Цвет верхней стрелочки
  SetIndexBuffer(5, insideBarWithBullishBody_lowerArrowColor, INDICATOR_COLOR_INDEX);    // 6-ой буфер - Цвет нижней стрелочки

  PlotIndexSetInteger(0, PLOT_DRAW_TYPE, DRAW_COLOR_ARROW);
  PlotIndexSetInteger(0, PLOT_ARROW, 218);
  PlotIndexSetInteger(0, PLOT_ARROW_SHIFT, -arrowShift);
  PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, EMPTY_VALUE);

  PlotIndexSetInteger(1, PLOT_DRAW_TYPE, DRAW_COLOR_ARROW);
  PlotIndexSetInteger(1, PLOT_ARROW, 217);
  PlotIndexSetInteger(1, PLOT_ARROW_SHIFT, arrowShift);
  PlotIndexSetDouble(1, PLOT_EMPTY_VALUE, EMPTY_VALUE);

  PlotIndexSetInteger(2, PLOT_DRAW_TYPE, DRAW_COLOR_ARROW);
  PlotIndexSetInteger(2, PLOT_ARROW, 218);
  PlotIndexSetInteger(2, PLOT_ARROW_SHIFT, -arrowShift);
  PlotIndexSetDouble(2, PLOT_EMPTY_VALUE, EMPTY_VALUE);

  PlotIndexSetInteger(3, PLOT_DRAW_TYPE, DRAW_COLOR_ARROW);
  PlotIndexSetInteger(3, PLOT_ARROW, 217);
  PlotIndexSetInteger(3, PLOT_ARROW_SHIFT, arrowShift);
  PlotIndexSetDouble(3, PLOT_EMPTY_VALUE, EMPTY_VALUE);

  ArraySetAsSeries(insideBarWithBearishBody_buffer, true);
  ArraySetAsSeries(insideBarWithBearishBody_upperArrowColor, true);
  ArraySetAsSeries(insideBarWithBearishBody_lowerArrowColor, true);
  ArraySetAsSeries(insideBarWithBullishBody_buffer, true);
  ArraySetAsSeries(insideBarWithBullishBody_upperArrowColor, true);
  ArraySetAsSeries(insideBarWithBullishBody_lowerArrowColor, true);
//---
   return INIT_SUCCEEDED;
}

Вот функция, в которой присваиваются значения индикаторам:

void setBuffers(string patternType,    // Тип паттерна
                int i) {               // Индекс обрабатываемого бара
  if (patternType == INSIDE_BAR_WITH_BEARISH_BODY) {
    insideBarWithBearishBody_buffer[i] = barHighPrice(i);
    insideBarWithBullishBody_buffer[i] = EMPTY_VALUE;
    insideBarWithBearishBody_upperArrowColor[i] = 0;
    insideBarWithBearishBody_lowerArrowColor[i] = 0;
  } else if (patternType == INSIDE_BAR_WITH_BULLISH_BODY) {
    insideBarWithBullishBody_buffer[i] = barLowPrice(i);
    insideBarWithBearishBody_buffer[i] = EMPTY_VALUE;
    insideBarWithBullishBody_upperArrowColor[i] = 0;
    insideBarWithBullishBody_lowerArrowColor[i] = 0;
  }
}

В функции setBuffers() видно, что при нахождении бара с медвежьим телом присваивается значение Хая бара на этом индексе и индексов стрелочек располагающихся над и под этим баром. По логике всё верно. Но не работает. В чём проблема?

Кстати, свойства индикаторов задаются с 1-го индекса, а не в 0-го. Но, в данном случае, если 4 буфера графических серий, и свойства задать как я указал выше, то будет появляться ошибка:

indicator buffers amount is less than needed            0       0

Хотя, у меня объявлена 4 графических серии. Как это так?

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

Файлы:
InsideBar.mq5  16 kb
 

Используйте всегда MQL5 Wizard для создания болванки файла - и не будет никаких проблем:

//+------------------------------------------------------------------+
//|                                                            1.mq5 |
//|                              Copyright © 2020, Vladimir Karputov |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2020, Vladimir Karputov"
#property link      ""
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 8
#property indicator_plots   4
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_COLOR_ARROW
#property indicator_color1  clrRed,clrTurquoise,clrGoldenrod
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot Label2
#property indicator_label2  "Label2"
#property indicator_type2   DRAW_COLOR_ARROW
#property indicator_color2  clrRed,clrTurquoise,clrIndigo
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- plot Label3
#property indicator_label3  "Label3"
#property indicator_type3   DRAW_COLOR_ARROW
#property indicator_color3  clrRed,clrTurquoise,clrGoldenrod
#property indicator_style3  STYLE_SOLID
#property indicator_width3  1
//--- plot Label4
#property indicator_label4  "Label4"
#property indicator_type4   DRAW_COLOR_ARROW
#property indicator_color4  clrRed,clrTurquoise,clrIndigo
#property indicator_style4  STYLE_SOLID
#property indicator_width4  1
//--- input parameters
input int      Input1=9;
//--- indicator buffers
double         Label1Buffer[];
double         Label1Colors[];
double         Label2Buffer[];
double         Label2Colors[];
double         Label3Buffer[];
double         Label3Colors[];
double         Label4Buffer[];
double         Label4Colors[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA);
   SetIndexBuffer(1,Label1Colors,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(2,Label2Buffer,INDICATOR_DATA);
   SetIndexBuffer(3,Label2Colors,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(4,Label3Buffer,INDICATOR_DATA);
   SetIndexBuffer(5,Label3Colors,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(6,Label4Buffer,INDICATOR_DATA);
   SetIndexBuffer(7,Label4Colors,INDICATOR_COLOR_INDEX);
//--- setting a code from the Wingdings charset as the property of PLOT_ARROW
   PlotIndexSetInteger(0,PLOT_ARROW,159);
   PlotIndexSetInteger(1,PLOT_ARROW,159);
   PlotIndexSetInteger(2,PLOT_ARROW,159);
   PlotIndexSetInteger(3,PLOT_ARROW,159);
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//---
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Viktar Dzemikhau:

Добрый день. У меня, сугугбо из некоторого интереса, появилось желание научиться писать индикаторы у которых много буфером со значениями самого индикатора так и с большим количеством графических построений. Я взял шаблон с элементарным индикатором, который находит паттерн "внутренний бар" и выводит неоторую информацию о нём. Выложить весь код я могу, но я пишу с использованием самописных библиотеки и классов. Не каждый захочет такие вещи проверять..)

В общем то, есть вариант проще. Я взял элементарный пример. Буфер паттерна с медвежьим телом размещается в одном бфере, а с бычьим - в другом. Над и под каждым из этим паттернов будет отображаться цветная стрелочка. Над и под бычьим -я выбрал синюю, а над и под медвежьим - красную.

Вот свойства индикатора:

Функция OnInit():

Вот функция, в которой присваиваются значения индикаторам:

В функции setBuffers() видно, что при нахождении бара с медвежьим телом присваивается значение Хая бара на этом индексе и индексов стрелочек располагающихся над и под этим баром. По логике всё верно. Но не работает. В чём проблема?

Кстати, свойства индикаторов задаются с 1-го индекса, а не в 0-го. Но, в данном случае, если 4 буфера графических серий, и свойства задать как я указал выше, то будет появляться ошибка:

Хотя, у меня объявлена 4 графических серии. Как это так?

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

До конца даже читать не могу.

Ошибка №1 Если вы решили делать два варианта «Над и под бычьим -я выбрал синюю, а над и под медвежьим - красную.» и при этом DRAW_COLOR_ARROW то буферов должно быть 4, а отображений достаточно 2, для стрелки сверху и стрелки снизу. А цвет задаётся в зависимости от типа бара (бычий\медвежий).

Ошибка №2 Буфер индикатора и буфер цвета связаны. Если индекс буфера построения 0, то индекс буфера цвета обязательно должен быть 1.

Исправьте код согласно этим замечаниям и можно будет смотреть дальше.

 
Vladimir Karputov:

Используйте всегда MQL5 Wizard для создания болванки файла - и не будет никаких проблем:

Этот вариант я понимаю. Но не особо понятно, для чего мне дополнительные 2 буфера? Ведь для хранения данных (не цветов) наличия каждого вариант паттерна нужно лишь 2 буфера?

1-ый с медвежьим телом.

2-ой с бычьим телом.

А здесь, что бы добавить 2 дполнительные стрелочки приходится добавлять 2 дополнительных буфера. В чём польза?

 
Alexey Viktorov:

До конца даже читать не могу.

Ошибка №1 Если вы решили делать два варианта «Над и под бычьим -я выбрал синюю, а над и под медвежьим - красную.» и при этом DRAW_COLOR_ARROW то буферов должно быть 4, а отображений достаточно 2, для стрелки сверху и стрелки снизу. А цвет задаётся в зависимости от типа бара (бычий\медвежий).

Ошибка №2 Буфер индикатора и буфер цвета связаны. Если индекс буфера построения 0, то индекс буфера цвета обязательно должен быть 1.

Исправьте код согласно этим замечаниям и можно будет смотреть дальше.

В принципе да. Уменьшил количество буферов. Всё теперь в порядке.

Пользовался бы MQL5 Wizard'ом наклепал бы лишних буфеорв. Хотя, с другой стороны, на начальном этапе это как-бы и удобно. Но хотелось понять а не просто слепить из шаблона как-нибудь..

 
Viktar Dzemikhau:

Этот вариант я понимаю. Но не особо понятно, для чего мне дополнительные 2 буфера? Ведь для хранения данных (не цветов) наличия каждого вариант паттерна нужно лишь 2 буфера?

1-ый с медвежьим телом.

2-ой с бычьим телом.

А здесь, что бы добавить 2 дполнительные стрелочки приходится добавлять 2 дополнительных буфера. В чём польза?

Вы сами захотели использовать графический стиль DRAW_COLOR_ARROW - а этот стиль подразумевает использование ДВУХ БУФЕРОВ:

Количество требуемых буферов для построения DRAW_COLOR_ARROW — 2:

  • один буфер для хранения  значения цены, по которой рисуется символ (плюс смещение в пикселях, задаваемое свойством PLOT_ARROW_SHIFT);
  • один буфер для хранения индекса цвета, которым рисуется стрелка (имеет смысл задавать только для непустых значений).

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

 
Vladimir Karputov:

Вы сами захотели использовать графический стиль DRAW_COLOR_ARROW - а этот стиль подразумевает использование ДВУХ БУФЕРОВ:

Всё верно. Я понимаю, что стиль рисования подразумевает использование 2 цветов.

Vladimir Karputov:

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

Видимо да. Значит нужно пересмотреть своё видение по этому поводу.

Вот смотрите. Например, в свойствах индикатора пишем так:

#property indicator_buffers 6
#property indicator_plots 2

#property indicator_type1 DRAW_COLOR_ARROW
#property indicator_color1  clrRed, clrTurquoise, clrGoldenrod

#property indicator_type2 DRAW_COLOR_ARROW
#property indicator_color2  clrRed, clrTurquoise, clrIndigo

2 буфера индикатора используется для хранения значений самих паттернов и  2 индикаторных будфера используется для хранения обоихстрелочек (над и под каждым паттерном) и 2 серии отрисовки (на каждую стрелочки). По сути, получилось 2 буфера для хранения паттернов и 4 буфера на 2 стрелочеки т.е. на каждую стрелочку по 2 буфера. В теории, всё верно.

Вот функция инициализации:

int OnInit() {
  ptrSym = new SymbolInstance(_Symbol);

  IndicatorSetString(INDICATOR_SHORTNAME, "Inside bar");
  IndicatorSetInteger(INDICATOR_DIGITS, _Digits);

  // === Связывание буферов с индексами, определение стилей ==========================
  SetIndexBuffer(0, bearishInsideBar_buffer, INDICATOR_DATA);          // 1-ый буфер - "Внутренний бар" с медвежьим телом бара
  SetIndexBuffer(1, bullishInsideBar_buffer, INDICATOR_DATA);          // 2-ой буфер - "Внутренний бар" с бычьим телом бара

  SetIndexBuffer(2, upperArrow_buffer, INDICATOR_DATA);                // 3-ий буфер - Буфер верхней стрелочки
  SetIndexBuffer(3, upperArrowColor_buffer, INDICATOR_COLOR_INDEX);    // 4-ый буфер - Цвет верхней стрелочки
  SetIndexBuffer(4, lowerArrow_buffer, INDICATOR_DATA);                // 5-ой буфер - Буфер нижней стрелочки
  SetIndexBuffer(5, lowerArrowColor_buffer, INDICATOR_COLOR_INDEX);    // 6-ой буфер - Цвет нижней стрелочки

  PlotIndexSetInteger(0, PLOT_DRAW_TYPE, DRAW_COLOR_ARROW);
  PlotIndexSetInteger(0, PLOT_ARROW, 218);
  PlotIndexSetInteger(0, PLOT_ARROW_SHIFT, -arrowShift);
  PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, EMPTY_VALUE);

  PlotIndexSetInteger(1, PLOT_DRAW_TYPE, DRAW_COLOR_ARROW);
  PlotIndexSetInteger(1, PLOT_ARROW, 217);
  PlotIndexSetInteger(1, PLOT_ARROW_SHIFT, arrowShift);
  PlotIndexSetDouble(1, PLOT_EMPTY_VALUE, EMPTY_VALUE);

  ArraySetAsSeries(bearishInsideBar_buffer, true);
  ArraySetAsSeries(upperArrowColor_buffer, true);
  ArraySetAsSeries(bullishInsideBar_buffer, true);
  ArraySetAsSeries(lowerArrowColor_buffer, true);
//---
   return INIT_SUCCEEDED;
}

А в этой функции в зависимости от типа появившегося паттерна должен задаваться цвет стрелочек:

void setBuffers(string patternType,    // Тип паттерна
                int i) {               // Индекс обрабатываемого бара
  if (patternType == BEARISH_INSIDE_BAR) {
    bearishInsideBar_buffer[i] = barHighPrice(i);
    bullishInsideBar_buffer[i] = EMPTY_VALUE;
    upperArrow_buffer[i] = barHighPrice(i);
    upperArrowColor_buffer[i] = 1;
    lowerArrow_buffer[i] = barLowPrice(i);
    lowerArrowColor_buffer[i] = 1;
  } else if (patternType == BULLISH_INSIDE_BAR) {
    bearishInsideBar_buffer[i] = EMPTY_VALUE;
    bullishInsideBar_buffer[i] = barLowPrice(i);
    upperArrow_buffer[i] = barHighPrice(i);
    upperArrowColor_buffer[i] = 0;
    lowerArrow_buffer[i] = barLowPrice(i);
    lowerArrowColor_buffer[i] = 0;
  }
}

Сейчас у меня исчезли все стрелочки.

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

 
Viktar Dzemikhau:

Всё верно. Я понимаю, что стиль рисования подразумевает использование 2 цветов.

Видимо да. Значит нужно пересмотреть своё видение по этому поводу.

Вот смотрите. Например, в свойствах индикатора пишем так:

2 буфера индикатора используется для хранения значений самих паттернов и  2 индикаторных будфера используется для хранения обоихстрелочек (над и под каждым паттерном) и 2 серии отрисовки (на каждую стрелочки). По сути, получилось 2 буфера для хранения паттернов и 4 буфера на 2 стрелочеки т.е. на каждую стрелочку по 2 буфера. В теории, всё верно.

Вот функция инициализации:

А в этой функции в зависимости от типа появившегося паттерна должен задаваться цвет стрелочек:

Сейчас у меня исчезли все стрелочки.

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

Настоятельно рекомендую создать болванку в MQL5 Wizard - таким образом избавитесь от глупых ошибок конструирования.

 
Vladimir Karputov:

Настоятельно рекомендую создать болванку в MQL5 Wizard - таким образом избавитесь от глупых ошибок конструирования.

В конструкторе такое не задать. Там всегда буфер значений чередуется с цветом. Мне же нужно, что бы первыми были прописаны буфера для хранения значений наличия того или иного паттерна. Окрашивать его не целесообразно. Поэтому я и задался вопросом как это проверить. Как мне такое создать при помощи MQL5 Wizard ?

Документация по MQL5: Константы, перечисления и структуры / Константы индикаторов / Стили рисования
Документация по MQL5: Константы, перечисления и структуры / Константы индикаторов / Стили рисования
  • www.mql5.com
При создании пользовательского индикатора можно указать один из 18 типов графического построения (способа отображения на главном окне графика или в подокне графика), значения которых указаны в перечислении ENUM_DRAW_TYPE. В зависимости от стиля рисования, может потребоваться от одного до четырех буферов значений (отмеченных как INDICATOR_DATA...
 
Viktar Dzemikhau:

В конструкторе такое не задать. Там всегда буфер значений чередуется с цветом. Мне же нужно, что бы первыми были прописаны буфера, в которые должны храниться значения наличия паттерна. Окрашивать его не целесообразно. Поэтому я и задался вопросом как это проверить. Как мне такое создать при помощи MQL5 Wizard ?

Повторю: сначала болванка, потом свободное творчество ...

Пример болванки есть в   

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

 
Vladimir Karputov:

Повторю: сначала болванка, потом свободное творчество ...

Пример болванки есть в   

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

В конструкторе всё получилось. Но там задаётся лишь отрисовка чего-либо. У меня, кроме этого, как я написал имеются ещё и 2 буфера для хранения наличия паттернов.

Объявлю я буфера для хранения паттернов  теперь в самом конце. Теперь появилась разница. До этого не было стрелочек вообще. На данный момент, появилось 2 стрелочки около обоих вариантов паттерна. Хотя, цвета должны отличаться.

Вот это у меня в свойствах индикатора:

#property indicator_buffers 6
#property indicator_plots 2

#property indicator_type1 DRAW_COLOR_ARROW
#property indicator_color1  clrRed, clrTurquoise, clrGoldenrod

#property indicator_type2 DRAW_COLOR_ARROW
#property indicator_color2  clrRed, clrTurquoise, clrIndigo

Объявления буферов:

double upperArrow_buffer[];          // Буфер верхней стрелочки
double upperArrowColors_buffer[];    // Буфер цвета верхней стрелочки
double lowerArrow_buffer[];          // Буфер нижней стрелочки
double lowerArrowColors_buffer[];    // Буфер цвета нижней стрелочки
double bearishInsideBar_buffer[];    // Буфер паттерна "Внутренний бар" с медвежьим телом бара
double bullishInsideBar_buffer[];    // Буфер паттерна "Внутренний бар" с бычьим телом бара

OnInit():

int OnInit() {
  ptrSym = new SymbolInstance(_Symbol);

  IndicatorSetString(INDICATOR_SHORTNAME, "Inside bar");
  IndicatorSetInteger(INDICATOR_DIGITS, _Digits);

  // === Связывание буферов с индексами, определение стилей ==========================
  SetIndexBuffer(0, upperArrow_buffer, INDICATOR_DATA);                 // 1-ый буфер - Буфер верхней стрелочки
  SetIndexBuffer(1, upperArrowColors_buffer, INDICATOR_COLOR_INDEX);    // 2-ой буфер - Цвет верхней стрелочки
  SetIndexBuffer(2, lowerArrow_buffer, INDICATOR_DATA);                 // 3-ий буфер - Буфер нижней стрелочки
  SetIndexBuffer(3, lowerArrowColors_buffer, INDICATOR_COLOR_INDEX);    // 4-ый буфер - Цвет нижней стрелочки

  SetIndexBuffer(4, bearishInsideBar_buffer, INDICATOR_DATA);           // 5-ый буфер - "Внутренний бар" с медвежьим телом бара
  SetIndexBuffer(5, bullishInsideBar_buffer, INDICATOR_DATA);           // 6-ой буфер - "Внутренний бар" с бычьим телом бара

  PlotIndexSetInteger(0, PLOT_DRAW_TYPE, DRAW_COLOR_ARROW);
  PlotIndexSetInteger(0, PLOT_ARROW, 218);
  PlotIndexSetInteger(0, PLOT_ARROW_SHIFT, -arrowShift);
  PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, EMPTY_VALUE);

  PlotIndexSetInteger(1, PLOT_DRAW_TYPE, DRAW_COLOR_ARROW);
  PlotIndexSetInteger(1, PLOT_ARROW, 217);
  PlotIndexSetInteger(1, PLOT_ARROW_SHIFT, arrowShift);
  PlotIndexSetDouble(1, PLOT_EMPTY_VALUE, EMPTY_VALUE);

  ArraySetAsSeries(upperArrow_buffer, true);
  ArraySetAsSeries(upperArrowColors_buffer, true);
  ArraySetAsSeries(lowerArrow_buffer, true);
  ArraySetAsSeries(lowerArrowColors_buffer, true);
  ArraySetAsSeries(bearishInsideBar_buffer, true);
  ArraySetAsSeries(bullishInsideBar_buffer, true);
//---
   return INIT_SUCCEEDED;
}

В этой функции задаются значения буферам в зависимости от типа паттерна:

void setBuffers(string patternType,    // Тип паттерна
                int i) {               // Индекс обрабатываемого бара
  if (patternType == BEARISH_INSIDE_BAR) {
    bearishInsideBar_buffer[i] = barHighPrice(i);
    bullishInsideBar_buffer[i] = EMPTY_VALUE;

    upperArrow_buffer[i] = barHighPrice(i);
    upperArrowColors_buffer[i] = 0;
    lowerArrow_buffer[i] = barLowPrice(i);
    lowerArrowColors_buffer[i] = 0;
  } else if (patternType == BULLISH_INSIDE_BAR) {
    bullishInsideBar_buffer[i] = barLowPrice(i);
    bearishInsideBar_buffer[i] = EMPTY_VALUE;

    upperArrow_buffer[i] = barHighPrice(i);
    upperArrowColors_buffer[i] = 1;
    lowerArrow_buffer[i] = barLowPrice(i);
    lowerArrowColors_buffer[i] = 1;
  }
}

На скрине вижу:


Цвет не меняется.. Почему? Ведь я всё верно, как я понимаю, объявил. Индексы цветов присваиваются разные в зависимости от типа паттерна..

Причина обращения: