Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1243

[Удален]  
Vladimir Karputov:

Пример

Результат:


Спасибо, Владимир. Мне абсолютна понятна логика работы Вашего примера. Верите?

 
Сергей Таболин:

Спасибо, Владимир. Мне абсолютна понятна логика работы Вашего примера. Верите?

Я не Владимир, но всё ж спрошу: а что не получается? Уже давно всё утекло, и искать ваш пример нет желания. Продублируйте пожалуйста ещё раз.

[Удален]  
Artyom Trishkin:

Я не Владимир, но всё ж спрошу: а что не получается? Уже давно всё утекло, и искать ваш пример нет желания. Продублируйте пожалуйста ещё раз.

Вот мой пример:

//+------------------------------------------------------------------+
//|                                                        cTest.mq5 |
//|                                     Copyright 2020, Tabolin S.N. |
//|                           https://www.mql5.com/ru/users/vip.avos |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, Tabolin S.N."
#property link      "https://www.mql5.com/ru/users/vip.avos"
#property version   "1.00"
//#property indicator_separate_window
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_plots   1
//--- plot bars
#property indicator_label1  "bars"
#property indicator_type1   DRAW_CANDLES
#property indicator_color1  clrGold
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- indicator buffers
double   barsBuffer1[];
double   barsBuffer2[];
double   barsBuffer3[];
double   barsBuffer4[];
//+------------------------------------------------------------------+
double   newCandles_Open[5]   = {106.785, 106.724, 106.760, 106.767, 106.769};
double   newCandles_High[5]   = {106.792, 106.765, 106.780, 106.781, 106.769};
double   newCandles_Low[5]    = {106.716, 106.719, 106.746, 106.758, 106.715};
double   newCandles_Close[5]  = {106.724, 106.760, 106.766, 106.769, 106.725};

int      tick_count           = 0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
   SetIndexBuffer(0, barsBuffer1, INDICATOR_DATA);
   SetIndexBuffer(1, barsBuffer2, INDICATOR_DATA);
   SetIndexBuffer(2, barsBuffer3, INDICATOR_DATA);
   SetIndexBuffer(3, barsBuffer4, INDICATOR_DATA);
   
   ArraySetAsSeries(barsBuffer1  ,true);
   ArraySetAsSeries(barsBuffer2  ,true);
   ArraySetAsSeries(barsBuffer3  ,true);
   ArraySetAsSeries(barsBuffer4  ,true);
   
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0);
   PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,0);
   PlotIndexSetDouble(3,PLOT_EMPTY_VALUE,0);
   
   ArrayInitialize(barsBuffer1   ,0);
   ArrayInitialize(barsBuffer2   ,0);
   ArrayInitialize(barsBuffer3   ,0);
   ArrayInitialize(barsBuffer4   ,0);
//---
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int  OnCalculate(
   const int        rates_total,       // размер входных таймсерий
   const int        prev_calculated,   // количество обработанных баров на предыдущем вызове
   const datetime&  time[],            // массив Time
   const double&    open[],            // массив Open
   const double&    high[],            // массив High
   const double&    low[],             // массив Low
   const double&    close[],           // массив Close
   const long&      tick_volume[],     // массив Tick Volume
   const long&      volume[],          // массив Real Volume
   const int&       spread[]           // массив Spread
   )
{
   if(rates_total - prev_calculated > 1)
   {
      if(prev_calculated == 0)
      {
         Print("~~~~ Предварительный расчёт индикатора.");
         for(int i = 0; i < 5; i++)
         {
            barsBuffer1[0] = newCandles_Open[i];
            barsBuffer2[0] = newCandles_High[i];
            barsBuffer3[0] = newCandles_Low[i];
            barsBuffer4[0] = newCandles_Close[i];
         }
         Print("~~~~ Предварительный расчёт индикатора закончен.");
      }
      else return(0);
   }
   else Print("tick_count = ",++tick_count);
//--- return value of prev_calculated for next call
   return(rates_total);
}
//+------------------------------------------------------------------+
Если поменять barsBuffer1[0] на barsBuffer1[i] , то рисуется. Но как тогда добавлять новую свечу
 
Сергей Таболин:

Вот мой пример:

Если поменять barsBuffer1[0] на barsBuffer1[i] , то рисуется. Но как тогда добавлять новую свечу

Не все массивы имеют одинаковую направленность.

[Удален]  
Artyom Trishkin:

Не все массивы имеют одинаковую направленность.

Я понимаю, но ведь я и задавал при инициализации ArraySetAsSeries(barsBuffer1  ,true); ! 

Ну это ещё пол-беды. А вот как добавить новую свечу - ума не приложу.

Пробовал так: 

.........
   else
   {
      Print("tick_count = ",++tick_count);
      if(tick_count >= 5)
      {
         Print("Добавляем свечу.");
         
         double   O[1], H[1], L[1], C[1];
         O[0]  = newCandles_Open[3];
         H[0]  = newCandles_High[3];
         L[0]  = newCandles_Low[3];
         C[0]  = newCandles_Close[3];
         
         ArrayResize(barsBuffer1,ArraySize(barsBuffer1)+1);
         ArrayResize(barsBuffer2,ArraySize(barsBuffer2)+1);
         ArrayResize(barsBuffer3,ArraySize(barsBuffer3)+1);
         ArrayResize(barsBuffer4,ArraySize(barsBuffer4)+1);
         
         ArrayInsert(barsBuffer1,O,0);
         ArrayInsert(barsBuffer2,H,0);
         ArrayInsert(barsBuffer3,L,0);
         ArrayInsert(barsBuffer4,C,0);
         
         tick_count = 0;
      }
   }
//--- return value of prev_calculated for next call
   return(rates_total);
}

Не получается... (((

 
Сергей Таболин:

Я понимаю, но ведь я и задавал при инициализации ArraySetAsSeries(barsBuffer1  ,true); ! 

Ну это ещё пол-беды. А вот как добавить новую свечу - ума не приложу.

Пробовал так: 

Не получается... (((

Я конечно прошу прощения, но массивы, назначенные индикаторными буферами, нельзя ресайзить - этим занимается подсистема терминала.

   SetIndexBuffer(0, barsBuffer1, INDICATOR_DATA);
   SetIndexBuffer(1, barsBuffer2, INDICATOR_DATA);
   SetIndexBuffer(2, barsBuffer3, INDICATOR_DATA);
   SetIndexBuffer(3, barsBuffer4, INDICATOR_DATA);
         ArrayResize(barsBuffer1,ArraySize(barsBuffer1)+1);
         ArrayResize(barsBuffer2,ArraySize(barsBuffer2)+1);
         ArrayResize(barsBuffer3,ArraySize(barsBuffer3)+1);
         ArrayResize(barsBuffer4,ArraySize(barsBuffer4)+1);

Пересмотрите свою логику. Я её вообще не знаю, и могу лишь показать что вопиюще не так.

[Удален]  
Artyom Trishkin:

Я конечно прошу прощения, но массивы, назначенные индикаторными буферами, нельзя ресайзить - этим занимается подсистема терминала.

Пересмотрите свою логику. Я её вообще не знаю, и могу лишь показать что вопиюще не так.

Так я тоже это понимаю, но...

Артём, если индикаторным буфером управляет подсистема, то получается, что и увеличивает его размер тоже она? Другими словами, пока на графике не появится новая свеча, новую индикаторную свечу на графике нарисовать тоже нельзя?

 
Сергей Таболин:

Так я тоже это понимаю, но...

Артём, если индикаторным буфером управляет подсистема, то получается, что и увеличивает его размер тоже она? Другими словами, пока на графике не появится новая свеча, новую индикаторную свечу на графике нарисовать тоже нельзя?

Что понимать под "новую свечу нарисовать"?

Можно всяких нарисовать, но добавить баров не получится - их нету ещё.

Да, сам терминал заботится о размере индикаторных массивов. И ещё даёт данные о том, сколько их было на прошлом вызове.

[Удален]  
Artyom Trishkin:

Что понимать под "новую свечу нарисовать"?

Можно всяких нарисовать, но добавить баров не получится - их нету ещё.

Да, сам терминал заботится о размере индикаторных массивов. И ещё даёт данные о том, сколько их было на прошлом вызове.

Спасибо, вот теперь я понимаю почему у меня не получается.

Тогда последний вопрос. Я знаю, что можно выводить в индикаторе свечи с другого ТФ. Если текущий H2, а выводятся свечи с H1, то получается что за время жизни одной свечи нужно нарисовать 2 в индикаторе. Как же это происходит если буфер увеличивает только система? Или ссылку на пример, если не сложно. Может дотумкаю )))

 
Сергей Таболин:

Спасибо, вот теперь я понимаю почему у меня не получается.

Тогда последний вопрос. Я знаю, что можно выводить в индикаторе свечи с другого ТФ. Если текущий H2, а выводятся свечи с H1, то получается что за время жизни одной свечи нужно нарисовать 2 в индикаторе. Как же это происходит если буфер увеличивает только система? Или ссылку на пример, если не сложно. Может дотумкаю )))

Примеры я давал в последних своих статьях по индикаторам, но там всё завязано на библиотеке.

А чтобы понять как рисовать две свечи вместо одной - поглядите на график. Во сколько времени была открыта свеча на Н2, и где нахоится свеча с тем же временем на Н1. Всё станет ясно.