//+------------------------------------------------------------------+
//|                           Price_Distance_To_Ma_Oscillator_V2.mq4 |
//|                                                                  |
//+------------------------------------------------------------------+

#property copyright "Created By XplosionKibo @ FF"
#property strict
#include <stdlib.mqh>
#include <stderror.mqh>

#property indicator_separate_window
#property indicator_buffers 3

enum  p
{     p0,    // Pips
      p1,    // Points 
};

//+------------------------------------------------------------------+
//| Inputs variables                                                 |
//+------------------------------------------------------------------+
extern string                 IndicatorName                 =  "Price_Distance_To_Ma_Oscillator_V2";
extern int                    Ma_Period                     =  55;
extern ENUM_MA_METHOD         Ma_Method                     =  MODE_EMA;
extern ENUM_APPLIED_PRICE     Ma_Price                      =  PRICE_MEDIAN;
extern int                    Average_Price_Ma_Period       =  21;
extern ENUM_MA_METHOD         Average_Price_Ma_Method       =  MODE_SMA;
extern int                    BarsToLoad                    =  5000;
extern color                  Average_Price_Line_Color      =  clrOlive;
extern ENUM_LINE_STYLE        Average_Price_Line_Style      =  STYLE_DOT;
extern int                    Average_Price_Line_Width      =  0;   
extern color                  Histogram_PColor              =  clrBlue;
extern color                  Histogram_NColor              =  clrMaroon;
extern int                    Histogram_Width               =  1;
extern p                      DisplyDistanceAs; 
extern string                 Font                          =  "Arial";
extern int                    FontSize                      =  10;
extern color                  FontColor                     =  clrTeal;
extern ENUM_BASE_CORNER       Corner                        =  CORNER_RIGHT_UPPER;
extern int                    XDISTANCE                     =  10; 
extern int                    YDISTANCE                     =  5;
extern double                 Level                         =  0.0020;
extern ENUM_LINE_STYLE        Level_Style                   =  STYLE_DOT;
extern color                  Level_Color                   =  C'57,57,57';
extern int                    Level_Thickness               =  0;


//--- indicator buffers

double fast_ma[],slow_ma[],diff[],diff_plus[],diff_minus[],signal_ma[];
int PriceType;int point = 1; double Pips, Points, x;
string obj_namex, t;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {   
   IndicatorBuffers(6);
   SetIndexBuffer(0, diff_plus);
   SetIndexEmptyValue(0, EMPTY_VALUE);
   SetIndexStyle(0, DRAW_HISTOGRAM,EMPTY,Histogram_Width,Histogram_PColor);
   SetIndexLabel(0,"High Price Distance To Ma"+"("+IntegerToString(Ma_Period,0)+")");
   SetIndexBuffer(1, diff_minus);
   SetIndexEmptyValue(1, EMPTY_VALUE);
   SetIndexStyle(1, DRAW_HISTOGRAM,EMPTY,Histogram_Width,Histogram_NColor);
   SetIndexLabel(1,"Low Price Distance To Ma"+"("+IntegerToString(Ma_Period,0)+")");
   SetIndexBuffer(2, signal_ma);
   SetIndexStyle(2, DRAW_LINE,Average_Price_Line_Style,Average_Price_Line_Width,Average_Price_Line_Color);
   SetIndexLabel(2,"Average Price Distance To Ma"+"("+IntegerToString(Ma_Period,0)+")");
   SetIndexEmptyValue(2, EMPTY_VALUE);
   SetIndexBuffer(3, diff);
   SetIndexEmptyValue(3, EMPTY_VALUE);
   SetIndexStyle(3, DRAW_NONE);
   SetIndexBuffer(4, fast_ma);
   SetIndexEmptyValue(4, EMPTY_VALUE);
   SetIndexStyle(4, DRAW_NONE);
   SetIndexBuffer(5, slow_ma);
   SetIndexEmptyValue(5, EMPTY_VALUE);
   SetIndexStyle(5, DRAW_NONE);
         
   SetLevelValue(0,  Level);
   SetLevelValue(1, -Level);
   SetLevelStyle(Level_Style,Level_Thickness,Level_Color);    
   
   IndicatorShortName(IndicatorName+"("+IntegerToString(Ma_Period,1)+","
   +IntegerToString(Average_Price_Ma_Period,1)+") ");  
   
               
return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| Deinit                                                           |
//+------------------------------------------------------------------+
  int deinit()
  {
  ObjectDelete(obj_namex);
  return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(
const int rates_total,const int prev_calculated,const datetime& time[],
const double& open[],const double& high[],const double& low[],const double& close[],
const long& tick_volume[],const long& volume[],const int& spread[])

  {
   int limit = rates_total - prev_calculated;
   
   ArraySetAsSeries(diff_plus, true);
   ArraySetAsSeries(diff_minus, true);
   ArraySetAsSeries(signal_ma, true);
   ArraySetAsSeries(diff, true);
   ArraySetAsSeries(fast_ma, true);
   ArraySetAsSeries(slow_ma, true);
   
    
   if(prev_calculated < 1)
   {
   ArrayInitialize(diff_plus, EMPTY_VALUE);
   ArrayInitialize(diff_minus, EMPTY_VALUE);
   ArrayInitialize(signal_ma, EMPTY_VALUE);
   ArrayInitialize(diff, EMPTY_VALUE);
   ArrayInitialize(fast_ma, EMPTY_VALUE);
   ArrayInitialize(slow_ma, EMPTY_VALUE);
   
   }
   else
   limit++;
   
       
   //--- price distance loop
   for(int d = BarsToLoad; d>= 0; d--)
      {
   if (d>= MathMin(BarsToLoad-1, rates_total-1-50)) continue;      
   
   if (High[d]>=iMA(Symbol(),PERIOD_CURRENT,Ma_Period,0,Ma_Method,Ma_Price,d)) 
      PriceType=PRICE_HIGH; else PriceType=PRICE_LOW;
   
      diff[d] = iMA(Symbol(),PERIOD_CURRENT,1,0,MODE_EMA,PriceType,d)-
                iMA(Symbol(),PERIOD_CURRENT,Ma_Period,0,Ma_Method,Ma_Price,d);
      }
   
 
   //--- average_ma 
   for(int s = BarsToLoad; s>= 0; s--)
      {
   if (s>= MathMin(BarsToLoad-1, rates_total-1-50)) continue;      
     
      signal_ma[s] = iMAOnArray(diff,0,Average_Price_Ma_Period,0,Average_Price_Ma_Method,s);
      
      }          
     
   
   //--- main loop   
   for(int i = BarsToLoad; i>= 0; i--)
      {  
   if (i>= MathMin(BarsToLoad-1, rates_total-1-50)) continue;   
   
   if(diff[i]>0) {diff_plus[i] =diff[i];} else {diff_plus[i]=EMPTY_VALUE;} 
   if(diff[i]<0) {diff_minus[i]=diff[i];} else {diff_minus[i]=EMPTY_VALUE;}  
   
      }
   
   if(Digits == 2 || Digits == 3 || Digits == 5 ) point = 10; 
   
   int D = (int) MarketInfo(Symbol(),MODE_DIGITS);
   if(DisplyDistanceAs==p0) x=Pips; else x=Points;   
   if(DisplyDistanceAs==p0) t= "pips";
   if(DisplyDistanceAs==p1) t= "points";
   
   Points = MathAbs((NormalizeDouble(((diff[0])/
   MarketInfo(Symbol(),MODE_POINT)),D)));
   
   Pips = Points/point;
             
   ObjectCreate   ("obj_namex", OBJ_LABEL,ChartWindowFind(),0,0,0,0,0);
   ObjectSet      ("obj_namex", OBJPROP_CORNER,Corner);
   ObjectSet      ("obj_namex", OBJPROP_XDISTANCE,XDISTANCE);
   ObjectSet      ("obj_namex", OBJPROP_YDISTANCE,YDISTANCE);
   ObjectSetText  ("obj_namex","Current Distance To Ma"+"("+ IntegerToString(Ma_Period,0)+"): "+ DoubleToString(x,1)+" "+t,FontSize,Font,FontColor);
          
 return(rates_total);
   }

//+------------------------------------------------------------------+




