Help

 
Пытался сделать индикатор по статье в Forex Magazin №58. Застопорился. Может глаз замылился?
Кто чего увидит - скажите , где ошибка?

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

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 DarkBlue
#property indicator_color2 Red
//---- input parameters
extern int       PeriodTDI=20;
//---- buffers
double TDI_Buffer[];
double Direction_Buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,TDI_Buffer);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,Direction_Buffer);
   SetIndexLabel(0,"Trend Direction Index");
   SetIndexLabel(1,"Direction");
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- TODO: add your code here
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   double MomBuffer[];
   double MomAbsBuffer[];
   double MomSumBuffer[];
   double MomSumAbsBuffer[];
   double MomAbsSumBuffer[];
   double MomAbsSum2Buffer[];
   bool First=true;
   int limit,i;
   int    counted_bars=IndicatorCounted();
//---- check for possible errors
   if(counted_bars<0) return(-1);
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   if (First){limit=Bars-PeriodTDI; First=false;} else limit=Bars-counted_bars;
//   limit=Bars-PeriodTDI;
   ArraySetAsSeries(MomBuffer,true);
   ArraySetAsSeries(MomAbsBuffer,true);
   ArraySetAsSeries(MomSumBuffer,true);
   ArraySetAsSeries(MomSumAbsBuffer,true);
   ArraySetAsSeries(MomAbsSumBuffer,true);
   ArraySetAsSeries(MomAbsSum2Buffer,true);
   
//---- TODO: add your code here
   for(i=0; i<limit; i++)
      {
      MomBuffer[i]=Close[i]-Close[i+PeriodTDI];
      MomAbsBuffer[i]=MathAbs(MomBuffer[i]);
//      TDI_Buffer[i]=MomBuffer[i];    здесь будет выходить на экран
//      Direction_Buffer[i]=MomAbsBuffer[i];
      }
   for(i=limit; i>=0; i--)
      {
      MomSumBuffer[i]=iMAOnArray(MomBuffer,0,PeriodTDI,0,MODE_SMA,i);
      MomSumAbsBuffer[i]=MathAbs(MomSumBuffer[i]);
      TDI_Buffer[i]=MomSumBuffer[i]; // здесь получаются нулевые значения
      Direction_Buffer[i]=MomSumAbsBuffer[i];
      }

//   for(int l=limit; l>=0; l--)
//      {
//      MomAbsSumBuffer[l]=iMAOnArray(MomAbsBuffer,0,PeriodTDI,0,MODE_SMA,l)*PeriodTDI;
//      MomAbsSum2Buffer[l]=iMAOnArray(MomAbsBuffer,0,2*PeriodTDI,0,MODE_SMA,l)*2*PeriodTDI;
//      TDI_Buffer[l]=MomAbsSumBuffer[l]-MomAbsSum2Buffer[l];
//      }
      
//---- done
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
 
Неужели никто не глядел код? Не могу понять, что не так? Спотыкается здесь:
 MomSumBuffer[i]=iMAOnArray(MomBuffer,0,PeriodTDI,0,MODE_SMA,i);
 
Переделал код, чтобы в лоб вручную сумму считать, ничего не получилось. Я понимаю, что в array mql-4 ничего не понимаю.
Вспоминается предмет "Квантовая механика" и поговорка оттуда - "Кванты нельзя понять, к ним можно только привыкнуть" . Неужели такая же ситуация?
 
Конечно, победил я с помощью функции-"паразита" ArrayResize(). :)
Но все равно не понимаю, разве на быстродействии не сказывается, что на каждом тике происходит
актуализация размера массива?
ArrayResize(MomBuffer,limit);
ArrayResize(MomAbsBuffer,limit);
ArrayResize(MomSumBuffer,limit);
ArrayResize(MomSumAbsBuffer,limit);
ArrayResize(MomAbsSumBuffer,limit);
ArrayResize(MomAbsSum2Buffer,limit);

ArraySetAsSeries(MomBuffer,true);
ArraySetAsSeries(MomAbsBuffer,true);
ArraySetAsSeries(MomSumBuffer,true);
ArraySetAsSeries(MomSumAbsBuffer,true);
ArraySetAsSeries(MomAbsSumBuffer,true);
ArraySetAsSeries(MomAbsSum2Buffer,true);
 
Дык массив у тебя динамический, и он очивидно просто выходит за границы массива. При объявлении массива надо указывать его длину:
В Делфи это делается так:
MomSumBuffer: array[1..1000] of double;
а на МкуЛе, очивидно, так:
double MomSumBuffer[1000];
Причем динамические массивы нужны, как правило, для хранения промежуточных данных, а потом удаляются для экономии памяти.
В Делфи так
MomSumBuffer:=NIL;
А на МкуЛе не знаю, у квотесов спроси. И вообще без ФАГа программировать - занятие для мазахиста.
 
Здесь уже работающий вариант, если интересно.
http://forexsystems.ru/phpBB/viewtopic.php?t=622
Причина обращения: