//+------------------------------------------------------------------+ //|RK-ml-RSI_EMA_mtf v1.2 jan 22, 2011 original-RSI_EMA_MTF.mq4 | //| Kalenzo | //| bartlomiej.gorski@gmail.com | //+------------------------------------------------------------------+ #property copyright "Kalenzo" #property link "bartlomiej.gorski@gmail.com" #property indicator_separate_window #property indicator_buffers 3 #property indicator_color1 Blue #property indicator_color2 Orange #property indicator_width1 2 extern string TimeFrame = "30"; extern int RsiPeriod = 5; extern int MaType = MODE_EMA; extern int MaPeriod = 3; extern bool Interpolate = true; extern string arrowsIdentifier = "RsiEmaArrows"; extern color arrowsUpColor = Cyan; extern color arrowsDnColor = Red; extern int theWidth = 3; extern color arrowsUpChar = 233; extern color arrowsDnChar = 234; // // // // // extern bool alertsOn = true; extern bool alertsOnCurrent = false; extern bool alertsMessage = true; extern bool alertsSound = true; extern bool alertsEmail = false; // // // // // double rsi[],ema[],trend[]; string indicatorFileName; bool calculating = false; bool returningBars = false; int timeFrame; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators IndicatorBuffers(3); SetIndexBuffer(0,rsi); SetIndexLabel(0,"rsi"); SetIndexBuffer(1,ema); SetIndexLabel(1,"ema"); SetIndexBuffer(2,trend); SetIndexLabel(2,"trend"); if (TimeFrame=="calculate") { calculating=true; return(0); } if (TimeFrame=="returnBars") { returningBars=true; return(0); } timeFrame = stringToTimeFrame(TimeFrame); indicatorFileName = WindowExpertName(); IndicatorShortName("RK-ml-RSI_EMA_mtf v1.2 "+tf()); //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { deleteArrows(); //---- //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { int counted_bars=IndicatorCounted(); int i,limit; if(counted_bars < 0) return(-1); if(counted_bars>0) counted_bars--; limit = MathMin(Bars-counted_bars,Bars-1); if (returningBars) { rsi[0] = limit+1; return(0); } if (timeFrame > Period()) limit = MathMax(limit,MathMin(Bars-1,iCustom(NULL,timeFrame,indicatorFileName,"returnBars",0,0)*timeFrame/Period())); // // // // // if (calculating) { for(i=0; i=0; i--) { int y = iBarShift(NULL,timeFrame,Time[i]); rsi[i] = iCustom(NULL,timeFrame,indicatorFileName,"calculate",RsiPeriod,MaType,MaPeriod,0,y); ema[i] = iCustom(NULL,timeFrame,indicatorFileName,"calculate",RsiPeriod,MaType,MaPeriod,1,y); // // // must be done before interpolation // // trend[i] = trend[i+1]; if (rsi[i]>ema[i]) trend[i]= 1; if (rsi[i]= time; n++) continue; double factor = 1.0 / n; for(int k = 1; k < n; k++) { rsi[i+k] = k*factor*rsi[i+n] + (1.0-k*factor)*rsi[i]; ema[i+k] = k*factor*ema[i+n] + (1.0-k*factor)*ema[i]; } } // // // // // if (alertsOn) { if (alertsOnCurrent) int whichBar = 0; else whichBar = 1; if (trend[whichBar] != trend[whichBar+1]) { if (trend[whichBar] == 1) doAlert("up"); if (trend[whichBar] ==-1) doAlert("down"); } } return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ // // // // // void drawArrow(int i,color theColor,int theCode,bool up) { string name = arrowsIdentifier+":"+Time[i]; double gap = 3.0*iATR(NULL,0,20,i)/4.0; // // // // // ObjectCreate(name,OBJ_ARROW,0,Time[i],0); ObjectSet(name,OBJPROP_ARROWCODE,theCode); ObjectSet(name,OBJPROP_COLOR,theColor); ObjectSet(name,OBJPROP_WIDTH,theWidth); if (up) ObjectSet(name,OBJPROP_PRICE1,High[i]+gap); else ObjectSet(name,OBJPROP_PRICE1,Low[i] -gap); } // // // // // void deleteArrows() { string lookFor = arrowsIdentifier+":"; int lookForLength = StringLen(lookFor); for (int i=ObjectsTotal()-1; i>=0; i--) { string objectName = ObjectName(i); if (StringSubstr(objectName,0,lookForLength) == lookFor) ObjectDelete(objectName); } } void deleteArrow(datetime time) { string lookFor = arrowsIdentifier+":"+time; ObjectDelete(lookFor); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ // // // // // void doAlert(string doWhat) { static string previousAlert="nothing"; static datetime previousTime; string message; if (previousAlert != doWhat || previousTime != Time[0]) { previousAlert = doWhat; previousTime = Time[0]; // // // // // message = StringConcatenate(Symbol()," at ",TimeToStr(TimeLocal(),TIME_SECONDS)," RSI crossed EMA ",doWhat); if (alertsMessage) Alert(message); if (alertsEmail) SendMail(StringConcatenate(Symbol(),"RsiEma"),message); if (alertsSound) PlaySound("alert2.wav"); } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ // // // // // int stringToTimeFrame(string tfs) { for(int l = StringLen(tfs)-1; l >= 0; l--) { int char = StringGetChar(tfs,l); if((char > 96 && char < 123) || (char > 223 && char < 256)) tfs = StringSetChar(tfs, l, char - 32); else if(char > -33 && char < 0) tfs = StringSetChar(tfs, l, char + 224); } int tf=0; if (tfs=="M1" || tfs=="1") tf=PERIOD_M1; if (tfs=="M5" || tfs=="5") tf=PERIOD_M5; if (tfs=="M15"|| tfs=="15") tf=PERIOD_M15; if (tfs=="M30"|| tfs=="30") tf=PERIOD_M30; if (tfs=="H1" || tfs=="60") tf=PERIOD_H1; if (tfs=="H4" || tfs=="240") tf=PERIOD_H4; if (tfs=="D1" || tfs=="1440") tf=PERIOD_D1; if (tfs=="W1" || tfs=="10080") tf=PERIOD_W1; if (tfs=="MN" || tfs=="43200") tf=PERIOD_MN1; if (tf==0 || tf