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

[Удален]
Artyom Trishkin:

Алексей вам сказал, что сначала бы сделать так, чтобы ваш индикатор хотя бы просто свечи рисовал. Такие, какие они есть. Хотя бы на текущем баре. Как получится это сделать - считайте, что первый шаг к пониманию прошли. Но желательно, чтобы получилось не методом тыка и перебора разных параметров, а умом своим.

Причём тут "надо/не надо априори"? Оно вам очень надо - раз не можете свечу нарисовать из всего четырёх значений.

Вот написал совсем простенький тестовый индикатор, который должен нарисовать 5 свечей (реальных) с графика USDJPY,H8 

//+------------------------------------------------------------------+
//|                                                        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);
   
   ArrayInitialize(barsBuffer1   ,0.0);
   ArrayInitialize(barsBuffer2   ,0.0);
   ArrayInitialize(barsBuffer3   ,0.0);
   ArrayInitialize(barsBuffer4   ,0.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);
}
//+------------------------------------------------------------------+

В нём только отрисовка этих свечей, ничего более.

Но если запускаю - отрисовывается чёрте чё...

Ну объясните мне тупому, что я делаю не так?


Кстати, в документации опечатка:

const datetime&  time{},            // массив Time
Документация по MQL5: Обработка событий / OnCalculate
Документация по MQL5: Обработка событий / OnCalculate
  • www.mql5.com
события Calculate для обработки изменений ценовых данных. Существуют два варианта функции, в пределах одного индикатора нельзя использовать оба варианта. [in]  Размер массива price[] или входных таймсерий, доступных индикатору для расчета. Во втором варианте функции значение параметра соответствует количеству баров на графике, на котором он...
Файлы:
cTest.mq5  8 kb
Сергей Таболин:

Вот написал совсем простенький тестовый индикатор, который должен нарисовать 5 свечей (реальных) с графика USDJPY,H8 

В нём только отрисовка этих свечей, ничего более.

Но если запускаю - отрисовывается чёрте чё...

Ну объясните мне тупому, что я делаю не так?


Кстати, в документации опечатка:

В отладчике проверьте time[0] и ответьте на вопрос: "Зачем Вы пытаетесь рисовать свечи с САМОГО ЛЕВОГО КРАЯ графика???


Я же Вам говорил - используйте справку по DRAW_CANDLES . Копируйте пример из справки DRAW_CANDLES . Разберитесь в нем. А в тики вообще ещё рано Вам.

Документация по MQL5: Пользовательские индикаторы / Стили индикаторов в примерах / DRAW_CANDLES
Документация по MQL5: Пользовательские индикаторы / Стили индикаторов в примерах / DRAW_CANDLES
  • www.mql5.com
//|                                                 DRAW_CANDLES.mq5 | //|                        Copyright 2011, MetaQuotes Software Corp. | //|                                             https://www.mql5.com | "Рисует в отдельном окне разным цветом свечи по случайно выбранному из MarketWatch символу...
[Удален]
Vladimir Karputov:

В отладчике проверьте time[0] и ответьте на вопрос: "Зачем Вы пытаетесь рисовать свечи с САМОГО ЛЕВОГО КРАЯ графика???


Я же Вам говорил - используйте справку по DRAW_CANDLES . Копируйте пример из справки DRAW_CANDLES . Разберитесь в нем. А в тики вообще ещё рано Вам.

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

   ArraySetAsSeries(barsBuffer1  ,true);
   ArraySetAsSeries(barsBuffer2  ,true);
   ArraySetAsSeries(barsBuffer3  ,true);
   ArraySetAsSeries(barsBuffer4  ,true);

И цены свечей взяты реальные... И никаких тиков...

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

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

И цены свечей взяты реальные... И никаких тиков...

Возьмите же наконец пример из справки! Ну сколько можно? Не нужно использовать своих выдуманных конструкций, если не сильно понимаете их смысл. Используйте стандартные конструкции -  разберитесь как они работают. После этого выкиньте свои конструкции в мусорку.


И используйте для генерации шаблона 'MQL Wizard'.

Код

//+------------------------------------------------------------------+
//|                                                 Draw Candles.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_plots   1
//--- plot USDJPY
#property indicator_label1  "USDJPY"
#property indicator_type1   DRAW_CANDLES
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input int      Input1=9;
//--- indicator buffers
double   Buffer1[];
double   Buffer2[];
double   Buffer3[];
double   Buffer4[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Buffer1,INDICATOR_DATA);
   SetIndexBuffer(1,Buffer2,INDICATOR_DATA);
   SetIndexBuffer(2,Buffer3,INDICATOR_DATA);
   SetIndexBuffer(3,Buffer4,INDICATOR_DATA);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---
   int limit=prev_calculated-1;
   if(prev_calculated==0)
      limit=0;
   for(int i=limit; i<rates_total; i++)
     {
      Buffer1[i]=open[i];
      Buffer2[i]=high[i];
      Buffer3[i]=low[i];
      Buffer4[i]=close[i];
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

и результат


Файлы:
Как увеличить число оптимизируемых параметров в тестере? Может есть какие-нибудь виртуальные способы в MQL, может в Python или ещё где-нибудь ? Направление дайте, please...
[Удален]
Vladimir M.:
Как увеличить число оптимизируемых параметров в тестере? Может есть какие-нибудь виртуальные способы в MQL, может в Python или ещё где-нибудь ? Направление дайте, please...

OnTester()

[Удален]
Vladimir Karputov:

Возьмите же наконец пример из справки! Ну сколько можно? Не нужно использовать своих выдуманных конструкций, если не сильно понимаете их смысл. Используйте стандартные конструкции -  разберитесь как они работают. После этого выкиньте свои конструкции в мусорку.


И используйте для генерации шаблона 'MQL Wizard'.

Код

и результат


Владимир, такое чувство, что говорить пытаются немой с глухим...

  1. Я использовал шаблон 'MQL Wizard' 
  2. Что Вы допарились до моих конструкций? Они не хуже Ваших, тем более именно для моих нужд!

if(rates_total - prev_calculated > 1)

При запуске индикатора rates_total = ХХХ (допустим ХХХ = 1000), prev_calculated = 0, rates_total - prev_calculated (1000 - 0 = 1000) больше 1! Условие сработало!

Далее

if(prev_calculated == 0)

При запуске индикатора prev_calculated = 0. Условие сработало!

А далее объясните мне чем отличается Ваше

      Buffer1[i]=open[i];
      Buffer2[i]=high[i];
      Buffer3[i]=low[i];
      Buffer4[i]=close[i];

от моего 

            barsBuffer1[0] = newCandles_Open[i];
            barsBuffer2[0] = newCandles_High[i];
            barsBuffer3[0] = newCandles_Low[i];
            barsBuffer4[0] = newCandles_Close[i];

с учётом того, что у меня выставлено ArraySetAsSeries в true ???

Почему Ваши свечи отрисовываются, а мои нет?

Я уже почти 2 недели прошу мне объяснить это! Не нужно меня отправлять читать документацию! Я её уже почти наизусть выучил. Просто скажите ПОЧЕМУ? Или объясните, или скажите, что не знаете, или скажите, что не хотите отвечать!

Блин, Вы часом не забыли название этой темы?

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


Может так? У Вас все индексы присваиваются в буферах нулевому индексу.

            barsBuffer1[i] = newCandles_Open[i];
            barsBuffer2[i] = newCandles_High[i];
            barsBuffer3[i] = newCandles_Low[i];
            barsBuffer4[i] = newCandles_Close[i];
Сергей Таболин:


Так я и пытаюсь Вас научить: без конца даю Вам примеры - но Вы упорно пытаетесь биться головой об стену. 

Повторю последний раз: выкиньте в мусорку свои конструкции и используйте стандартные. После этого можно будет задать вопрос: как отрисовать (например пять самых правых свеч на графике) по своим правилам. Но не ранее чем Вы выкините свои конструкции, не ранее чем Вы прекратите использовать префиксный инкремент вместо постфиксного ...

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


Пример

//+------------------------------------------------------------------+
//|                                                 Draw Candles.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_plots   1
//--- plot USDJPY
#property indicator_label1  "USDJPY"
#property indicator_type1   DRAW_CANDLES
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input int      Input1=9;
//--- indicator buffers
double   Buffer1[];
double   Buffer2[];
double   Buffer3[];
double   Buffer4[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Buffer1,INDICATOR_DATA);
   SetIndexBuffer(1,Buffer2,INDICATOR_DATA);
   SetIndexBuffer(2,Buffer3,INDICATOR_DATA);
   SetIndexBuffer(3,Buffer4,INDICATOR_DATA);
//--- the 0 (empty) value will mot participate in drawing
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
   if(rates_total<10)
      return(0);
//---
   int limit=prev_calculated-5;
   if(prev_calculated==0)
     {
      limit=rates_total-5;
      for(int j=0; j<limit; j++)
        {
         Buffer1[j]=0.0;
         Buffer2[j]=0.0;
         Buffer3[j]=0.0;
         Buffer4[j]=0.0;
        }
     }
   for(int i=limit; i<rates_total; i++)
     {
      if(i<rates_total-5)
        {
         //--- затираем всё, что левее пяти свеч (сюда попадаем при рождении нового бара)
         Buffer1[i]=0.0;
         Buffer2[i]=0.0;
         Buffer3[i]=0.0;
         Buffer4[i]=0.0;
         continue;
        }
      //--- четыре левые свечи будут перерисовываться на каждом тике - это не оптимально,
      //--- но пригодится в будущем (если для них потом подсовывать тики)
      //--- пятая свеча (она же самая правая на графике) реагирует онлайн на изменение текущих цен
      Buffer1[i]=open[i];
      Buffer2[i]=high[i];
      Buffer3[i]=low[i];
      Buffer4[i]=close[i];
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Результат:


Файлы: