//+------------------------------------------------------------------+ //| STC_COLOR.mq4 | //+------------------------------------------------------------------+ #property indicator_separate_window #property indicator_buffers 7 #property indicator_color1 Silver #property indicator_color6 Lime #property indicator_color7 Red #property indicator_width1 2 #property indicator_width6 2 #property indicator_width7 2 //+------------------------------------------------------------------+ #property indicator_level1 90 #property indicator_level2 10 #property indicator_levelstyle DRAW_LINE #property indicator_levelcolor MediumBlue //+------------------------------------------------------------------+ extern int STCPeriod = 10; extern int FastMAPeriod = 23; extern int SlowMAPeriod = 50; //+------------------------------------------------------------------+ double stcBuffer[]; double macdBuffer[]; double fastKBuffer[]; double fastDBuffer[]; double fastKKBuffer[]; double Upper[]; double Lower[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { IndicatorBuffers(7); SetIndexBuffer(0,stcBuffer); SetIndexBuffer(1,macdBuffer); SetIndexBuffer(2,fastKBuffer); SetIndexBuffer(3,fastDBuffer); SetIndexBuffer(4,fastKKBuffer); SetIndexBuffer(5,Upper); SetIndexBuffer(6,Lower); SetIndexStyle(1,DRAW_NONE); SetIndexStyle(2,DRAW_NONE); SetIndexStyle(3,DRAW_NONE); SetIndexStyle(4,DRAW_NONE); SetIndexStyle(5,DRAW_LINE, EMPTY, 2); SetIndexStyle(6,DRAW_LINE, EMPTY, 2); IndicatorShortName("STC_COLOR("+STCPeriod+","+FastMAPeriod+","+SlowMAPeriod+")"); return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { int counted_bars=IndicatorCounted(); int limit,i; if(counted_bars < 0) return(-1); if(counted_bars > 0) counted_bars--; //+------------------------------------------------------------------+ limit = Bars-counted_bars; for(i = limit; i >= 0; i--) { macdBuffer[i] = iMA(NULL,0,FastMAPeriod,0,MODE_EMA,PRICE_CLOSE,i)- iMA(NULL,0,SlowMAPeriod,0,MODE_EMA,PRICE_CLOSE,i); //+------------------------------------------------------------------+ double lowMacd = minValue(macdBuffer,i); double highMacd = maxValue(macdBuffer,i)-lowMacd; if (highMacd > 0) fastKBuffer[i] = 100*((macdBuffer[i]-lowMacd)/highMacd); else fastKBuffer[i] = fastKBuffer[i+1]; fastDBuffer[i] = fastDBuffer[i+1]+0.5*(fastKBuffer[i]-fastDBuffer[i+1]); //+------------------------------------------------------------------+ double lowStoch = minValue(fastDBuffer,i); double highStoch = maxValue(fastDBuffer,i)-lowStoch; if (highStoch > 0) fastKKBuffer[i] = 100*((fastDBuffer[i]-lowStoch)/highStoch); else fastKKBuffer[i] = fastKKBuffer[i+1]; stcBuffer[i] = stcBuffer[i+1]+0.5*(fastKKBuffer[i]-stcBuffer[i+1]); } //+------------------------------------------------------------------+ for(i = limit; i >= 0; i--) { if (stcBuffer[i] > stcBuffer[i+1]) { Upper[i] = stcBuffer[i]; Upper[i+1] = stcBuffer[i+1]; } else { Upper[i] = EMPTY_VALUE; if (Upper[i+2] == EMPTY_VALUE) Upper[i+1] = EMPTY_VALUE; } if (stcBuffer[i] < stcBuffer[i+1]) { Lower[i] = stcBuffer[i]; Lower[i+1] = stcBuffer[i+1]; } else { Lower[i] = EMPTY_VALUE; if (Lower[i+2] == EMPTY_VALUE) Lower[i+1] = EMPTY_VALUE; } } //+------------------------------------------------------------------+ return(0); } //+------------------------------------------------------------------+ //| ... | //+------------------------------------------------------------------+ double minValue(double& array[],int shift) { double minValue = array[shift]; for (int i=1; i<STCPeriod; i++) minValue = MathMin(minValue,array[shift+i]); return(minValue); } double maxValue(double& array[],int shift) { double maxValue = array[shift]; for (int i=1; i<STCPeriod; i++) maxValue = MathMax(maxValue,array[shift+i]); return(maxValue); }
Sample
Analysis
Market Information Used:
Indicator Curves created:
Implements a curve of type DRAW_NONE
Implements a curve of type DRAW_LINE
Indicators Used:
Moving average indicator
Custom Indicators Used:
Order Management characteristics:
Other Features: