//+------------------------------------------------------------------+ //| MACD Histogram MTF MC.mq5 | //| Copyright © 2010, AK20 | //| traderak20@gmail.com | //+------------------------------------------------------------------+ #property copyright "2010, traderak20@gmail.com" #property description "Moving Average Convergence/Divergence, Histogram, Multi-timeframe, Multi-color" #property version "V02B" #property indicator_separate_window #property indicator_buffers 4 #property indicator_plots 3 //--- indicator plots #property indicator_type1 DRAW_LINE #property indicator_type2 DRAW_LINE #property indicator_type3 DRAW_COLOR_HISTOGRAM #property indicator_color1 Blue #property indicator_color2 Red #property indicator_color3 Green,Red,Blue #property indicator_width1 1 #property indicator_width2 1 #property indicator_width3 1 #property indicator_label1 "MACD_TF2" #property indicator_label2 "Signal_TF2" #property indicator_label3 "Histogram_TF2" //--- enum variables enum colorswitch // use single or multi-color display of Histogram { MultiColor=0, SingleColor=1 }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ enum maswitch // use SMA or EMA when calculating Signal { Simple=MODE_SMA, Exponential=MODE_EMA }; //--- input parameters input ENUM_TIMEFRAMES InpTimeFrame_2=PERIOD_H1; // Timeframe 2 (TF2) period input string InpIndicator_TF1="MACD_Histogram_MC"; // Location of single timeframe indicator input int InpFastEMA=12; // Fast EMA period input int InpSlowEMA=26; // Slow EMA period input int InpSignalMA=9; // Signal MA period input maswitch InpAppliedSignalMA=MODE_SMA; // Applied MA method for signal line input ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_CLOSE; // Applied price input colorswitch InpUseMultiColor=MultiColor; // Use multi-color or single-color histogram //--- indicator buffers double ExtMacdBuffer_TF2[]; double ExtSignalBuffer_TF2[]; double ExtHistogramBuffer_TF2[]; double ExtHistogramColorBuffer_TF2[]; //--- arrays TF2 - to retrieve TF 2 values of buffers and/or timeseries double ExtMacdArray_TF2[]; // intermediate array to hold TF2 macd buffer values double ExtSignalArray_TF2[]; // intermediate array to hold TF2 signal buffer values double ExtHistogramArray_TF2[]; // intermediate array to hold TF2 histogram buffer values double ExtHistogramColorArray_TF2[]; // intermediate array to hold TF2 histogram color buffer values //--- variables int PeriodRatio=1; // ratio between timeframe 1 (TF1) and timeframe 2 (TF2) int PeriodSeconds_TF1; // TF1 period in seconds int PeriodSeconds_TF2; // TF2 period in seconds //--- indicator handles TF2 int ExtMacdHandle_TF2; // macd handle TF2 //--- turn on/off error messages bool ShowErrorMessages=false; // turn on/off error messages for debugging //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ void OnInit() { //--- indicator buffers mapping SetIndexBuffer(0,ExtMacdBuffer_TF2,INDICATOR_DATA); SetIndexBuffer(1,ExtSignalBuffer_TF2,INDICATOR_DATA); SetIndexBuffer(2,ExtHistogramBuffer_TF2,INDICATOR_DATA); SetIndexBuffer(3,ExtHistogramColorBuffer_TF2,INDICATOR_COLOR_INDEX); //--- calculate at which bar to start drawing indicators PeriodSeconds_TF1=PeriodSeconds(); PeriodSeconds_TF2=PeriodSeconds(InpTimeFrame_2); if(PeriodSeconds_TF1rates_total) limit=rates_total-1; else limit=rates_total-prev_calculated; //--- create variable required to convert between TF1 and TF2 datetime convertedTime; //--- loop through TF1 bars to set buffer TF1 values for(int i=limit;i>=0;i--) { //--- convert time TF1 to nearest earlier time TF2 for a bar opened on TF2 which is to close during the current TF1 bar //--- use this for calculations with PRICE_CLOSE, PRICE_HIGH, PRICE_LOW, PRICE_MEDIAN, PRICE_TYPICAL, PRICE_WEIGHTED if(InpAppliedPrice!=PRICE_OPEN) convertedTime=Time[i]+PeriodSeconds_TF1-PeriodSeconds_TF2; //--- convert time TF1 to nearest earlier time TF2 for a bar opened on TF2 at the same time or before the current TF1 bar //--- use this for calculations with PRICE_OPEN if(InpAppliedPrice==PRICE_OPEN) convertedTime=Time[i]; //--- check if TF2 data is available at convertedTime datetime tempTimeArray_TF2[]; CopyTime(NULL,InpTimeFrame_2,calculated_TF2-1,1,tempTimeArray_TF2); //--- no TF2 data available if(convertedTime