//+------------------------------------------------------------------+
//|                                        dynamic zone smoothed rsi |
//|                                                           mladen |
//+------------------------------------------------------------------+
#property copyright "mladen"
#property link      "mladenfx@gmail.com"

#property indicator_separate_window
#property indicator_buffers 4
#property indicator_color1  LimeGreen
#property indicator_color2  LimeGreen
#property indicator_color3  Orange
#property indicator_color4  Orange
#property indicator_width1  2
#property indicator_width3  2
#property indicator_maximum 1
#property indicator_minimum 0

//
//
//
//
//

#import "dynamicZone.dll"
   double dzBuy(double& sourceArray[],double probabiltyValue, int lookBack, int bars, int i );
   double dzSell(double& sourceArray[],double probabiltyValue, int lookBack, int bars, int i );
#import

//
//
//
//
//

extern int    CciLength              = 10;
extern int    CciPrice               = PRICE_TYPICAL;
extern int    CciSmooth              = 3;
extern int    DzLookBackBars         = 70;
extern double DzStartBuyProbability  = 0.16;
extern double DzStartSellProbability = 0.16;

//
//
//
//
//

double cci[];
double ccs[];
double ccw[];
double histuu[];
double histum[];
double histdd[];
double histdm[];
double state[];

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//
//
//
//
//

int init()
{
   IndicatorBuffers(8);
   SetIndexBuffer(0,histuu); SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexBuffer(1,histum); SetIndexStyle(1,DRAW_HISTOGRAM);
   SetIndexBuffer(2,histdd); SetIndexStyle(2,DRAW_HISTOGRAM);
   SetIndexBuffer(3,histdm); SetIndexStyle(3,DRAW_HISTOGRAM);
   SetIndexBuffer(4,ccs);
   SetIndexBuffer(5,cci);
   SetIndexBuffer(6,ccw);
   SetIndexBuffer(7,state);

   //
   //
   //
   //
   //
   
   string PriceType;
      switch(CciPrice)
      {
         case PRICE_CLOSE:    PriceType = "Close";    break;  // 0
         case PRICE_OPEN:     PriceType = "Open";     break;  // 1
         case PRICE_HIGH:     PriceType = "High";     break;  // 2
         case PRICE_LOW:      PriceType = "Low";      break;  // 3
         case PRICE_MEDIAN:   PriceType = "Median";   break;  // 4
         case PRICE_TYPICAL:  PriceType = "Typical";  break;  // 5
         case PRICE_WEIGHTED: PriceType = "Weighted"; break;  // 6
      }      

   //
   //
   //
   //
   //

   CciLength = MathMax(CciLength ,1);
   
   IndicatorShortName ("Dynamic zone CCI histo ("+CciLength+","+PriceType+","+DzLookBackBars+","+DoubleToStr(DzStartBuyProbability,3)+","+DoubleToStr(DzStartSellProbability,3)+")");
   return(0);
}
int deinit()
{
   return(0);
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//
//
//
//
//

double alpha;
int start()
{
   int counted_bars=IndicatorCounted();
      if(counted_bars<0) return(-1);
      if(counted_bars>0) counted_bars--;
         int limit = MathMin(Bars-counted_bars,Bars-1);
         alpha = 2.0 /(1.0+MathSqrt(CciSmooth));

   //
   //
   //
   //
   //
   //

   for(int i=limit; i >= 0; i--)
   {
      cci[i] = iCCI(NULL,0,CciLength,CciPrice,i);
         if (i==Bars-1)
         {
            ccw[i] = cci[i];
            ccs[i] = cci[i];
            continue;
         }
      
      //
      //
      //
      //
      //
      
      if (CciSmooth>1)
      {
            ccw[i] = ccw[i+1]+alpha*(cci[i]-ccw[i+1]);
            ccs[i] = ccs[i+1]+alpha*(ccw[i]-ccs[i+1]);
      }
      else  ccs[i] = cci[i];         
      double bli = dzBuy (ccs, DzStartBuyProbability,  DzLookBackBars, Bars, i);
      double sli = dzSell(ccs, DzStartSellProbability, DzLookBackBars, Bars, i);
      double cen = dzSell(ccs, 0.5,                    DzLookBackBars, Bars, i);
      histuu[i] = EMPTY_VALUE;
      histum[i] = EMPTY_VALUE;
      histdd[i] = EMPTY_VALUE;
      histdm[i] = EMPTY_VALUE;
      state[i]  = state[i+1];
         if (ccs[i]>cen) state[i] =  1;
         if (ccs[i]>sli) state[i] =  2;
         if (ccs[i]<cen) state[i] = -1;
         if (ccs[i]<bli) state[i] = -2;
         if (state[i] == 2) histuu[i] = 1;
         if (state[i] == 1) histum[i] = 1;
         if (state[i] ==-1) histdm[i] = 1;
         if (state[i] ==-2) histdd[i] = 1;
   }
   return(0);
}