Timeframe Confluence Detector

Author: phade
0 Views
0 Downloads
0 Favorites
Timeframe Confluence Detector
//+------------------------------------------------------------------+
//|                                Timeframe Confluence Detector.mq5 |
//|                                                                  |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "phade"
#property version   "1.00"

#property indicator_chart_window
#property indicator_buffers 5 
#property indicator_plots   3 

#property indicator_type1   DRAW_LINE
#property indicator_color1  clrBurlyWood
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

#property indicator_type2   DRAW_LINE
#property indicator_color2  clrGray
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1

#property indicator_type3   DRAW_LINE
#property indicator_color3  clrDarkGray
#property indicator_style3  STYLE_SOLID
#property indicator_width3  1

#define offset 60

input ENUM_TIMEFRAMES timeframe_a = PERIOD_CURRENT; //Current period
input ENUM_TIMEFRAMES timeframe_b = PERIOD_H2; // 1st timeframe deviation to current period
input ENUM_TIMEFRAMES timeframe_c = PERIOD_H1; // 2nd timeframe deviation to current period

int bars;

double buf_a[];
double buf_b[];
double buf_c[];

double deviator_a[], deviator_b[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   IndicatorRelease(0);

   SetIndexBuffer(0, buf_a, INDICATOR_DATA);
   SetIndexBuffer(1, deviator_a, INDICATOR_DATA);
   SetIndexBuffer(2, deviator_b, INDICATOR_DATA);
   SetIndexBuffer(3, buf_b, INDICATOR_CALCULATIONS);  
   SetIndexBuffer(4, buf_c, INDICATOR_CALCULATIONS);  
      
   ArraySetAsSeries(buf_a,true);
   ArraySetAsSeries(buf_b,true);
   ArraySetAsSeries(buf_c,true);
   ArraySetAsSeries(deviator_a,true);
   ArraySetAsSeries(deviator_b,true);
      
   PlotIndexSetString(0, PLOT_LABEL, TimeframeToString(timeframe_a));
   PlotIndexSetString(1, PLOT_LABEL, "Deviation from " + TimeframeToString(timeframe_b) + " to " + TimeframeToString(timeframe_a));
   PlotIndexSetString(2, PLOT_LABEL, "Deviation from " + TimeframeToString(timeframe_c) + " to " + TimeframeToString(timeframe_a));
     
   return(INIT_SUCCEEDED);
  }
  
//+------------------------------------------------------------------+
//| 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[])
{
   CopySeries(Symbol(), timeframe_a, 0, rates_total, COPY_RATES_CLOSE, buf_a);
   CopySeries(Symbol(), timeframe_b, 0, rates_total, COPY_RATES_CLOSE, buf_b);
   CopySeries(Symbol(), timeframe_c, 0, rates_total, COPY_RATES_CLOSE, buf_c);
    
   for(int i = rates_total - 1; i>=0; i--){
   
      deviator_a[i] = MathAbs(buf_b[i] - buf_a[i]) + buf_b[i] - offset*_Point;
      deviator_b[i] = MathAbs(buf_c[i] - buf_a[i]) + buf_c[i] - (offset*2)*_Point;
   }

   return(rates_total);
}


string TimeframeToString(const ENUM_TIMEFRAMES timeframe)
{
    string result;
    switch (timeframe){
    
        case PERIOD_M1:      result = "M1";      break;
        case PERIOD_M5:      result = "M5";      break;
        case PERIOD_M15:     result = "M15";     break;
        case PERIOD_M30:     result = "M30";     break;
        case PERIOD_H1:      result = "H1";      break;
        case PERIOD_H2:      result = "H2";      break;
        case PERIOD_H4:      result = "H4";      break;
        case PERIOD_D1:      result = "D1";      break;
        case PERIOD_W1:      result = "W1";      break;
        case PERIOD_MN1:     result = "MN1";     break;
        default:             result = "";        break;
    }
    return result;
}

Comments