Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Andrey Dik
12058
Andrey Dik  

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

 

#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);
}
//——————————————————————————————————————————————————————————————————————————————

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

zaskok3
624
zaskok3  

Joo Zepper:

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

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

Andrey Dik
12058
Andrey Dik  
zaskok3:

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

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

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

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

Andrey Dik
12058
Andrey Dik  
zaskok3:

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

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

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

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

Andrey Dik
12058
Andrey Dik  
zaskok3:

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

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

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

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

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

Победил...

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

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

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

12345
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий