Отрисовка n последних баров в индикаторе. - страница 2

 

массив

high[i];
не тайм серия, а обычный массив.
 
CoreWinTT :

массив

не тайм серия, а обычный массив.

Совершенно правильно. high[i] соответствует хаям баров на графике. И зачем он так соответствует?

Насколько я понял, его нельзя превратить в таймсерию.

PS я попросил на предыдущей странице способ более легкий, чем тот, которым пользуюсь. Если он есть.

 
joo :

Совершенно правильно. high[i] соответствует хаям баров на графике. И зачем он так соответствует?

Насколько я понял, его нельзя превратить в таймсерию.

PS я попросил на предыдущей странице способ более легкий, чем тот, которым пользуюсь. Если он есть.

пользуйтесь встроенными функциями в мт5 доступам к данным 

и забудте про МК4 напрочь

оперируте сразу массивами, а не переборами

создайте дополнительный буфер и оперируйте с ним

мт5 не очень дружелюбен к олд скулл мкл4 пользователям

 

у меня покрайней мере мозги всетаки остались в мкл4 среде

и я работаю функциями

но в каждой функции я использую такие веши

как

вход

   bool inser=ArrayGetAsSeries(входной массив);
   bool outser=ArrayGetAsSeries(выходной массив);
   if(!inser) ArraySetAsSeries(входной массив,true);
   if(!outser) ArraySetAsSeries(выходной массив,true);


подготовка к обработке//без ресайза ваше никуда. не знаю почему но так работает лучше.

   Size = ArraySize(входной массив);
   ArrayResize(выходной массив,Size);


тут сама функция

выход 

   if(!inser) ArraySetAsSeries(входной массив,false);
   if(!outser) ArraySetAsSeries(выходной массив,false);

выходят сразу обработанные массивы

и передаю их дальше

либо в функцию где повторяются процедуры входа и выхода

и также определения размера

либюо уже не посредственно на график без обработки ибо в каждой функции позиционирование идёт нормально


также в расчетах страюсь обсчитывать определённое количество баров там 500 - 600 больше не надо поскольку, история не интересно

и нагружать процессор тоже особой надобности не вижу


учитывая все эти премудрости с доступом к данным к мкл у меня уже организованная своя среда доступа к данным и свои массивы в которых все лежит, как я понимаю

а как у вас там данные находятся я ваше невкурсах.....

Документация по MQL5: Доступ к таймсериям и индикаторам / Bars
Документация по MQL5: Доступ к таймсериям и индикаторам / Bars
  • www.mql5.com
Доступ к таймсериям и индикаторам / Bars - Документация по MQL5
 
CoreWinTT :

пользуйтесь встроенными функциями в мт5 доступам к данным 

Пользуюсь. Мой код смотрели или нет?

CoreWinTT :

....

оперируте сразу массивами, а не переборами

Это как? Переборами чего? Переборами элементов массива? Тогда непонятно выражение "оперируте сразу массивами".

CoreWinTT :

....

мт5 не очень дружелюбен к олд скулл мкл4 пользователям

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


 

Может вот так надо:

//+------------------------------------------------------------------+
//|                                                          joo.mq5 |
//|                                                           DC2008 |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "DC2008"
#property link      "http://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Hi
#property indicator_label1  "Hi"
#property indicator_type1   DRAW_LINE
#property indicator_color1  Red
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//-------------------------------------------------------------------
input int      History=100;
//-------------------------------------------------------------------
double         HiBuffer[];
//-------------------------------------------------------------------
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   ArraySetAsSeries(HiBuffer,true);
   SetIndexBuffer(0,HiBuffer,INDICATOR_DATA);
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,1);
   PlotIndexSetString(0,PLOT_LABEL,"HiBuffer");
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| 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 i=prev_calculated;
   while(i<rates_total)
     {
      if(i<History)
        {
         HiBuffer[i]=high[i];
        }
      else
        {
         HiBuffer[i]=0.0;
        }
      i++;
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

 
DC2008 :

Может вот так надо:

Не годится. Посмотрите:


Это тоже самое, что мой последний пример на предыдущей странице: здесь 0-й индекс индикаторного буфера соответствует самому старому бару на графике.

А надо, что бы 0-й индекс индикаторного буфера соответствует 0-му бару на графике.

 

Вот теперь правильно:

//+------------------------------------------------------------------+
//|                                                          joo.mq5 |
//|                                                           DC2008 |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "DC2008"
#property link      "http://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Hi
#property indicator_label1  "Hi"
#property indicator_type1   DRAW_LINE
#property indicator_color1  Red
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//-------------------------------------------------------------------
input int      History=100;
//-------------------------------------------------------------------
double         HiBuffer[],arr[];
//-------------------------------------------------------------------
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   if(ArrayResize(arr,History)<0) return(0);
   ArraySetAsSeries(HiBuffer,true);
   ArraySetAsSeries(arr,true);
   SetIndexBuffer(0,HiBuffer,INDICATOR_DATA);
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,1);
   PlotIndexSetString(0,PLOT_LABEL,"HiBuffer");
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//---
   ArrayCopy(arr,high);
   int    counted_bars=IndicatorCounted(prev_calculated);
   int i=0;
   while(i<counted_bars)
     {
      if(i<History)
        {
         HiBuffer[i]=arr[i];
        }
      else
        {
         HiBuffer[i]=0.0;
        }
      i++;
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
int IndicatorCounted(int prev_calculated)
  {
   if(prev_calculated>0) return(prev_calculated-1);
   if(prev_calculated==0) return(0);
   return(0);
  }
//+------------------------------------------------------------------+

 

или вот так:

//+------------------------------------------------------------------+
//|                                                          joo.mq5 |
//|                                                           DC2008 |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "DC2008"
#property link      "http://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Hi
#property indicator_label1  "Hi"
#property indicator_type1   DRAW_LINE
#property indicator_color1  Red
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//-------------------------------------------------------------------
input int      History=100;
//-------------------------------------------------------------------
double         HiBuffer[];
//-------------------------------------------------------------------
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   ArraySetAsSeries(HiBuffer,true);
   SetIndexBuffer(0,HiBuffer,INDICATOR_DATA);
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,1);
   PlotIndexSetString(0,PLOT_LABEL,"HiBuffer");
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//---
   ArraySetAsSeries(high,true);
   int    counted_bars=IndicatorCounted(prev_calculated);
   int i=0;
   while(i<counted_bars)
     {
      if(i<History)
        {
         HiBuffer[i]=high[i];
        }
      else
        {
         HiBuffer[i]=0.0;
        }
      i++;
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
int IndicatorCounted(int prev_calculated)
  {
   if(prev_calculated>0) return(prev_calculated-1);
   if(prev_calculated==0) return(0);
   return(0);
  }
//+------------------------------------------------------------------+

 
joo:

Совершенно правильно. high[i] соответствует хаям баров на графике. И зачем он так соответствует?

Насколько я понял, его нельзя превратить в таймсерию.

PS я попросил на предыдущей странице способ более легкий, чем тот, которым пользуюсь. Если он есть.

Нет, я не правильно понял. Можно.

И ни кто меня не поправил.

Вот и решение. Простое и эффективное:

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Hi
#property indicator_label1  "Hi"
#property indicator_type1   DRAW_LINE
#property indicator_color1  Red
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//-------------------------------------------------------------------
input int      History=100;
//-------------------------------------------------------------------
double         HiBuffer[];
//-------------------------------------------------------------------
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   ArraySetAsSeries(HiBuffer,true);
   SetIndexBuffer(0,HiBuffer,INDICATOR_DATA);
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,1);
   PlotIndexSetString(0,PLOT_LABEL,"HiBuffer");
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| 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[])
  {

   ArraySetAsSeries(high,true);

   int i=0;

   if(rates_total>prev_calculated)
   {
   while(i<History)
     {
      HiBuffer[i]=high[i];
      i++;
     }
   }
   return(rates_total);
  }
//+------------------------------------------------------------------+

И всего то нужно:

1) Обозвать буфер индикатора таймсерией в OnInit()

ArraySetAsSeries(HiBuffer,true);

2) Обозвать массив higt[] таймсерией в OnCalculate():

ArraySetAsSeries(high,true);

И всё!

PS Думаю, стоит явно указать в соответствующем разделе справки о такой возможности.

PPS Да, метод профессора Тычкова рулит. :)

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