Пропадает график индикатора - страница 2

 
prostotrader:

Нормальные данные не пустые, а меняются.

Но вседа небольшие отрицательные целые числа

Не туда копаем.

Повторяю, когда ставим

Все работает НОРМАЛЬНО

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

PS. И зачем постить один и тот же вопрос в разные ветки форума?

 
Stanislav Korotky:

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

PS. И зачем постить один и тот же вопрос в разные ветки форума?

Никакого мусора в буфере нет.

Это, скорее всего, ошибка отображения графика индикатора, поэтому и написал в "Ошибки", чтобы

разработчики видели

 
prostotrader:

Никакого мусора в буфере нет.

Это, скорее всего, ошибка отображения графика индикатора, поэтому и написал в "Ошибки", чтобы

разработчики видели

Рекомендую проверить, а не утверждать голословно. Ядро присылает данные по своему хитрому усмотрению, и в коде индикатора может не отрабатываться ситуация, когда некоторые бары невалидны. И все симптомы указывают именно на это.

 
Ilya Baranov:

Подробнее, пожалуйста. Они случайно не все одинаковые, или все кроме одного пустые?

prostotrader:

Нормальные данные не пустые, а меняются.

Исчезновение происходит тогда, когда отображаемые данные (50 шт) одинаковые, но не пустые. Почему-то не хочет линия из одинаковых значений отрисовываться нормально.

 
Stanislav Korotky:

Рекомендую проверить, а не утверждать голословно. Ядро присылает данные по своему хитрому усмотрению, и в коде индикатора может не отрабатываться ситуация, когда некоторые бары невалидны. И все симптомы указывают именно на это.

Похоже это Вы утверждаете голословно.

В коде все есть, в том числе текущее отображение буфера 

ObjectSetString(ChartID(),"BR_label_1",OBJPROP_TEXT,"Буфер: " + DoubleToString(Buff[0])); 
  ChartRedraw();
 
Alexey Kozitsyn:

Исчезновение происходит тогда, когда отображаемые данные (50 шт) одинаковые, но не пустые. Почему-то не хочет линия из одинаковых значений отрисовываться нормально.

Да, я сильно удивлён....

Добавлено

Точно "косяк" Терминала

Так работает :)

//+------------------------------------------------------------------+
//|                                                   BR_Scalper.mq5 |
//|                                      Copyright 2019 prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019 prostotrader"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1

//--- plot Label1
#property indicator_label1  "Spread"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrYellow
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1


#define on_call -111
//
input int NextFutMonth = 1;    //След фьючерс (мес.)
input int aBars = 50;          //Бары  
//
double Buff[];//, BuyBuff[];
double pr_last, sec_last;
string sec_symbol;
bool pr_book, sec_book;
int event_cnt;

//+------------------------------------------------------------------+
//| Indicator Set second Symbols function                            |
//+------------------------------------------------------------------+
string SetSecSymbol(const string aSymbol)
{
  int str_tire = StringFind(aSymbol, "-");
  int str_tochka = StringFind(aSymbol, ".", str_tire);
  int str_size = StringLen(aSymbol);
  if((str_tire > 0) && (str_tochka > 0) && (str_size > 0))
  {
    string str_month = StringSubstr(aSymbol, str_tire + 1, str_tochka - str_tire - 1);
    string str_year = StringSubstr(aSymbol, str_tochka + 1, str_size - str_tochka - 1);
    long aMonth = StringToInteger(str_month);
    long aYear = StringToInteger(str_year);
    if((aMonth > 0) && (aYear > 0))
    {
      long n_month = aMonth + long(NextFutMonth);
      long add_year = (n_month - 1) / 12;
      aYear += add_year;
      str_year = IntegerToString(aYear); 
      aMonth = n_month - add_year * 12;
      str_month = IntegerToString(aMonth);
      return(StringSubstr(aSymbol, 0, str_tire + 1) + str_month + "." + str_year);
    } 
  }
  return("");
}
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
  event_cnt = 0;
  sec_symbol = SetSecSymbol(Symbol());
  if(SymbolSelect(sec_symbol, true) == false)
  {
    return(INIT_FAILED);
  }
  pr_book = MarketBookAdd(Symbol());
  sec_book = MarketBookAdd(sec_symbol);
  IndicatorSetInteger(INDICATOR_DIGITS, 0);
  IndicatorSetString(INDICATOR_SHORTNAME, "BR_Scalper");
//---  
  SetIndexBuffer(0, Buff, INDICATOR_DATA);
  PlotIndexSetDouble( 0, PLOT_EMPTY_VALUE, EMPTY_VALUE);
  ArraySetAsSeries(Buff, true );
//---Set objects
   int window=ChartWindowFind(ChartID(),"BR_Scalper");
   ObjectCreate(ChartID(),"BR_label_1",OBJ_LABEL,window,0,0);
   ObjectSetInteger(ChartID(),"BR_label_1",OBJPROP_YDISTANCE,15);
   ObjectSetInteger(ChartID(),"BR_label_1",OBJPROP_XDISTANCE,5);
   ObjectSetInteger(ChartID(),"BR_label_1",OBJPROP_COLOR,clrWhite);
   ObjectSetString(ChartID(),"BR_label_1",OBJPROP_TEXT,"Буфер: 0");

   
  return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
// Custom indicator DeInit function                                  |
//+------------------------------------------------------------------+
void OnDeinit( const int reason )
{
  ObjectDelete(ChartID(),"BR_label_1");
  if(pr_book == true) MarketBookRelease(Symbol());
  if(sec_book == true) MarketBookRelease(sec_symbol);
  if(reason == REASON_INITFAILED)
  {
    Print("Индикатор удалён! Причина - ошибка инициализации.");
    string short_name = ChartIndicatorName(ChartID(), 1, 0);
    ChartIndicatorDelete(ChartID(), 1, short_name); 
  }
}
//+------------------------------------------------------------------+
// Custom indicator On book event function                           |
//+------------------------------------------------------------------+
void OnBookEvent( const string& symbol )
{
  if((symbol == Symbol()) || (symbol == sec_symbol))
  {
    sec_last = SymbolInfoDouble(sec_symbol, SYMBOL_LAST);
    pr_last = SymbolInfoDouble(Symbol(), SYMBOL_LAST);
//---
    double price[]; 
    OnCalculate( event_cnt, event_cnt, on_call, price ); 
  }
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
{
  if(prev_calculated == 0)
  {
    ArrayInitialize(Buff, EMPTY_VALUE);
    sec_last = SymbolInfoDouble(sec_symbol, SYMBOL_LAST);
    pr_last = SymbolInfoDouble(Symbol(), SYMBOL_LAST);
  }
  else
  {
    if(begin == on_call)
    {
      for(int i = aBars - 1; i > 0; i--)
      {
        Buff[i] = Buff[i - 1];
      }
    }
    else
    {
      sec_last = SymbolInfoDouble(sec_symbol, SYMBOL_LAST);
      pr_last = SymbolInfoDouble(Symbol(), SYMBOL_LAST);
    }
  }
  Buff[aBars] = EMPTY_VALUE;
  Buff[0] = (sec_last - pr_last) /Point(); 
  Buff[1] = Buff[0] + 1;
  ObjectSetString(ChartID(),"BR_label_1",OBJPROP_TEXT,"Буфер: " + DoubleToString(Buff[0])); 
  ChartRedraw();
//---    
  event_cnt = rates_total;  
//--- return value of prev_calculated for next call
  return(rates_total);
}
 

Так тоже работает :)

Buff[aBars + 1] = EMPTY_VALUE;
Buff[0] = (sec_last - pr_last) /Point(); 
Buff[aBars] = Buff[0] + 1;
ObjectSetString(ChartID(),"BR_label_1",OBJPROP_TEXT,"Буфер: " + DoubleToString(Buff[0])); 
ChartRedraw();
 
 Если все данные одинаковые, то действительно, если максимум/минимум окна не заданы, ничего не рисуется.
 
prostotrader:

Похоже это Вы утверждаете голословно.

В коде все есть, в том числе текущее отображение буфера 

Вы видимо читаете как-то избирательно. Я рекомендовал проверить все значения, а не только последнее. Если б вывели в лог значения всех баров (в пределах окна), сразу бы стало понятно, в чем дело.

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

 
Stanislav Korotky:

Вы видимо читаете как-то избирательно. Я рекомендовал проверить все значения, а не только последнее. Если б вывели в лог значения всех баров (в пределах окна), сразу бы стало понятно, в чем дело.

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

Проверял все значения - все нормально. Да и сразу идет инициализация пустыми значениями.

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