Как отключить временные ограничения при расчете индикатора?

 
Индикатор рисуется корректно, но только в начале истории, затем пустота. При изменении параметров индикатора так что бы он расчитывался в 2 раза быстрее, он начинает отражатся на в 2 раза большей истории, но опять не на всей. При удалении всех долго расчитываемых участках кода индикатор отражается на всей истории, но это уже совсем не то что нужно. Подозреваю что проблема во вренных ограничениях на расчет индикаторов. Если я прав, то как сие устранить?
 
Индикатор рисуется корректно, но только в начале истории, затем пустота. При изменении параметров индикатора так что бы он расчитывался в 2 раза быстрее, он начинает отражатся на в 2 раза большей истории, но опять не на всей. При удалении всех долго расчитываемых участках кода индикатор отражается на всей истории, но это уже совсем не то что нужно. Подозреваю что проблема во вренных ограничениях на расчет индикаторов. Если я прав, то как сие устранить?


Не могли бы Вы представить код Вашего индикатора?
 
Думау, что от моего кода пользы будет мало, т.к. используемые в нем индикаторы выложить не могу, но могу утверждать, что они работают корректно, не глючат, сигналы подают на всей истории, но считаются долго :-(, в этом и проблема.


#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Blue
#property indicator_color2 Red
#property indicator_color3 White

extern int P1=4;
extern double F1=0.3;
extern int D1=20;

extern int P2=8;
extern double F2=0.3;
extern int D2=30;

extern int P3=16;
extern double F3=0.3;
extern int D3=40;

extern int SL=40;
extern int SLP=16;
extern int SLD=40;

double summ, F, D, Znak, trend;
double StopLoss, PriceOpen, PriceClose;
int Signal,i;

double BufH[];
double BufL[];
double BufS[];

int init ()
   {
   SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexArrow(0,116);
   SetIndexBuffer(0,BufH);
   SetIndexStyle(1,DRAW_HISTOGRAM);
   SetIndexArrow(1,116);
   SetIndexBuffer(1,BufL);
   SetIndexStyle(2,STYLE_SOLID);
   SetIndexArrow(2,160);
   SetIndexBuffer(2,BufS);
   return(0);
   }

int deinit()
   {
   return(0);
   }

int start()
   {
   summ=0;
   trend=0;
   StopLoss=0;
   PriceOpen=0;
   PriceClose=0;
   
   i=Bars-10;
   while (i>=0)
      {
      //закрытие позиции
      if (trend==1 && Low[i]<=StopLoss)
         {
         trend=0;
         PriceClose=StopLoss;
         StopLoss=0;
         summ=summ+PriceClose-PriceOpen;
         }
      if (trend==-1 && High[i]>=StopLoss)
         {
         trend=0;
         PriceClose=StopLoss;
         StopLoss=0;
         summ=summ+PriceOpen-PriceClose;
         }

      //передвижение StopLoss
      if (trend==1) StopLoss  =MathMax(StopLoss,iCustom(NULL,0,"M_UTD",SLD,SLP,2,i));
      if (trend==-1) StopLoss =MathMin(StopLoss,iCustom(NULL,0,"M_UTD",SLD,SLP,1,i));

      //открытие позиции
      if (trend==0)
         {
         Signal=0;
         
         //1-е условие
         F=iCustom(NULL,0,"M_F",P1,0,0,i+1);
         D=iCustom(NULL,0,"M_D",P1,0,i+1);
         Znak=F/MathAbs(F);
         if (MathAbs(F)>=F1 && D>=D1) Signal=1;
         
         //2-е условие
         if (Signal==1)
            {
            F=iCustom(NULL,0,"M_F",P2,0,0,i+1);
            D=iCustom(NULL,0,"M_D",P2,0,i+1);
            if (MathAbs(F)>=F2 && D>=D2 && Znak==F/MathAbs(F)) Signal=1; else Signal=0;
            }
         
         //3-е условие
         if (Signal==1)
            {
            F=iCustom(NULL,0,"M_F",P3,0,0,i+1);
            D=iCustom(NULL,0,"M_D",P3,0,i+1);
            if (MathAbs(F)>=F3 && D>=D3 && Znak==F/MathAbs(F)) Signal=1; else Signal=0;
            }
            
         if (Signal==1)
            {
            trend=Znak;
            PriceOpen=Open[i];
            StopLoss=PriceOpen-trend*SL*Point;
            }
         }

      if (trend==-1)
         {
         BufH[i]=Low[i];
         BufL[i]=High[i];
         BufS[i]=StopLoss;
         }
      if (trend==1)
         {
         BufH[i]=High[i];
         BufL[i]=Low[i];
         BufS[i]=StopLoss;
         }
      i--;
      }
   Comment("Profit в points(пунктах)=", summ/Point);
   return(0);
   }

 
[img]D:\1\1.gif[/img]
 
Для начала сделайте маленькую оптимизацию. И если решили создать свой тестер в виде индикатора , может этот путь будет более правильным?

"Открытый проект - тестер-оптимизатор своими силами"
 
Причину выяснил. Заменил
Znak=F/MathAbs(F);
на
if (F>0) Znak=1;
if (F<0) Znak=-1;
Все работает! А я то всегда думал, что знак числа - это число деленное на свой модуль :-).
Глюк однако.
Вопрос снят. Спасибо!
 
Зависит от типа числа F, можете и ноль получить заслуженно :)
Причина обращения: