//+------------------------------------------------------------------+ //| SAR of MACD.mq4 | //| Copyright © 2009, RoboFx | //| http://www.robofx.org | //+------------------------------------------------------------------+ #property copyright "Copyright © 2009, RoboFx" #property link "http://www.robofx.org" //---- indicator settings #property indicator_separate_window #property indicator_buffers 3 #property indicator_color1 Silver #property indicator_color2 Red #property indicator_color3 Yellow #property indicator_width1 2 //---- indicator parameters extern int FastEMA=12; extern int SlowEMA=26; extern int SignalSMA=9; extern double SarStep = 0.01; extern double SarMax = 0.1; //---- indicator buffers double MacdBuffer[]; double SignalBuffer[]; double SarBuffer[]; int save_lastreverse; bool save_dirlong; double save_start; double save_last_high; double save_last_low; double save_ep; double save_sar; int bartime; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- drawing settings SetIndexStyle(0,DRAW_HISTOGRAM); SetIndexStyle(1,DRAW_LINE); SetIndexStyle(2,DRAW_ARROW); SetIndexArrow(2, 159); SetIndexDrawBegin(1,SignalSMA); IndicatorDigits(Digits+1); //---- indicator buffers mapping SetIndexBuffer(0,MacdBuffer); SetIndexBuffer(1,SignalBuffer); SetIndexBuffer(2,SarBuffer); //---- name for DataWindow and indicator subwindow label IndicatorShortName("SAR of MACD"); SetIndexLabel(0,"MACD"); SetIndexLabel(1,"Signal"); SetIndexLabel(2,"SAR of MACD"); //---- initialization done return(0); } void SaveLastReverse(int last, int dir, double start, double low, double high, double ep, double sar) { save_lastreverse = last; save_dirlong = dir; save_start = start; save_last_low = low; save_last_high = high; save_ep = ep; save_sar = sar; } //+------------------------------------------------------------------+ //| Moving Averages Convergence/Divergence | //+------------------------------------------------------------------+ int start() { int limit; int i, counted_bars=IndicatorCounted(); static bool first = true; bool dirlong; double start, last_high, last_low; double ep, sar, price_low, price_high, price; if(Bars < 3) return(0); i=Bars-2; //---- last counted bar will be recounted if(counted_bars>0) counted_bars--; limit=Bars-counted_bars; //---- macd counted in the 1-st buffer for(i=0; i 0) { save_lastreverse = i; price_low = SignalBuffer[i]; //---- if(last_low > price_low) last_low = price_low; price_high = SignalBuffer[i]; //---- if(last_high < price_high) last_high = price_high; //---- if(price_high > SignalBuffer[i+1] && price_low > SignalBuffer[i+1]) break; //---- if(price_high < SignalBuffer[i+1] && price_low < SignalBuffer[i+1]) { dirlong = false; break; } i--; } //---- initial zero int k = i; Print(" k=", k, " Bars=", Bars); //---- while(k < Bars) { SarBuffer[k] = 0.0; k++; } //---- check further if(dirlong) { SarBuffer[i] = SignalBuffer[i+1]; ep = SignalBuffer[i]; } else { SarBuffer[i] = SignalBuffer[i+1]; ep = SignalBuffer[i]; } i--; } else { i = save_lastreverse; start = save_start; dirlong = save_dirlong; last_high = save_last_high; last_low = save_last_low; ep = save_ep; sar = save_sar; if(Time[0] != bartime) { bartime = Time[0]; i++; } } while(i >= 0) { price_low = SignalBuffer[i]; price_high = SignalBuffer[i]; //--- check for reverse from long to short if(dirlong && price_low < SarBuffer[i+1]) { SaveLastReverse(i, true, start, price_low, last_high, ep, sar); start = SarStep; dirlong = false; ep = price_low; last_low = price_low; SarBuffer[i] = last_high; i--; continue; } //--- check for reverse from short to long if(!dirlong && price_high > SarBuffer[i+1]) { SaveLastReverse(i, false, start, last_low, price_high, ep, sar); start = SarStep; dirlong = true; ep = price_high; last_high = price_high; SarBuffer[i] = last_low; i--; continue; } //sar(i) = sar(i+1)+start*(ep-sar(i+1)) price = SarBuffer[i+1]; sar = price + start*(ep - price); //---- if(dirlong) { if(ep < price_high && (start + SarStep) <= SarMax) start += SarStep; //---- if(price_high < SignalBuffer[i+1] && i == Bars - 2) sar = SarBuffer[i+1]; price = SignalBuffer[i+1]; //---- if(sar > price) sar = price; price = SignalBuffer[i+2]; //---- if(sar > price) sar = price; //---- if(sar > price_low) { SaveLastReverse(i, true, start, price_low, last_high, ep, sar); start = SarStep; dirlong = false; ep = price_low; last_low = price_low; SarBuffer[i] = last_high; i--; continue; } //---- if(ep < price_high) { last_high = price_high; ep = price_high; } } //dir-long else { if(ep > price_low && (start + SarStep) <= SarMax) start += SarStep; //---- if(price_low < SignalBuffer[i+1] && i == Bars - 2) sar = SarBuffer[i+1]; price = SignalBuffer[i+1]; //---- if(sar < price) sar = price; price = SignalBuffer[i+2]; //---- if(sar < price) sar = price; //---- if(sar < price_high) { SaveLastReverse(i, false, start, last_low, price_high, ep,sar); start = SarStep; dirlong = true; ep = price_high; last_high = price_high; SarBuffer[i] = last_low; i--; continue; } //---- if(ep > price_low) { last_low = price_low; ep = price_low; } } //dir-short SarBuffer[i] = sar; i--; } return(0); } //+------------------------------------------------------------------+