Намудрил с индикатором - прошу помощи спецов

 

Намудрил я тут под вечер с индикатором вычерчивающим линии кратные среднеквадратичному отклонению, при этом для расчета берутся цены закрытия не текущего ТФ, а заданного в инпутах. В результате получил не совсем красивый результат. Но голова уже не варит, много сегодня писал, сам никак не соображу что исправить. Прошу помощь спецов умной мыслью :)

В общем есть две проблемки:

1)в тестере черти вообще черте что :) не пойму откуда разница

2) когда переключаюсь на native ТФ, т.е. тот с которго данные беру когда считаю среднее, он считает немного не те цифры, чем на меньших ТФ.

//+------------------------------------------------------------------+
//|                                                       Prison.mq4 |
//|                                  Copyright © 2010, Yury Zinoviev |
//|                                          zinoviev.yury@gmail.com |
//|                                                                  |
//| Price On                                                         |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010, Yury Zinoviev"
#property link      "zinoviev.yury@gmail.com"

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Olive

double sa[];

// inputs
extern int TimeFrame  =  1440;
extern int period     =  22;
extern int BarCount   = 100;

static double Up1=0,Up2=0,Up3=0,Down1=0,Down2=0,Down3=0;
static double SO                 = 0; //среднее отклонение
static double SA                 = 0; //среднее арифметическое 
static double _SO                = 0; //среднее отклонение
static double SOpercent          = 0;
static double _SA                = 0; //среднее арифметическое 


int init()
  {
   SetIndexStyle(0,DRAW_LINE,STYLE_DOT,1);
   SetIndexBuffer(0,sa);
   SetIndexLabel(0,"Prison average line " + period);
   
   IndicatorShortName("Prison lines - " + period + ", " + TimeFrame);

   ObjectCreate("SALine",OBJ_HLINE,0,0,0);
   ObjectSet("SALine",OBJPROP_COLOR,Yellow);

   ObjectCreate("Up1Line",OBJ_HLINE,0,0,0);
   ObjectSet("Up1Line",OBJPROP_COLOR,Green);
   
   ObjectCreate("Up2Line",OBJ_HLINE,0,0,0);
   ObjectSet("Up2Line",OBJPROP_COLOR,Green);
   ObjectSet("Up2Line",OBJPROP_STYLE,STYLE_DASH);
   
   ObjectCreate("Up3Line",OBJ_HLINE,0,0,0);
   ObjectSet("Up3Line",OBJPROP_COLOR,Green);
   ObjectSet("Up3Line",OBJPROP_STYLE,STYLE_DOT);

   ObjectCreate("Down1Line",OBJ_HLINE,0,0,0);
   ObjectSet("Down1Line",OBJPROP_COLOR,Red);

   ObjectCreate("Down2Line",OBJ_HLINE,0,0,0);
   ObjectSet("Down2Line",OBJPROP_COLOR,Red);
   ObjectSet("Down2Line",OBJPROP_STYLE,STYLE_DASH);
   
   ObjectCreate("Down3Line",OBJ_HLINE,0,0,0);
   ObjectSet("Down3Line",OBJPROP_COLOR,Red);
   ObjectSet("Down3Line",OBJPROP_STYLE,STYLE_DOT);



   modGraph();
  
   return(0);
  }
int deinit()
  {
   ObjectDelete("SALine");
   ObjectDelete("Up1Line");
   ObjectDelete("Up2Line");
   ObjectDelete("Up3Line");
   ObjectDelete("Down1Line");
   ObjectDelete("Down2Line");
   ObjectDelete("Down3Line");

   return(0);
  }


int start()
  {
   int i,j;
   int    counted_bars=IndicatorCounted();
   
   i=Bars-counted_bars-1-period; 
   int max=BarCount;
   j=0;
   while(i>=0)
   {
      sa[j]=getSA(j);
      i--; j++;
      max--;
      if(max<=0) break;
   }

   SO=getSO();
   modGraph();


   return(0);
  }

double getSO()
   {
   int i=period; double temp=0;
   double cursa=getSA(1);
   while(i!=0)
      {
      temp+=MathPow(iClose(NULL,TimeFrame,i)-cursa,2);
      i--;
      }

   temp/=(period-1);
   
   SO=NormalizeDouble(MathSqrt(temp),Digits);
   SA=NormalizeDouble(SA,Digits);
   Up1=NormalizeDouble(SA+1*SO,Digits);
   Up2=NormalizeDouble(SA+2*SO,Digits);
   Up3=NormalizeDouble(SA+3*SO,Digits);
   Down1=NormalizeDouble(SA-1*SO,Digits);
   Down2=NormalizeDouble(SA-2*SO,Digits);
   Down3=NormalizeDouble(SA-3*SO,Digits);
   
   SOpercent=SO/(SA/100);
   
   return(SO);
   
   
   }

double getSA(int i)
   {
   SA=0;
   int j, iday;
   
   datetime curDT=iTime(NULL,0,i);
   int k=0;
   while(k<Bars)
   {
      if(TimeYear(curDT)==TimeYear(iTime(NULL,TimeFrame,k)) && TimeMonth(curDT)==TimeMonth(iTime(NULL,TimeFrame,k)) && TimeDay(curDT)==TimeDay(iTime(NULL,TimeFrame,k))) break;
   k++;
   }
    if(k==Bars) iday=1;
   
   iday=k;
   
   j=iday;
   while(j<iday+period)
      {
      SA+=iClose(NULL,TimeFrame,j);
      j++;
      }
   SA=SA/period;
   
   return(SA);
   }
   
void modGraph()
   {
   ObjectSet("SALine",OBJPROP_PRICE1,SA);   
   ObjectSet("Up1Line",OBJPROP_PRICE1,Up1);
   ObjectSet("Up2Line",OBJPROP_PRICE1,Up2);
   ObjectSet("Up3Line",OBJPROP_PRICE1,Up3);
   ObjectSet("Down1Line",OBJPROP_PRICE1,Down1);
   ObjectSet("Down2Line",OBJPROP_PRICE1,Down2);
   ObjectSet("Down3Line",OBJPROP_PRICE1,Down3);
   
   return(0);
   }

   

Заранее спасибо всем откликнувшимся :)