Подскажите, как создать аналог ATR?

 

После, некоторого, опыта работы с Омегой и ВелсЛаб, пришёл черёд подразобраться и с МетаТрэйдерер.

Для попытки разобраться с массивами, попытался создать аналог ATR. Бьюсь третьи сутки с простым кодом, не могу проникнуться философией МетаТрэйдерер, подскажите, что не так:

//+------------------------------------------------------------------+
//|                                                        MyATR.mq4 |
//|                      Copyright © 2010, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Red
//---- input parameters
extern int       PerATR = 13;
//---- buffers
double ATRBuffer1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ATRBuffer1);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int i,   Counted_bars;
   double MyATR;
//----
   Counted_bars=IndicatorCounted();
   i=Bars-Counted_bars-1;
   while(i>=0)
   {      
      MyATR = (High[i] - Low[i])/Low[i];
      ATRBuffer1[i] = iMAOnArray(MyATR,0,PerATR,0,MODE_SMA,1);
      i--;
   }
//----
   return(0);
  }
//+------------------------------------------------------------------+
 

Есть готовый пример как в Code base, так и в поставке терминала.

Average True Range, ATR

 
Rosh, да, конечно - понимаю. Пытаюсь сам разобраться с написанием индикаторов, скриптов. Если у кого-нибудь будет время подсказать ошибку - буду признателен.
 
Craft писал(а) >>
Rosh, да, конечно - понимаю. Пытаюсь сам разобраться с написанием индикаторов, скриптов. Если у кого-нибудь будет время подсказать ошибку - буду признателен.

double iMAOnArray( double array[], int total, int period, int ma_shift, int ma_method, int shift) 
array[]   -   Массив с данными. 

У Вас

double MyATR;
ATRBuffer1[i] = iMAOnArray(MyATR,0,PerATR,0,MODE_SMA,1);

Ну и по ссылке

   double TempBuffer[];

   while(i>=0)
     {
...
         TempBuffer[i]=MathMax(high,prevclose)-MathMin(low,prevclose);
        }
      i--;
     }
...
   for(i=0; i<limit; i++)
      AtrBuffer[i]=iMAOnArray(TempBuffer,Bars,AtrPeriod,0,MODE_SMA,i);
 

Для iMaOnArray нужен обратный цикл. Не так давно кто-то ветку создавал (спасибо :) ). Иначе будет некорректно рассчитываться в онлайне. Поэтому:

for(i=limit; i>=0; i--)
      AtrBuffer[i]=iMAOnArray(TempBuffer,Bars,AtrPeriod,0,MODE_SMA,i);
 

SergNF

, спасибо.

Necron >>:

Для iMaOnArray нужен обратный цикл. Не так давно кто-то ветку создавал (спасибо :) ). Иначе будет некорректно рассчитываться в онлайне. Поэтому:


Да, уже встречал где-то об этом упоминание. Может быть я неправильно выбрал функцию для определения среднего арифметического массива за период, других функций для этого в МетаТрэйдере нет?

В Омеге просто SMA(((High-Low)/Low), PerATR), да и в Вэлсе не мудрёно - SMA.Series(((High-Low)/Low), PerATR)[bar-1]

 
Necron >>:

Для iMaOnArray нужен обратный цикл. Не так давно кто-то ветку создавал (спасибо :) ). Иначе будет некорректно рассчитываться в онлайне. Поэтому:

Хотя, SergNF, для этих целей указывает i++, если не ошибаюсь.

Всё сделал согласно рекомендаций SergNF, индикатор всё-равно не кажет, что не так:

#property copyright "Copyright © 2010, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Red
//---- input parameters
extern int       PerATR = 13;
//---- buffers
double ATRBuffer1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ATRBuffer1);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int i,   Counted_bars, limit;
   double MyATR[];
//----
   Counted_bars=IndicatorCounted();
   i=Bars-Counted_bars-1;
   while(i>=0)
   {      
      double prevclose=Close[i+1];
      MyATR[i] = (MathMax(High,prevclose)-MathMin(Low,prevclose))/MathMin(Low,prevclose);
     
      i--;
   }
   limit=Bars-Counted_bars;
   for(i=0; i<limit; i++)
   ATRBuffer1[i]=iMAOnArray(MyATR,Bars,PerATR,0,MODE_SMA,i);
//----
   return(0);
  }
//+------------------------------------------------------------------+
 
Craft писал(а) >>

Хотя, SergNF, для этих целей указывает i++, если не ошибаюсь.

Всё сделал согласно рекомендаций SergNF, индикатор всё-равно не кажет, что не так:

немного переделал
Файлы:
newatr_1.mq4  3 kb
 
nikost >>:
немного переделал

Спасибо огромное, кое-что для себя прояснил. Первоначально думал, что буфер отводится только для массива построения кривой/графика на чарте.