Как удалить линию с последнего значения, идущую в никуда?

 
Есть такой код:

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1

//--- свойства линии заданы с помощью директив компилятора
#property indicator_label1  "Line"      // название построения для "Окна данных"
#property indicator_type1   DRAW_LINE   // тип графического построения - линия
#property indicator_color1  clrWhiteSmoke      // цвет линии
#property indicator_style1  STYLE_SOLID // стиль линии
#property indicator_width1  1           // толщина линии

//--- индикаторный буфер для построения 
double         LineBuffer[];



//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- связывание массива и индикаторного буфера
   SetIndexBuffer(0,LineBuffer,INDICATOR_DATA);
   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[])
  {
   
//--- блок расчета значений индикатора
   for(int i=0; i<rates_total; i++)
     {
      
      if(i >= rates_total - 25){
      
         LineBuffer[i] = low[i];
         
         Print(LineBuffer[i]);
         
        }
        
     }
 
//--- вернем значение prev_calculated для следующего вызова функции
   return(rates_total);
  }
Задача просто нарисовать линии по последним 25-ти свечкам.
Все как бы хорошо - но вопрос:
Почему после последнего 25-го значения - линия начинает прорисовываться в никуда?
(стремится в низ до бесконечности.)
И как это исправить?
 
Mike Kharkov:
Есть такой код:

Задача просто нарисовать линии по последним 25-ти свечкам.
Все как бы хорошо - но вопрос:
Почему после последнего 25-го значения - линия начинает прорисовываться в никуда?
(стремится в низ до бесконечности.)
И как это исправить?
DRAW_SECTION
 
Aleksandr Slavskii:
DRAW_SECTION
Поменял вот эту строчку кода у себя:
#property indicator_type1   DRAW_SECTION   // тип графического построения - линия
Ничего не изменилось в плане отображения на графике.
 

в MQL5 буферный массив нужно инициализировать значением по умолчанию ( EMPTY_VALUE )

линия уходит вниз, т.к. там находится какое то значение из памяти ПК (мусор)

 
Mike Kharkov:
Поменял вот эту строчку кода у себя:
Ничего не изменилось в плане отображения на графике.

Извините, не правильно прочитал, проблему.  

Но вам уже написали правильный ответ )))

 
Igor Makanu:

в MQL5 буферный массив нужно инициализировать значением по умолчанию ( EMPTY_VALUE )

линия уходит вниз, т.к. там находится какое то значение из памяти ПК (мусор)

Как синтаксически корректно(и проще всего) организовать данную инициализацию?
(гайд на сайте предлагает создавать допольнительную сущность в виде PlotIndexSetDouble() - необходимо ли это?)

Документация по MQL5: Пользовательские индикаторы / PlotIndexSetDouble
Документация по MQL5: Пользовательские индикаторы / PlotIndexSetDouble
  • www.mql5.com
PlotIndexSetDouble - Пользовательские индикаторы - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

для Вашей задачи, возможно достаточно выполнить инициализации в секции OnInit()

примерно так:

int OnInit()
  {
//--- связывание массива и индикаторного буфера
   SetIndexBuffer(0,LineBuffer,INDICATOR_DATA);
   ArrayInitialize(LineBuffer, EMPTY_VALUE);
   return(INIT_SUCCEEDED);
  }
 
Igor Makanu:

для Вашей задачи, возможно достаточно выполнить инициализации в секции OnInit()

примерно так:

Не помогло - индикатор на графике имеет прежний вид.
В чем может быть причина?
Документация по MQL5: Операции с графиками / ChartIndicatorAdd
Документация по MQL5: Операции с графиками / ChartIndicatorAdd
  • www.mql5.com
//| Expert initialization function                                   |                                                                                       ); "Внимание! %s: Попробуем добавить индикатор MACD(%s/%s) на график %s/%s. Получим ошибку 4114"                         subwindow...
 
Mike Kharkov:
Не помогло - индикатор на графике имеет прежний вид.

не хотел ПК включать... )))

проверил, действительно в секции инициализации индикатора размер буферного массива равен 0

тогда здесь проинициализируйте индикаторный буфер:

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[])
  {
 if(prev_calculated == 0) ArrayInitialize(LineBuffer, EMPTY_VALUE);
 
Igor Makanu:

не хотел ПК включать... )))

))
Ok - теперь все работает - здорово!

 
Mike Kharkov:

))
Ok - теперь все работает - здорово!

Потому что линия строится по точкам и в последней линии крайнее значение отрезка равно нулю. Решение уже есть и есть еще одно, не строить последнюю линию. 

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