//+------------------------------------------------------------------+ //| Schaff Trend Cycle.mq4 | //| Ramdass - Conversion only | //+------------------------------------------------------------------+ #property copyright "Copyright 2004, FostarFX." #property link "mail: fostar_fx@yahoo.com" #property indicator_separate_window #property indicator_minimum -10 #property indicator_maximum 110 #property indicator_buffers 1 #property indicator_color1 DarkOrchid //---- input parameters extern int MAShort=23; extern int MALong=50; extern double Cycle=10; extern int CountBars=300; //---- buffers double MA[]; double ST[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { // string short_name; //---- indicator line IndicatorBuffers(2); SetIndexBuffer(0, MA); SetIndexBuffer(1, ST); SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,2,DarkOrchid); //---- //---- return(0); } //+------------------------------------------------------------------+ //| Schaff Trend Cycle | //+------------------------------------------------------------------+ int start() { SetIndexDrawBegin(0,Bars-CountBars+MALong+MAShort+1); int shift,u,counted_bars=IndicatorCounted(); double MCD, LLV, HHV, MA_Short, MA_Long, sum ,prev, smconst; int n, i, s; bool check_begin=false, check_begin_MA=false; double MCD_Arr[100]; if(Bars<=MALong) return(0); if (CountBars==0) CountBars=Bars; //---- initial zero if(counted_bars=MALong) shift=Bars-counted_bars-1; check_begin = false; check_begin_MA = false; n = 1; s = 1; smconst = 2 / (1 + Cycle/2); while(shift>=0) { MA_Short = iMA(NULL,0,MAShort,0, MODE_EMA, PRICE_TYPICAL, shift); MA_Long = iMA(NULL,0,MALong,0, MODE_EMA, PRICE_TYPICAL, shift); MCD_Arr[n] = MA_Short - MA_Long; MCD = MA_Short - MA_Long; if (n >= Cycle) { n = 1; check_begin = true; } else {n = n + 1;} if (check_begin) { for (i = 1; i<=Cycle; i++) { if (i == 1) {LLV = MCD_Arr[i];} else { if (LLV > MCD_Arr[i]) LLV = MCD_Arr[i]; } if (i == 1) {HHV = MCD_Arr[i];} else { if (HHV < MCD_Arr[i]) HHV = MCD_Arr[i]; } } ST[shift] = ((MCD - LLV)/(HHV - LLV))*100 + 0.01; s = s + 1; if (s >= (Cycle)/2) { s = 1; check_begin_MA = true; } } else {ST[shift] = 0;} if (check_begin_MA) { prev = MA[shift + 1]; MA[shift] = smconst * (ST[shift] - prev) + prev; } shift--; } return(0); } //+------------------------------------------------------------------+