Помогите найти ошибку (АМА)

 

... в коде. Написал АМА используя формулы на http://www.linnsoft.com/tour/techind/ama.htm, но она не работает.

Нашёл в базе АМА, глянул код (https://www.mql5.com/ru/code/7418)- практически то же самое. Где у меня ошибка - понять не могу.

помогите пожалуйста не просто найти и исправить ошибку, но и по возможности объясните в чём же именно я ошибаюсь.

Вот моя версия кода:

#property copyright "Copyright © 2007, Rone_IS"
#property link      "rone.sergey@gmail.com"
 
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red
#property indicator_width1 2
 
extern int AMA_Period=10;
extern int Fast_Smoothing_Constant=2;
extern int Slow_Smoothing_Constant=30;
extern int BarsDepth=1000;
double AMA[];
 
int init()
  {
  SetIndexBuffer(0,AMA);
  SetIndexStyle(0,DRAW_LINE);  
  IndicatorShortName("AMA ("+AMA_Period+")");
 
   return(0);
  }
int start()
  {
   double Direction, Volatility=0, ER, FastSC, SlowSC, SSC, c;
  
   int    counted_bars=IndicatorCounted();
   if(counted_bars<0) return (-1);
   if(counted_bars>0) counted_bars--;
   
   
   AMA[BarsDepth]=Close[BarsDepth]; //
//----
   for(int i=BarsDepth-1;i>=0;i--)
      {
      Direction=Close[i]-Close[i+AMA_Period];
 
 
      for(int j=i+AMA_Period;j>=i;j--)
         {
         Volatility += MathAbs(Close[j]-Close[j+1]);
         }
      ER=Direction/Volatility;
      
      FastSC=2/(1+Fast_Smoothing_Constant);
      SlowSC=2/(1+Slow_Smoothing_Constant);
      SSC=ER*(FastSC-SlowSC)+SlowSC;
      c=SSC*SSC;
      
      AMA[i]=AMA[i+1]+c*(Close[i]-AMA[i+1]);
      }
   return(0);
  }
P.S. И есть ли на форуме отдельная ветка для подобных вопросов-просьб?
 
      FastSC=2.0/(1+Fast_Smoothing_Constant);
      SlowSC=2.0/(1+Slow_Smoothing_Constant);

Вот так вот:-) 2, это не тоже самое что и 2.0

Такие вещи можно и самостоятельно искать - есть в mql4 такие функции как Print(), Alert(), Comment(). Сначала смотрим чему равно с, перед тем как заполняется буфер, потом SSC и так далее... пока не находим в чем проблема

 
//...
for(int i=BarsDepth-AMA_Period-1;i>=0;i--)
//...
ER=Direction/(Volatility+0.000000001); // epsilon=1e-09
//...
 

Спасибо за ответы и советы. Ошибки нашёл )

Заработало когда вставил строку Volatility=0.000000001 - причём именно вставил в сам цикл (основной) - простое объяление переменной Volatility и присвоение ей значения 0.000000001 не спасло.

Вариант с "ER=Direction/(Volatility+0.000000001);" тоже не прошёл. Тем не менее природу этой ошибки я не понимаю.

И второе - цикл подсчёта Volatility. Было вот так:

for(int j=i+AMA_Period; j>=i; j--){
Volatility += MathAbs(Close[j]-Close[j+1]);
}

Правильный вариант таков:

for(int j=0;j<AMA_Period;j++) // ошибка была в этом цикле
{
Volatility += MathAbs(Close[i+j]-Close[i+j+1]); // и соответственно в этой строке
}

Ещё раз спасибо.

И всё-таки, где здесь задают вопросы? а то на каждый вопрос создавать тему...