//+------------------------------------------------------------------+ //| KST.mt4 | //| Copyright © 2011, Robert Hill | //| | //| Based on formulas from Martin Pring | //| | //| DAILY KST SIMPLE MOVING AVERAGE | //| (Mov(Roc(C,10,%),10,S)*1) + (Mov(Roc(C,15,%),10,S)*2) + | //| (Mov(Roc (C,20,%),10,S)*3) + (Mov(Roc(C,30,%),15,S)*4) | //| | //| LONG-TERM MONTHLY KST SIMPLE MOVING AVERAGE | //| ( (Mov(Roc(C,9,%),6,S)*1) + (Mov(Roc(C,12,%),6,S)*2) + | //| (Mov(Roc(C ,18,%),6,S)*3) + (Mov(Roc(C,24,%),9,S)*4) ) / 4 | //| | //| INTERMEDIATE KST SIMPLE MOVING AVERAGE | //| (Mov(Roc(C,10,%),10,S)*1) + (Mov(Roc(C,13,%),13,S)*2) + | //| (Mov(Roc (C,15,%),15,S)*3) + (Mov(Roc(C,20,%),20,S)*4) | //| | //| INTERMEDIATE KST EXPONENTIAL MOVING AVERAGE | //| (Mov(Roc(C,10,%),10,E)*1) + (Mov(Roc(C,13,%),13,E)*2) + | //| (Mov(Roc (C,15,%),15,E)*3) + (Mov(Roc(C,20,%),20,E)*4) | //| | //| LONG-TERM KST EXPONENTIAL MOVING AVERAGE | //| (Mov(Roc(C,39,%),26,E)*1) + (Mov(Roc(C,52,%),26,E)*2) + | //| (Mov(Roc (C,78,%),26,E)*3) + (Mov(Roc(C,109,%),39,E)*4) | //| | //| SHORT-TERM KST WEEKLY EXPONENTIAL MOVING AVERAGE | //| (Mov(Roc(C,3,%),3, E)*1) + (Mov(Roc(C,4,%),4, E)*2) + | //| (Mov(Roc(C,6,%),6, E)*3) + (Mov(Roc(C,10,%),8, E)*4) | //| | //+------------------------------------------------------------------+ #property copyright "Copyright © 2011, Robert Hill " //---- indicator settings #property indicator_separate_window #property indicator_buffers 1 #property indicator_color1 Red #property indicator_width1 2 extern string k0 = "---Enter KST Type---"; extern string k1 = "1. DAILY SMA"; extern string k2 = "2. LONG-TERM MONTHLY SMA"; extern string k3 = "3. INTERMEDIATE SMA"; extern string k4 = "4. INTERMEDIATE EMA"; extern string k5 = "5. LONG-TERM EMA"; extern string k6 = "6. SHORT-TERM WEEKLY EMA"; extern int KST_Type = 1; extern int BarsBack = 1000; extern bool SoundON=true; extern bool EmailON=false; int ROC_Period1; int ROC_Period2; int ROC_Period3; int ROC_Period4; int MA_Period1; int MA_Period2; int MA_Period3; int MA_Period4; int MA_Type; int flagval1 = 0; int flagval2 = 0; //---- buffers double KST[]; double Buffer1[]; double ROC1[]; double ROC2[]; double ROC3[]; double ROC4[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- drawing settings IndicatorBuffers(6); SetIndexStyle(0,DRAW_LINE); IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)+2); //---- 3 indicator buffers mapping if(!SetIndexBuffer(0,KST) && !SetIndexBuffer(1,Buffer1) && !SetIndexBuffer(2,ROC1)&& !SetIndexBuffer(3,ROC2) && !SetIndexBuffer(4,ROC3) && !SetIndexBuffer(5,ROC4)) Print("cannot set indicator buffers!"); //---- name for DataWindow and indicator subwindow label GetKST_Settings(); IndicatorShortName("KST"); //---- initialization done return(0); } void GetKST_Settings() { switch (KST_Type) { case 1 : ROC_Period1 = 10; ROC_Period2 = 15; ROC_Period3 = 20; ROC_Period4 = 30; MA_Period1 = 10; MA_Period2 = 10; MA_Period3 = 10; MA_Period4 = 15; MA_Type = MODE_SMA; break; case 2 : ROC_Period1 = 9; ROC_Period2 = 12; ROC_Period3 = 18; ROC_Period4 = 24; MA_Period1 = 6; MA_Period2 = 6; MA_Period3 = 6; MA_Period4 = 9; MA_Type = MODE_SMA; break; case 3 : ROC_Period1 = 10; ROC_Period2 = 13; ROC_Period3 = 15; ROC_Period4 = 20; MA_Period1 = 10; MA_Period2 = 13; MA_Period3 = 15; MA_Period4 = 20; MA_Type = MODE_SMA; break; case 4 : ROC_Period1 = 10; ROC_Period2 = 13; ROC_Period3 = 15; ROC_Period4 = 20; MA_Period1 = 10; MA_Period2 = 13; MA_Period3 = 15; MA_Period4 = 20; MA_Type = MODE_EMA; break; case 5 : ROC_Period1 = 39; ROC_Period2 = 52; ROC_Period3 = 78; ROC_Period4 = 109; MA_Period1 = 26; MA_Period2 = 26; MA_Period3 = 26; MA_Period4 = 39; MA_Type = MODE_EMA; break; case 6 : ROC_Period1 = 3; ROC_Period2 = 4; ROC_Period3 = 6; ROC_Period4 = 10; MA_Period1 = 3; MA_Period2 = 4; MA_Period3 = 6; MA_Period4 = 8; MA_Type = MODE_EMA; break; default : ROC_Period1 = 10; ROC_Period2 = 15; ROC_Period3 = 20; ROC_Period4 = 15; MA_Period1 = 10; MA_Period2 = 10; MA_Period3 = 10; MA_Period4 = 15; MA_Type = MODE_SMA; break; } } int start() { int limit, i; int counted_bars=IndicatorCounted(); double price, prevPrice; double KSTnow, KSTprev; if(counted_bars>0) counted_bars--; limit=Bars-counted_bars; limit = BarsBack; for(i = limit; i >= 0; i--) { price = Close[i]; prevPrice = Close[i+ROC_Period1]; Buffer1[i]= (price-prevPrice)/prevPrice; } for(i = limit; i >=0; i--) ROC1[i] = iMAOnArray(Buffer1,0,MA_Period1,0,MA_Type,i); for(i = limit; i >= 0; i--) { price = Close[i]; prevPrice = Close[i+ROC_Period2]; Buffer1[i]= (price-prevPrice)/prevPrice; } for(i = limit; i >=0; i--) ROC2[i] = iMAOnArray(Buffer1,0,MA_Period2,0,MA_Type,i); for(i = limit; i >= 0; i--) { price = Close[i]; prevPrice = Close[i+ROC_Period3]; Buffer1[i]= (price-prevPrice)/prevPrice; } for(i = limit; i >=0; i--) ROC3[i] = iMAOnArray(Buffer1,0,MA_Period3,0,MA_Type,i); for(i = limit; i >= 0; i--) { price = Close[i]; prevPrice = Close[i+ROC_Period4]; Buffer1[i]= (price-prevPrice)/prevPrice; } for(i = limit; i >=0; i--) ROC4[i] = iMAOnArray(Buffer1,0,MA_Period4,0,MA_Type,i); //========== COLOR CODING =========================================== for(i = limit; i >=0; i--) { KST[i] = ROC1[i] + ROC2[i]*2.0 + ROC3[i]*3.0 + ROC4[i]*4.0; if (KST_Type == 2) KST[i] /= 4.0; KSTnow = KST[i]; KSTprev = KST[i+1]; // Check for a fresh cross to reduce arrows and alerts if ((KSTnow > 0) && (KSTprev < 0)) { if (i == 1 && flagval1==0) { flagval1=1; flagval2=0; DoAlert("BUY"); } } // Check for a fresh cross to reduce arrows and alerts if ((KSTnow < 0) && (KSTprev > 0)) { if (i == 1 && flagval2==0) { flagval2=1; flagval1=0; DoAlert("SELL"); } } } return(0); } void DoAlert(string which) { datetime tc; tc = TimeCurrent(); if (SoundON) Alert(which + " signal at Ask=",Ask,"\n Bid=",Bid,"\n Date=",TimeToStr(tc,TIME_DATE)," ",TimeHour(tc),":",TimeMinute(tc),"\n Symbol=",Symbol()," Period=",Period()); if (EmailON) SendMail(which + " signal alert",which + " signal at Ask="+DoubleToStr(Ask,4)+", Bid="+DoubleToStr(Bid,4)+", Date="+TimeToStr(tc,TIME_DATE)+" "+TimeHour(tc)+":"+TimeMinute(tc)+" Symbol="+Symbol()+" Period="+Period()); } //+------------------------------------------------------------------+