Члены структуры как буферы индикатора.

 

Пытаюсь сделать удобный доступ к многочисленным свечным буферам индикатора. Хочу, что бы структура описывала свечу. Делаю так:

 

#property indicator_separate_window
#property indicator_buffers         250
#property indicator_plots           250
//——————————————————————————————————————————————————————————————————————————————


//------------------------------буферы индикатора-------------------------------
struct S_Buff
{
  double Opn_buff []; 
  double Hig_buff []; 
  double Low_buff []; 
  double Clo_buff []; 
  double Clr_Buff [];
}; 

S_Buff Buff []; 
int    bufCount = 50; 
//------------------------------------------------------------------------------

//——————————————————————————————————————————————————————————————————————————————
int OnInit() 
{ 
  EventSetMillisecondTimer(100); 
  IndicatorSetInteger(INDICATOR_DIGITS, 5); 
  /*
  //--- set levels
  IndicatorSetInteger(INDICATOR_LEVELS, 1); 
  IndicatorSetDouble(INDICATOR_LEVELVALUE,  0, 0.0); 
  IndicatorSetInteger(INDICATOR_LEVELSTYLE, 0, 1); 
  IndicatorSetInteger(INDICATOR_LEVELWIDTH, 0, 0); 
  IndicatorSetInteger(INDICATOR_LEVELCOLOR, 0, clrGray); 
  */
  ArrayResize(Buff, bufCount); 
  
  for(int i = 0; i < bufCount; i++) 
  {
    SetIndexBuffer(i * 5 + 0, Buff[i].Opn_buff, INDICATOR_DATA);        ArraySetAsSeries(Buff[i].Opn_buff, true); 
    SetIndexBuffer(i * 5 + 1, Buff[i].Hig_buff, INDICATOR_DATA);        ArraySetAsSeries(Buff[i].Hig_buff, true); 
    SetIndexBuffer(i * 5 + 2, Buff[i].Low_buff, INDICATOR_DATA);        ArraySetAsSeries(Buff[i].Low_buff, true); 
    SetIndexBuffer(i * 5 + 3, Buff[i].Clo_buff, INDICATOR_DATA);        ArraySetAsSeries(Buff[i].Clo_buff, true); 
    SetIndexBuffer(i * 5 + 4, Buff[i].Clr_Buff, INDICATOR_COLOR_INDEX); ArraySetAsSeries(Buff[i].Clr_Buff, true); 
    
    PlotIndexSetDouble(i * 5 + 0,  PLOT_EMPTY_VALUE, EMPTY_VALUE); 
    PlotIndexSetDouble(i * 5 + 1,  PLOT_EMPTY_VALUE, EMPTY_VALUE); 
    PlotIndexSetDouble(i * 5 + 2,  PLOT_EMPTY_VALUE, EMPTY_VALUE); 
    PlotIndexSetDouble(i * 5 + 3,  PLOT_EMPTY_VALUE, EMPTY_VALUE); 
    //PlotIndexSetDouble(i * 5 + 4,  PLOT_EMPTY_VALUE, EMPTY_VALUE); 
    
    PlotIndexSetInteger(i * 5 + 0, PLOT_DRAW_TYPE, DRAW_COLOR_CANDLES); 
    //PlotIndexSetInteger(i * 5 + 1, PLOT_DRAW_TYPE, DRAW_COLOR_CANDLES); 
    //PlotIndexSetInteger(i * 5 + 2, PLOT_DRAW_TYPE, DRAW_COLOR_CANDLES); 
    //PlotIndexSetInteger(i * 5 + 3, PLOT_DRAW_TYPE, DRAW_COLOR_CANDLES); 
    //PlotIndexSetInteger(i * 5 + 4, PLOT_DRAW_TYPE, DRAW_COLOR_CANDLES); 
    
    PlotIndexSetInteger(i * 5 + 0, PLOT_COLOR_INDEXES, 3); 
    PlotIndexSetInteger(i * 5 + 0, PLOT_LINE_COLOR, 0, CLR_NONE);
    PlotIndexSetInteger(i * 5 + 0, PLOT_LINE_COLOR, 1, clrBlue); 
    PlotIndexSetInteger(i * 5 + 0, PLOT_LINE_COLOR, 2, clrRed); 
    
    PlotIndexSetInteger(i, PLOT_LINE_WIDTH, 1); 
    //PlotIndexSetString(i,  PLOT_LABEL, string(i)); 
    
    //PlotIndexSetDouble(i,  PLOT_EMPTY_VALUE, EMPTY_VALUE);
  }
  //----------------------------------------------------------------------------
  
  //BuffersClean(); 
  
  return (INIT_SUCCEEDED);
}
//——————————————————————————————————————————————————————————————————————————————

//——————————————————————————————————————————————————————————————————————————————
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<1000; i++) 
  {
    Buff[0].Opn_buff[i] = open[i]; 
    Buff[0].Hig_buff[i] = high[i]; 
    Buff[0].Low_buff[i] = low[i]; 
    Buff[0].Clo_buff[i] = close[i];
    Buff[0].Clr_Buff[i] = 1; 
  }
  */
  for(int i=0; i<1000; i++) 
  {
    Buff[1].Opn_buff[i] = open[i]; 
    Buff[1].Hig_buff[i] = high[i]; 
    Buff[1].Low_buff[i] = low[i]; 
    Buff[1].Clo_buff[i] = close[i];
    Buff[1].Clr_Buff[i] = 1; 
  }
  
  /*
  for(int i=0; i<1000; i++) 
  {
    Buff[2].Opn_buff[i] = open[i]; 
    Buff[2].Hig_buff[i] = high[i]; 
    Buff[2].Low_buff[i] = low[i]; 
    Buff[2].Clo_buff[i] = close[i];
    Buff[2].Clr_Buff[i] = 1; 
  } 
  for(int i=0; i<1000; i++) 
  {
    Buff[3].Opn_buff[i] = open[i]; 
    Buff[3].Hig_buff[i] = high[i]; 
    Buff[3].Low_buff[i] = low[i]; 
    Buff[3].Clo_buff[i] = close[i];
    Buff[3].Clr_Buff[i] = 1; 
  } */
  
  return (rates_total);
}
//——————————————————————————————————————————————————————————————————————————————

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

 

Joo Zepper:

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

Буфер в виде структуры не пробовал, поэтому ответить на вопрос не смогу. А вот за класс ручаюсь - с работоспособностью не было проблем.

 
zaskok3:

Буфер в виде структуры не пробовал, поэтому ответить на вопрос не смогу. А вот за класс ручаюсь - с работоспособностью не было проблем.

Проблема точно не в этом, только что попробовал.
 

Проверил ваш исходник в MT4, закомментив MQL5-строки. Все пашет, как надо. Значит, в MT5 дело.

ЗЫ Сам буферы делаю в виде классов, которые сами определяют свой номер и прочее. Хватает просто new, про остальное можно забыть. Это позволяет делать буферы интерактивными (плясать, мерцать, менять масштаб под масштаб чарта и т.д.) опять же только одной new.

 
zaskok3:

ЗЫ Сам буферы делаю в виде классов, которые сами определяют свой номер и прочее. Хватает просто new, про остальное можно забыть. Это позволяет делать буферы интерактивными (плясать, мерцать, менять масштаб под масштаб чарта и т.д.) опять же только одной new.

в 5-ке?
 
Joo Zepper:
в 5-ке?
4-ка.
 
zaskok3:
4-ка.
дак в 4-ке и у меня проблем нет.
вопрос в том, почему сдесь не пашет?.... 
 
Joo Zepper:
вопрос в том, почему сдесь не пашет?.... 

Скорее всего, дело в DRAW_COLOR_CANDLES. Думаю, если заменить на какой-нибудь древний тип - будет работать.

Может, MT5 отрисовывает только один ряд свечей.. и на несколько свечных рядов просто не рассчитан.

 
zaskok3:

Скорее всего, дело в DRAW_COLOR_CANDLES. Думаю, если заменить на какой-нибудь древний тип - будет работать.

Может, MT5 отрисовывает только один ряд свечей.. и на несколько свечных рядов просто не рассчитан.

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

Забавно то, что я уже делал подобное раньше, и работало... Но коды те старые не могу уже найти. 

 
Неужели никто больше подобного не делал, или просто не интересно?
 

Победил...

Но... меня этот MQL5 просто выбешивает! Где элементарная логика?!!!!

Никто никогда не догадается с первого раза как нужно сделать правильно, и ведь в справке об этом ни слова!!! 

Только путём бесконечных экспериментов приходишь к тому, что задумано.... Но ведь так везде в MT5, куда ни ткни..  

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