Параметр ma_shift (смещение индикатора по горизонтали) в индикаторе iMA

 

Добрый день.

Для чего теперь служит парметр ma_shift в в индикаторе iMA и как им правильно пользоваться? В MQL4 он отвечал за смещение графика индикатора по горизонтали на определенное число баров. Я пробовал изменять этот параметр в MQL5, но логики так и не понял, на графике абсолютно непонятные результаты.

Стоит задача написать индикатор типа Аллигатора. Посмотрел пример пользовательского индикатора "Аллигатор" в МТ5, там смещение графиков по горизонтали реализовано с помощью конструкции PlotIndexSetInteger(0, PLOT_SHIFT, Shift), но в этом случае смещение происходит только на графике, в буфере данные хранятся безо всякого смещения, а мне необходимо, чтобы смещение было уже в буфере (для проведения дальнейших вычислений). Конечно, несложно подобноо рода манипуляцию реализовать непосредственно в коде, но хотелось бы предварительно разобраться с назначением и способом работы с этим параметром.

Переход на новые рельсы: пользовательские индикаторы в MQL5
Переход на новые рельсы: пользовательские индикаторы в MQL5
  • 2009.11.23
  • Андрей
  • www.mql5.com
Я не буду перечислять все новые возможности и особенности нового терминала и языка. Их действительно много, и некоторые новинки вполне достойны освещения в отдельной статье. Вы не увидите здесь кода, написанного по принципам объектно-ориентированного программирования — это слишком серьезная тема для того, чтобы просто быть упомянутой в контексте как дополнительная вкусность для кодописателей. В этой статье остановимся подробней на индикаторах, их строении, отображении, видах, а также особенностях их написания по сравнению с MQL4.
 

Да, так и есть, и об этом сказано в справке - https://www.mql5.com/ru/docs/indicators/ialligator

[in]  Смещение зеленой линии относительно графика цены. Необходимо помнить, что смещение линии является чисто визуальным для отображения и значения в индикаторном буфере хранятся без смещения. При получении значений буфера функцией CopyBuffer() значение смещения никакого эффекта иметь не будет.


Документация по MQL5: Технические индикаторы / iAlligator
Документация по MQL5: Технические индикаторы / iAlligator
  • www.mql5.com
Технические индикаторы / iAlligator - Документация по MQL5
 

Чем дальше в лес, тем страшнее - сплошь и рядом нелогичные, неочевидные решения

Похоже, что с 300 билда только разработчики смогут понимать как всем этим добром пользоваться

Простите за столь резкую форму высказывания, но мне уже поднадоели постоянные исключения из правил

MQL5 по ощущениям от использования становится очень похожим на продукты от Микрософт ((( 

 

Вы что-то путаете - работа с shift параметром точно такая же как и в MetaTrader 4.

Shift используется исключительно для визуализации и в выдаче CopyXXX функций (там данные выдаются со смещением).


Использование shift только для визуацилизации абсолютно разумно - не будем же мы менять размерность массивов для каждой такой линии, особенно при их глубоком выходе за правый край экрана.
Документация по MQL5: Операции с массивами / ArrayRange
Документация по MQL5: Операции с массивами / ArrayRange
  • www.mql5.com
Операции с массивами / ArrayRange - Документация по MQL5
 

У меня сложилась ситуация, надо вытащить данные Аллигатора (а именно линии Teeth) для 10 баров, в массиве оказываются данные со смещением назад на 4 бара. Т.е. для нулевого индекса массива данные 4-го бара, для 1-го индекса - 5-го бара и т.д. Объясните, пожалуйста, может я чего не понял или не так сделал...

double aligator[];
 ArraySetAsSeries(aligator,true);
 int alig=iAlligator(_Symbol,0,13,8,8,5,5,3,MODE_SMMA,PRICE_MEDIAN);
 int counted=CopyBuffer(alig,1,0,10,aligator);
 if(counted>0) 
   {
       for(int i=0;i<10;i++)
         {
             Alert("Бар №",i," = ",NormalizeDouble(aligator[i],_Digits));
         }

   }
  
 
В справке по функции iAlligator сказано:

jaw_shift

[in]  Смещение синей линии относительно графика цены. Необходимо помнить, что смещение линии является чисто визуальным для отображения и значения в индикаторном буфере хранятся без смещения. При получении значений буфера функцией CopyBuffer() значение смещения никакого эффекта иметь не будет.

teeth_period

[in]  Период усреднения красной линии (зубов аллигатора).

teeth_shift

[in]  Смещение красной линии относительно графика цены. Необходимо помнить, что смещение линии является чисто визуальным для отображения и значения в индикаторном буфере хранятся без смещения. При получении значений буфера функцией CopyBuffer() значение смещения никакого эффекта иметь не будет.

lips_period

[in]  Период усреднения зеленой линии (губ аллигатора).

lips_shift

[in]  Смещение зеленой линии относительно графика цены. Необходимо помнить, что смещение линии является чисто визуальным для отображения и значения в индикаторном буфере хранятся без смещения. При получении значений буфера функцией CopyBuffer() значение смещения никакого эффекта иметь не будет.


 

Я полностью согласен, но смещение получается на 4 бара между буфером и графиком,

а я хотел получить данные именно для конкретного бара... Подскажите как это можно реализовать? Как вытянуть данные для 0-го бара, 1-го и т.д.?

 
Парадоксально, но Jaws линия (челюсти) совпадает по барам, полное соответствие без всякого смещения... Линия Laps (губы) смещается на 3 бара... Непонятно почему такое происходит?
 
slyusar:
Парадоксально, но Jaws линия (челюсти) совпадает по барам, полное соответствие без всякого смещения... Линия Laps (губы) смещается на 3 бара... Непонятно почему такое происходит?

фантастический мкл5 =))

привыкай =)

 

Посмотрите пример индикатора, мы внесем изменения в справку.

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

//+------------------------------------------------------------------+
//|                                              Study_Alligator.mq5 |
//|                                  2010, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_plots   3
//--- plot Jaw
#property indicator_label1  "Jaw"
#property indicator_type1   DRAW_LINE
#property indicator_color1  Blue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot Teeth
#property indicator_label2  "Teeth"
#property indicator_type2   DRAW_LINE
#property indicator_color2  Red
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- plot Lips
#property indicator_label3  "Lips"
#property indicator_type3   DRAW_LINE
#property indicator_color3  Lime
#property indicator_style3  STYLE_SOLID
#property indicator_width3  1
//--- input parameters
input int                  jaw_period=13;
input int                  jaw_shift=8;
input int                  teeth_period=8;
input int                  teeth_shift=5;
input int                  lips_period=5;
input int                  lips_shift=3;
input ENUM_MA_METHOD       ma_method=MODE_SMMA;
input ENUM_APPLIED_PRICE   applied_price=PRICE_MEDIAN;
//--- indicator buffers
double         JawBuffer[];
double         TeethBuffer[];
double         LipsBuffer[];

int handle_alligator;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,JawBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,TeethBuffer,INDICATOR_DATA);
   SetIndexBuffer(2,LipsBuffer,INDICATOR_DATA);
//---
   PlotIndexSetInteger(0,PLOT_SHIFT,jaw_shift);
   PlotIndexSetInteger(1,PLOT_SHIFT,teeth_shift);
   PlotIndexSetInteger(2,PLOT_SHIFT,lips_shift);
//---
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,jaw_period);
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,teeth_period);
   PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,lips_period);
//---
   handle_alligator=iAlligator(_Symbol,0,
                               jaw_period,
                               jaw_shift,
                               teeth_period,
                               teeth_shift,
                               lips_period,
                               lips_shift,
                               ma_method,
                               applied_price
                               );
//---
   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 calc=BarsCalculated(handle_alligator);
   if(calc==-1) return(0);
//---
   int copied;
   copied=CopyBuffer(handle_alligator,0,-jaw_period,rates_total,JawBuffer); 
   copied=CopyBuffer(handle_alligator,1,-teeth_period,rates_total,TeethBuffer); 
   copied=CopyBuffer(handle_alligator,2,-lips_period,rates_total,LipsBuffer); 
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 

Спасибо за то, что откликнулись на проблему. По сути вопрос решился, за что отдельная благодарность Rosh, но убрать смещение удалось вот таким способом:

double AlligatorTeeth[];
   ArraySetAsSeries(AlligatorTeeth,true);
   int AligHandle=iAlligator(_Symbol,0,13,8,8,5,5,3,MODE_SMMA,PRICE_MEDIAN);
   int counted=CopyBuffer(AligHandle,1,-3,10,AlligatorTeeth);
   if(counted>0)
     {
      for(int i=0;i<10;i++)
        {
         Alert("Бар №",i," = ",NormalizeDouble(AlligatorTeeth[i],_Digits));
        }

     }

 

для Teeth сартовую позицию поставил равной "-3" и тогда смещение пропало... Стартовая позиция (CopyBuffer) равная "-8" для Teeth, как рекомендовали в примере не убрало смещение, а переместило его...

Еще раз огромное спасибо. 

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