FishStoch

 
We have a few indicators based on John Ehlers works that why I ´m working on a compilation.

This is the original code of Fisher Stochastic. it was made by Luis Guilherme Damiani.

Have some troubles with arrays or custom function, but not big deal. I´m working on a fixed version.

But the main problem is this code is not painting, and I can´t see where the problem is.

I appreciate if somebody could help me.

//+------------------------------------------------------------------+
//|                                                                  |
//|                         Copyright © 2006, Luis Guilherme Damiani. Have some troubles |
//|                                      http://www.damianifx.com.br |
//|
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Luis Guilherme Damiani"
#property link      "http://www.damianifx.com.br"
 
#property indicator_buffers 2
#property indicator_separate_window
//#property indicator_chart_window
 
#property indicator_color1 Yellow
#property indicator_color2 Blue
#property indicator_maximum 0.8
//#property indicator_color3 Purple
 
//---- input parameters
extern int length=8;
extern int    maxbars=1000;
extern bool mean_signal=false;
extern string Base_Oscillator_Choice="0= Cyber Cycle, 1= CG, 2= RVI, other= RSI(12) ----------------";
extern int Osc_Choice=0;
 
//---- buffers
double ind1[];
double ind2[];
//double ind3[];
//double AuxBuffer[]; //Smooth
 
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ind1);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,ind2);
//   SetIndexStyle(2,DRAW_LINE);
 //  SetIndexBuffer(2,ind3);
   SetLevelValue(0,0.0);
//   SetLevelValue(1,-0.8);
   ArrayInitialize(ind1,0.0);
   ArrayInitialize(ind2,0.0);
//   ArrayInitialize(ind3,0.0);
///   ArrayResize(AuxBuffer,maxbars+3);
 //  ArrayInitialize(AuxBuffer,0.0);
 switch(Osc_Choice)
 {
 case 0: IndicatorShortName("StochFisher of Cyber Cycle     ");break;
 case 1: IndicatorShortName("StochFisher of CG Oscillator     ");break;
 case 2: IndicatorShortName("StochFisher of Relative Vigor Index      ");break;
 default: IndicatorShortName("StochFisher of RSI(12)        ");break;
 
 }  
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
 
int start()
  {//1
   
      int    counted_bars=IndicatorCounted();
      double num=0,denom=0;
      double indw[];
      double stoch[];
      double mstoch;
      ArrayResize(indw,length);
      ArrayInitialize(indw,0);  
      ArrayResize(stoch,Bars);
      ArrayInitialize(stoch,0);  
      //---- check for possible errors
      if(counted_bars<0) return(-1);
      int limit=Bars-2*length-counted_bars;
      if(limit>maxbars)limit=maxbars;      
      //if (limit>Bars-1)limit=Bars-1;   
      //---- 
      for (int i = limit; i>=0;i--)
      {//2
         for(int j=0;j<length;j++)
         {
            switch(Osc_Choice)
            {
             case 0: indw[j]=iCustom(NULL,0,"CyAn_4_Cyber Cycle",0,i+j);break;
             case 1: indw[j]=iCustom(NULL,0,"CyAn_5_CG Oscillator",0,i+j);break;
             case 2: indw[j]=iCustom(NULL,0,"CyAn_6_RVI",0,i+j);break;
             default:indw[j]=iRSI(NULL,0,12,PRICE_MEDIAN,i+j);break;
            } 
            }
            
            double max=indw[ArrayMaximum(indw)];
            double min=indw[ArrayMinimum(indw)];
            stoch[i]=(indw[0]-min)/(max-min);
            
            mstoch=(4*stoch[i]+3*stoch[i+1]+2*stoch[i+2]+stoch[i+3])/10;
            ind1[i]=0.5*(MathLog((1+0.98*(mstoch-0.5))/(1-0.98*(mstoch-0.5))));
         
         ind2[i]=ind1[i+1];              
    //     ind3[i]=(4*ind1[i]+3*ind1[i+1]+2*ind1[i+2]+ind1[i+3])/10;
       }//2
      
//----
   return(0);
  }
//+------------------------------------------------------------------+
 
If it would happen that "max" equals "min" you'd get a zero divide on the "stoch[i]" assignment attempt, and an upset MT4...
 
MT is not giving a zero divide with this code.

We have some troubles with icustom but you could use in mode iRSI and you would see there is no zerro error.

However, still is not painting and this is the main problem.
 
Have you checked with a Print statement towards the end (print out the last 100 values or something)?
Maybe comment out the indicator_maximum directive?
Why are ind1 and ind2 initialized with ArrayInitialize?
 

it might paint initially and then not paint on a continuous basis.

int limit=Bars-2*length-counted_bars;

on 2nd pass count_bars is equal to Bars-1 so limit is less than zero.

The correct statement would be

limit=MathMin(Bars-counted_bars,Bars-2*length)

 
irusoh1 wrote:

it might paint initially and then not paint on a continuous basis.

int limit=Bars-2*length-counted_bars;

on 2nd pass count_bars is equal to Bars-1 so limit is less than zero.

The correct statement would be

limit=MathMin(Bars-counted_bars,Bars-2*length)

Thanks irusoh1.

Now it paints, but it´s a mess and the behavior changed a lot..

I think it´s time to write Ehlers indicators from scratch using the easy L code provided with the books, one by one, and using simple MQ4 code, and stop to waste time on this.

Reason: