//+------------------------------------------------------------------+
//|                                Trend direction & force index.mq4 |
//|                                                           mladen |
//|                                                                  |
//|                                                                  |
//| original metastock indicator made by Piotr Wojdylo               |
//+------------------------------------------------------------------+
#property copyright "mladen"
#property link      "mladenfx@gmail.com"

#property indicator_separate_window
#property indicator_maximum  1
#property indicator_minimum  -1
#property indicator_buffers  2
#property indicator_color1   Red
#property indicator_color2   DimGray

extern int    TrendPeriod            = 5;
extern double StickLevel             = 0.8;
extern double StickOffLevel          = 0.0;
extern bool   finger_trap            = true;
extern double limit_bars             = 100;

double B0_1[],B1_1[],B2_1[],B3_1[],Bs[],Btr[],B0_2[];

int init(){
   IndicatorBuffers(7);
   SetIndexBuffer(0,B0_2);
   SetIndexBuffer(1,B0_1);
   SetIndexBuffer(2,Btr);
   SetIndexBuffer(3,Bs);
   SetIndexBuffer(4,B1_1);
   SetIndexBuffer(5,B2_1);
   SetIndexBuffer(6,B3_1);
   IndicatorShortName(NULL);
   return(0);
}

int start(){int i,limit=Bars-IndicatorCounted()-1; double b12,b3,b4;
   
   for(i=limit;i>=0;i--){B1_1[i]=iMA(NULL,0,TrendPeriod,0,MODE_EMA,PRICE_CLOSE,i);}
   for(i=limit;i>=0;i--){B2_1[i]=iMAOnArray(B1_1,0,TrendPeriod,0,MODE_EMA,i);
                         b12=MathAbs(B1_1[i]-B2_1[i])/Point;
                         b3=(B1_1[i]-B1_1[i+1]+B2_1[i]-B2_1[i+1])/(2*Point);
                         B3_1[i]=b12*MathPow(b3,3);
                         b4=absHighest_1(i);
                         if(b4>0){B0_1[i]=B3_1[i]/b4;} else{B0_1[i]=0;}               }

    for(i=limit;i>=0;i--){Btr[i]=Btr[i+1];
                          if(B0_1[i]>= StickLevel){Btr[i]= 1;} if(B0_1[i]>= StickOffLevel && Btr[i]==-1){Btr[i]=0;}
                          if(B0_1[i]<=-StickLevel){Btr[i]=-1;} if(B0_1[i]<=-StickOffLevel && Btr[i]== 1){Btr[i]=0;} }
                          
    for(i=limit;i>=0;i--){Bs[i+1]=Bs[i+2]+1;
                          if(Btr[i+1]==0 || Btr[i+1]!=Btr[i+2]){Bs[i+1]=TrendPeriod;} }
    
    if(finger_trap==false){return(0);}                      
    if(limit>limit_bars){limit=limit_bars;}
    for(i=limit;i>=0;i--){B0_2[i]=iCustom(NULL,0,"Trend direction && force index_(finger trap)_m0.3",Bs[i+1],StickLevel,StickOffLevel,false,limit_bars,1,i);}

   return(0);         
}

double absHighest_1(int i2){
   int i, length=TrendPeriod*3;
   double result=0;
   for(i=length-1;i>=0;i--){if(result<MathAbs(B3_1[i2+i])){result=MathAbs(B3_1[i2+i]);}}
   return(result);          
}