Закавыка с DRAW_ARROW и DRAW_CANDLES

 

Буквально уже неделю бьюсь об стену не могу понять почему если поставить индикатор типа DRAW_ARROW  в списке индикторово до  DRAW_CANDLES индикатора то всё работает нормально. Но если после, то уже DRAW_ARROW будет рисовать исключительно точки. Игнорируя задание символа (как здесь :   PlotIndexSetInteger(11, PLOT_ARROW,169);

/Так работает

//--- plot arrow
#property indicator_label1  "arrows"
#property indicator_type1   DRAW_COLOR_ARROW
#property indicator_color1  clrGray,clrDarkKhaki,clrBrown
#property indicator_style1  STYLE_SOLID
#property indicator_width1  5

//--- plot Candles
#property indicator_label2  "Candles"
#property indicator_type2   DRAW_COLOR_CANDLES
#property indicator_color2  clrForestGreen,clrMaroon,clrAzure,clrGray
#property indicator_style2  STYLE_SOLID
#property indicator_width2  4

А так уже нет


#property indicator_label1  "Candles"
#property indicator_type1   DRAW_COLOR_CANDLES
#property indicator_color1  clrForestGreen,clrMaroon,clrAzure,clrGray
#property indicator_style1  STYLE_SOLID
#property indicator_width1  4

#property indicator_label2  "arrows"
#property indicator_type2   DRAW_COLOR_ARROW
#property indicator_color2  clrGray,clrDarkKhaki,clrBrown
#property indicator_style2  STYLE_SOLID
#property indicator_width2  5

Прикреплен тест пример

Файлы:
TestHello.mq5  5 kb
 

пробовали через Мастер создания создавать? там очередность есть декларации, где-то нарушен порядок

здесь всегда рекомендуют шапку декларации и привязки буферов делать через "Мастер создания"

 
Max B:

Буквально уже неделю бьюсь об стену не могу понять почему если поставить индикатор типа DRAW_ARROW  в списке индикторово до  DRAW_CANDLES индикатора то всё работает нормально. Но если после, то уже DRAW_ARROW будет рисовать исключительно точки. Игнорируя задание символа (как здесь :   PlotIndexSetInteger(11, PLOT_ARROW,169);

/Так работает

А так уже нет

Прикреплен тест пример

Заготовку создайте при помощи 'MQL Wizard' и не будете ничем биться о стену.

 
Max B:

Буквально уже неделю бьюсь об стену не могу понять почему если поставить индикатор типа DRAW_ARROW  в списке индикторово до  DRAW_CANDLES индикатора то всё работает нормально. Но если после, то уже DRAW_ARROW будет рисовать исключительно точки. Игнорируя задание символа (как здесь :   PlotIndexSetInteger(11, PLOT_ARROW,169);

/Так работает

А так уже нет

Прикреплен тест пример

Когда меняете местами DRAW_ARROW и  DRAW_CANDLES функция OnInit() остаётся неизменной?

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {

//arrows
   SetIndexBuffer(0,Arrows,INDICATOR_DATA);
   PlotIndexSetInteger(0, PLOT_ARROW,arrowchar);
   SetIndexBuffer(1,ArrowsColors,INDICATOR_COLOR_INDEX);
   
   //-Candles
   SetIndexBuffer(2,CandlesBuffer1,INDICATOR_DATA);
   SetIndexBuffer(3,CandlesBuffer2,INDICATOR_DATA);
   SetIndexBuffer(4,CandlesBuffer3,INDICATOR_DATA);
   SetIndexBuffer(5,CandlesBuffer4,INDICATOR_DATA);
   SetIndexBuffer(6,CandlesColors,INDICATOR_COLOR_INDEX);
   
   SetIndexBuffer(7,BodyO,INDICATOR_DATA);
   SetIndexBuffer(8,BodyH,INDICATOR_DATA);
   SetIndexBuffer(9,BodyL,INDICATOR_DATA);
   SetIndexBuffer(10,BodyC,INDICATOR_DATA);
   PlotIndexSetDouble(7,PLOT_EMPTY_VALUE,0);
   
   SetIndexBuffer(11,Arrows2,INDICATOR_DATA);
   PlotIndexSetInteger(11, PLOT_ARROW,169);
   
   
//---
   return(INIT_SUCCEEDED);
  }
 
Alexey Viktorov:

Когда меняете местами DRAW_ARROW и  DRAW_CANDLES функция OnInit() остаётся неизменной?

Конечно меняю. В примере именно и есть два индекса с  DRAW_ARROW чтобы продемонстрировать баг

Я в принципе понимаю как обойти - просто задавать все DRAW_ARROW до блоков DRAW_CANDLES.  Но меня беспокоит почему так? Эти индексные буфферы и массивы с ними связанные постоянно глючат , вот я  пытаюсь разобраться где я что не понимаю

 
Max B:

Конечно меняю. В примере именно и есть два индекса с  DRAW_ARROW чтобы продемонстрировать баг

Я в принципе понимаю как обойти - просто задавать все DRAW_ARROW до блоков DRAW_CANDLES.  Но меня беспокоит почему так? Эти индексные буфферы и массивы с ними связанные постоянно глючат , вот я  пытаюсь разобраться где я что не понимаю

Нет никакого "бага". Генерируйте при помощи MQL5 Wizard и учитесь на сгенерированном шаблоне.

 
Vladimir Karputov:

Нет никакого "бага". Генерируйте при помощи MQL5 Wizard и учитесь на сгенерированном шаблоне.

Так. сделал как посоветовали - через визард. Нашёл в чем причина. Спасибо что натолкнули на путь.


Штука была в том, что я полагал что 11 массив значит и PlotIndexSetInteger 11. 

  SetIndexBuffer(11,Arrows2,INDICATOR_DATA);
   PlotIndexSetInteger(11, PLOT_ARROW,169);

А на самом деле должно быть 3 - по номеру индикатора. Почему 3? Ведь #property indicator_label4 ? - Ну наверное потому что массивы с нуля считаются.   Система ниппель! Но хоть логика понятна теперь


Всем спасибо!

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