Индикатор не прорисовывается не на все ТФ. В чем трабл???

 

Господа выручайте :)

Никак не пойму - индюк не всегда выводится, например на Н1 есть, на М30 есть, на М15 есть, перехожу на М5 - нет! Даже не то чтобы нет, а есть но до определенной даты какой нибудь. В терминалах разных брокеров/дц ситуация различная .. Ничего не понимаю )))

//+------------------------------------------------------------------+
//|                                                          Dix.mq4 |
//|                                  Copyright © 2010, Yury Zinoviev |
//|                                          zinoviev.yury@gmail.com |
//|                                                                  |
//| Price Direction Index                                            |
//+------------------------------------------------------------------+
/*




*/

#property copyright "Copyright © 2010, Yury Zinoviev"
#property link      "zinoviev.yury@gmail.com"

#property indicator_separate_window
#property indicator_minimum -100
#property indicator_maximum 100
#property indicator_buffers 3
#property indicator_color2 Red
#property indicator_color3 DeepSkyBlue
#property indicator_color1 Green

//---- buffers
double Fast1[];
double Slow2[];
double Vol3[];

// inputs
extern int Fast   =  5;
extern int Slow   =  12;
extern int VolPer =  4;
//extern int VolFactor = 15;
extern int aver   =  2;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   SetIndexStyle(0,DRAW_HISTOGRAM,EMPTY,2);
   SetIndexBuffer(0,Vol3);
   SetIndexLabel(0,"DixVolatility " + VolPer);
  
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,Fast1);
   SetIndexLabel(1,"Dix "+Fast);
   
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,Slow2);
   SetIndexLabel(2,"Dix "+Slow);
   IndicatorShortName("Dix("+Fast+","+Slow+","+VolPer+")");
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int i,j;
   int    counted_bars;
   double avFast, avSlow;

   counted_bars=IndicatorCounted();
   
   i=Bars-counted_bars-1; 
   while(i>=0)
   {
      Fast1[i]=setDix(Fast, i);
      Slow2[i]=setDix(Slow, i);
      Vol3[i] =setVol(VolPer,i);
      
      
      if(aver!=0 || aver!=1) 
      {
         j=i+1;
         avFast=Fast1[i];
         avSlow=Slow2[i];
         while(j<=i+aver-1)
         {
            avFast+=Fast1[j];
            avSlow+=Slow2[j];
            
            j++;
      
         }
         avFast/=aver;
         avSlow/=aver;
         Fast1[i]=avFast;
         Slow2[i]=avSlow;
      
      }
      
   i--;
   }

   return(0);
  }
//+------------------------------------------------------------------+

double setDix(int period, int ii)
   {
      double rt=0, rr=0, ret;
      
      int j=ii;
      while(j<=ii+period-1)
      {
         rt+=MathAbs(Close[j]-Open[j])/Point;
         rr+=(Close[j]-Open[j])/Point;
         
         j++;
      }

      ret=rr/rt*100;
      
      
      return(ret);
   }
   
double setVol(int period, int ii)
   {
      double rtv=0, rtf=0, ret;
      
      int j=ii;
      while(j<=ii+period-1)
      {
         rtv+=MathAbs(Close[j]-Open[j])/Point;
         rtf+=MathAbs(High[j]-Low[j])/Point;
         
         j++;
      }

//      ret=rtf/rtv*VolFactor;
      ret=rtf/rtv*15;
      
      
      return(ret);
   }

 
У меня на всех, кроме D1, есть.
 

У меня на одном терминале с NDD счетом есь на всех кроме М5 и М1. Никак не пойму в чем загвоздка! Никто не встречался с подобной фигней?

 

Самое интересное, что после нескольких запусков перестал работать. Теперь всё, как у Вас.

Код, вроде, правильный. 

 

Запрет деления на ноль еще пока никто не отменил!

(2010.07.15 21:42:18 Dix GBPUSD,M5: zero divide)

 

/////////////////////////////////
double setDix(int period, int i)
{
   double rt=0,rr=0;
   int j=i;
   while(j<=i+period-1)
   {
      rt+=MathAbs(Close[j]-Open[j])/Point;
      rr+=(Close[j]-Open[j])/Point;
      j++;
   }
   if(rt==0)rt=0.0000001;
   return(rr/rt*100);
}
///////////////////////////////   
double setVol(int period, int i)
{
   double rtv=0, rtf=0;
   int j=i;
   while(j<=i+period-1)
   {
      rtv+=MathAbs(Close[j]-Open[j])/Point;
      rtf+=MathAbs(High[j]-Low[j])/Point;
      j++;
   }
   if(rtv==0)rtv=0.0000001;
   return(rtf/rtv*15);
}
///

Можно так попробовать.

 

Да, действительно! Сам недавно обнаружил у себя такое. Мне это не сильно мешало. Но оказалось очень много есть баров со всеми одинаковыми ценами. Даже на старших ТФ. При арифметических действиях возможен в результате ноль.

Мне пришлось свою математику вводить : 0 / 0 = 1

Это, чтобы ряд не прерывался: 0 / 0 = 1; 1 / 1 = 1; 2 / 2 = 1 ... 

 

to VBAG: спасибо! Не учел я вероятность нулевого результата! Спасибо за помощь!

 
exhumer:

А так еще лучше:

/////////////////////////////////
double setDix(int period, int i)
{
   double rt=0,rr=0;
   int j=i;
   while(j<=i+period-1)
   {
      rt+=MathAbs(Close[j]-Open[j]);///Point;
      rr+=(Close[j]-Open[j]);///Point;
      j++;
   }
   if(rt==0)rt=0.0000001;
   return(rr/rt*100);
}
///////////////////////////////   
double setVol(int period, int i)
{
   double rtv=0,rtf=0;
   int j=i;
   while(j<=i+period-1)
   {
      rtv+=MathAbs(Close[j]-Open[j]);///Point;
      rtf+=MathAbs(High[j]-Low[j]);///Point;
      j++;
   }
   if(rtv==0)rtv=0.0000001;
   return(rtf/rtv*15);
}
///