Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Как протестировать программу перед покупкой?
Andrey Dik
10793
Andrey Dik 2016.01.22 22:26 

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

 

#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 2016.01.22 22:45  

Joo Zepper:

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

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

Andrey Dik
10793
Andrey Dik 2016.01.22 22:48  
zaskok3:

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

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

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

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

Andrey Dik
10793
Andrey Dik 2016.01.22 23:05  
zaskok3:

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

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

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

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

Andrey Dik
10793
Andrey Dik 2016.01.23 06:31  
zaskok3:

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

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

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

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

Andrey Dik
10793
Andrey Dik 2016.01.23 07:17  
Неужели никто больше подобного не делал, или просто не интересно?
Andrey Dik
10793
Andrey Dik 2016.01.23 08:31  

Победил...

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

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

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

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