Математика в индикаторах и экспертах РАЗНАЯ.

 
Столкнулся с такой ситуацией в индикаторе расчет один, в эксперте все тоже самое, на цифры другие.
Разработчики объясните сей факт. Получается что писать эксперты даже из стандартных индикаторов нет смысла?!
Код индикатора:
#property indicator_separate_window 
#property indicator_buffers 2
#property indicator_color1 LawnGreen 
#property indicator_color2 PaleTurquoise 
extern int SignalSMA=9;
double TS[1000];
double TS2[1000];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init(){
  
   IndicatorBuffers(2);  

   IndicatorShortName("TEST"); 
   
   SetIndexBuffer(0,TS); 
   SetIndexStyle(0, DRAW_LINE, STYLE_SOLID, 0, Orange); 
   SetIndexDrawBegin(0,0); 
   SetIndexLabel(0,"TS");   
   
   SetIndexBuffer(1,TS2); 
   SetIndexStyle(1, DRAW_LINE, STYLE_SOLID, 1, RoyalBlue); 
   SetIndexDrawBegin(1,0); 
   SetIndexLabel(1,"TS2");  
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
 
   int    counted_bars=IndicatorCounted();
   int    mode,limit=ArraySize(TS);
   ArraySetAsSeries(TS,true);

//----
   if(counted_bars<0) return(-1);
   if(counted_bars>0) counted_bars--; 
   limit=Bars-1;
//----
   
   
   for(int i=0; i<limit; i++)
   TS[i]=(iMA(NULL,0,10,0,MODE_EMA,PRICE_WEIGHTED,i)+
          iMA(NULL,0,20,0,MODE_EMA,PRICE_WEIGHTED,i)+
          iMA(NULL,0,30,0,MODE_EMA,PRICE_WEIGHTED,i));
//----
   for(i=0; i<limit; i++)
   TS2[i]=iMAOnArray(TS,limit,SignalSMA,0,MODE_SMA,i);
//----
   return(0);
  }


Код эксперта:

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start() {
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
   double TS[1000],TS2[1000];
   int shift;
   int SignalSMA=9;
   int limit=ArraySize(TS);
   ArraySetAsSeries(TS,true);
   
   limit=Bars-1;
   
   for(int i=0; i<limit; i++)
   TS[i]=(iMA(NULL,0,10,0,MODE_EMA,PRICE_WEIGHTED,i)+
          iMA(NULL,0,20,0,MODE_EMA,PRICE_WEIGHTED,i)+
          iMA(NULL,0,30,0,MODE_EMA,PRICE_WEIGHTED,i));
   
   for(i=0; i<limit; i++)
   TS2[i]=iMAOnArray(TS,limit,SignalSMA,0,MODE_SMA,i);
   
   Comment ("BUF1 = ",TS[0]," BUF2 = ",TS2[0]);
   
   return(0);
  }



Чем выше тайм фрейм тем сильнее расхождение. Расчет для первого буфера совподает, а для второго никак не хочет. Хотя код правельный.

 
Индикатору всё равно, что указан размер массива (TS[1000]), что не указан. Индикатор будет распределять буфер, равный количеству баров.
В эксперте же установлено 1000 элементов, значит будет 1000 элементов
 
Индикатору всё равно, что указан размер массива (TS[1000]), что не указан. Индикатор будет распределять буфер, равный количеству баров.
В эксперте же установлено 1000 элементов, значит будет 1000 элементов


В индикаторе пробывал и просто массив (TS[] и TS2[]), но суть проблемы не исчезла.
 
В индикаторных массивах бесполезно указывать размер. Индикатор сам распределит сколько надо. Я как раз об этом говорю.
В эксперте делайте
ArrayResize(TS,Bars);


тогда Ваши расчёты дожны совпасть