Fisher_mbk





//+------------------------------------------------------------------+
//|                                                                  |
//|                 Copyright © 2000-2007, MetaQuotes Software Corp. |
//|                                         http://www.metaquotes.ru |
//+------------------------------------------------------------------+
#property  copyright "Copyright © 2005, Matt Kennel"
#property  link      "Yura.prokofiev@gmail.com"
// Inspired by an idea from Yura.prokofiev@gmail.com
// Idea:  Look back a certain amount of time and find its
// High and Low, normalize current value relative to that 
// to make [-1..1].  Filter with Hull-type MA.   Then perform
// Fisher Z-transform on result (making Gaussian).  Plot
// historgram. 
#property  indicator_separate_window
#property  indicator_buffers 3
#property  indicator_color1  Black
#property  indicator_color2  Lime
#property  indicator_color3  Red
//----
extern int period=10;
extern double HMALenHiLo=5.0;
extern double HMALenZ=3.0;
//----
double         ExtBuffer0[];
double         ExtBuffer1[];
double         ExtBuffer2[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
  {
   SetIndexStyle(0,DRAW_NONE);
   SetIndexStyle(1,DRAW_HISTOGRAM);
   SetIndexStyle(2,DRAW_HISTOGRAM);
   IndicatorDigits(Digits+1);
   //
   SetIndexBuffer(0,ExtBuffer0);
   SetIndexBuffer(1,ExtBuffer1);
   SetIndexBuffer(2,ExtBuffer2);
   //
   IndicatorShortName("Fisher_mbk");
   SetIndexLabel(1,NULL);
   SetIndexLabel(2,NULL);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   int    limit;
   int    counted_bars=IndicatorCounted();
   double prev,current,old;
   double Value=0;
   double price;
   double MinL=0;
   double MaxH=0;
//----
   if(counted_bars>0) counted_bars--;
   limit=Bars-period-1; // counted_bars;
   // Idea, do a HMA on boht the
   int N=Bars-period;
   double HiLo[];
   double HMAofHiLo[];
   double Ztransformed[];
   ArrayResize(HiLo,N);
   ArrayResize(HMAofHiLo,N);
   ArrayResize(Ztransformed,N);
//----
   for(int i=N-1; i>=0; i--)
     {
      MaxH=High[Highest(NULL,0,MODE_HIGH,period,i)];
      MinL=Low[Lowest(NULL,0,MODE_LOW,period,i)];
      price=Close[i]; // (High[i]+Low[i])/2;
      HiLo[i]=2.0* (price-MinL)/(MaxH-MinL) - 1.0;
     }
   HMAOnArray(N,HMALenHiLo,HiLo,HMAofHiLo);
     for(i=N-1; i>=0; i--) 
     {
      Value=MathMin(MathMax(HMAofHiLo[i],-0.999),0.999);
      Ztransformed[i]= MathLog((1+Value)/(1-Value));
     }
   HMAOnArray(N,HMALenZ,Ztransformed,ExtBuffer0);
//----
   bool up=true;
   for(i=limit-2; i>=0; i--)
     {
      current=ExtBuffer0[i];
      prev=ExtBuffer0[i+1];
      if (((current<0)&&(prev>0))||(current<0)) up= false;
      if (((current>0)&&(prev<0))||(current>0)) up= true;
      if(!up)
        {
         ExtBuffer2[i]=current;
         ExtBuffer1[i]=0.0;
        }
      else
        {
         ExtBuffer1[i]=current;
         ExtBuffer2[i]=0.0;
        }
     }
//----     
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
  void HMAOnArray(int N, double HMALen, double input[], double& output[]) 
  {
   // Given input[N-1 .. 0] return HMA filtered version in output.
   double ma1, ma2, hma, mix, mixprime;
   ma1=input[N-1];
   ma2=ma1;
   mix=3.0/(2.0 + HMALen);
   mixprime=1.0-mix;
//----   
     for(int i=N-2; i>=0; i--) 
     {
      ma1=mixprime*ma1 + mix*input[i];
      ma2=mixprime*ma2 + mix*ma1;
      output[i]=1.5*ma1-ma2;
     }
  }
//+------------------------------------------------------------------+



Sample





Analysis



Market Information Used:

Series array that contains the highest prices of each bar
Series array that contains the lowest prices of each bar
Series array that contains close prices for each bar


Indicator Curves created:

Implements a curve of type DRAW_NONE
Implements a curve of type DRAW_HISTOGRAM


Indicators Used:



Custom Indicators Used:

Order Management characteristics:

Other Features: