Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Опубликуй статью и ее прочитают тысячи человек по всему миру!
Forex Trader
114255
Forex Trader 2006.06.20 15:39 
Индикатор рисуется корректно, но только в начале истории, затем пустота. При изменении параметров индикатора так что бы он расчитывался в 2 раза быстрее, он начинает отражатся на в 2 раза большей истории, но опять не на всей. При удалении всех долго расчитываемых участках кода индикатор отражается на всей истории, но это уже совсем не то что нужно. Подозреваю что проблема во вренных ограничениях на расчет индикаторов. Если я прав, то как сие устранить?
Forex Trader
114255
Forex Trader 2006.06.20 16:27  
Индикатор рисуется корректно, но только в начале истории, затем пустота. При изменении параметров индикатора так что бы он расчитывался в 2 раза быстрее, он начинает отражатся на в 2 раза большей истории, но опять не на всей. При удалении всех долго расчитываемых участках кода индикатор отражается на всей истории, но это уже совсем не то что нужно. Подозреваю что проблема во вренных ограничениях на расчет индикаторов. Если я прав, то как сие устранить?


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


#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);
   }

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

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