//+------------------------------------------------------------------+ //| StepMA_v7.mq4 | //| Copyright 2006, TrendLaboratory | //| http://finance.groups.yahoo.com/group/TrendLaboratory | //| E-mail: igorad2003@yahoo.co.uk | //+------------------------------------------------------------------+ #property copyright "Copyright 2006, TrendLaboratory" #property link "http://finance.groups.yahoo.com/group/TrendLaboratory" #property indicator_chart_window #property indicator_buffers 3 #property indicator_color1 Crimson #property indicator_color2 Blue #property indicator_color3 Red //---- input parameters extern int Length = 10; // Volty Length extern double Kv = 1.0; // Sensivity Factor extern int StepSize = 0; // Constant Step Size (if need) extern int MA_Mode = 0; // Volty MA Mode : 0-SMA, 1-LWMA extern int Advance = 0; // Offset extern double Percentage = 0; // Percentage of Up/Down Moving extern bool HighLow = false; // High/Low Mode Switch (more sensitive) extern int ColorMode = 0; // Color Mode Switch extern int BarsNumber = 1000; extern int period = 10; //---- indicator buffers double LineBuffer[]; double UpBuffer[]; double DnBuffer[]; double smin[]; double smax[]; double trend[]; double StepMA=0, ATR0=0,ATRmax=-100000,ATRmin=1000000; int limit; //---- StepSize Calculation double get_current_Kv(int shift){ double u,l; find_keltner_channels(shift,u,l); double range = (u-l)/Point; double c = (Close[shift]-l)/Point; if(range!=0) return (MathAbs(0.5 - c / range) + Kv); return (Kv); } void find_keltner_channels(int shift,double &u,double &l) { double sum=0; for (int x=shift;x<(shift+period);x++) sum += High[x]-Low[x]; double avg = sum/period; double middle = iMA(NULL, 0, period, 0, MODE_SMA, PRICE_TYPICAL, shift); u = middle + avg; l = middle - avg; } double StepSizeCalc ( int Len, double Km, int Size, int k) { double result; if( Size==0 ) { double AvgRange=0; for (int i=Len-1;i>=0;i--) { if(MA_Mode==0) double alfa= 1.0; else alfa= 1.0+1.0*(Len-i)/Len; AvgRange+= alfa*(High[k+i]-Low[k+i]); } ATR0 = AvgRange/Len; if (ATR0>ATRmax) ATRmax=ATR0; if (ATR0smax[k+1]) trend[k]=1; if (Close[k]0) { if(smin[k]smax[k+1]) smax[k]=smax[k+1]; result=smax[k]-Size*Point; } //Print (" k=",k," trend=",trend[k], " res=",result," Smax=", smax[k], " Smin=", smin[k]); return(result); } //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { string short_name; //---- indicator line IndicatorBuffers(6); SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,2); SetIndexStyle(1,DRAW_LINE); SetIndexStyle(2,DRAW_LINE); SetIndexArrow(1,159); SetIndexArrow(2,159); SetIndexBuffer(0,LineBuffer); SetIndexBuffer(1,UpBuffer); SetIndexBuffer(2,DnBuffer); SetIndexShift(0,Advance); SetIndexShift(1,Advance); SetIndexShift(2,Advance); SetIndexBuffer(3,smin); SetIndexBuffer(4,smax); SetIndexBuffer(5,trend); //---- name for DataWindow and indicator subwindow label short_name="StepMA("+Length+","+Kv+","+StepSize+")"; IndicatorShortName(short_name); SetIndexLabel(0,short_name); SetIndexLabel(1,"UpTrend"); SetIndexLabel(2,"DownTrend"); //---- SetIndexDrawBegin(0,Length); SetIndexDrawBegin(1,Length); SetIndexDrawBegin(2,Length); //---- return(0); } //+------------------------------------------------------------------+ //| Custor indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| StepMA_v7 | //+------------------------------------------------------------------+ int start() { int shift, counted_bars=IndicatorCounted(); if ( BarsNumber > 0 ) int Nbars=BarsNumber; else Nbars=Bars; if ( counted_bars > 0 ) limit=Nbars-counted_bars; if ( counted_bars < 0 ) return(0); if ( counted_bars ==0 ) limit=Nbars-Length-1; for(shift=limit;shift>=0;shift--){ int Step = StepSizeCalc( Length, get_current_Kv(shift)/*Kv*/, StepSize, shift); Comment (" StepSize= ", Step); StepMA = StepMACalc ( HighLow, Step, shift)+Percentage/100.0*Step*Point; if ( ColorMode == 0) LineBuffer[shift]=StepMA; else if ( ColorMode == 1){ if ( trend[shift]>0 ) { UpBuffer[shift]=StepMA-Step*Point;DnBuffer[shift]=EMPTY_VALUE; } else if ( trend[shift]<0 ) { DnBuffer[shift]=StepMA+Step*Point;UpBuffer[shift]=EMPTY_VALUE; } } else if ( ColorMode == 2){ if (trend[shift]>0){ UpBuffer[shift]=StepMA; if ( trend[shift+1] < 0 ) UpBuffer[shift+1] = DnBuffer[shift+1]; DnBuffer[shift]=EMPTY_VALUE; } else if (trend[shift]<0){ DnBuffer[shift]=StepMA; if ( trend[shift+1] > 0 ) DnBuffer[shift+1] = UpBuffer[shift+1]; UpBuffer[shift]=EMPTY_VALUE; } } else{ UpBuffer[shift]=EMPTY_VALUE; DnBuffer[shift]=EMPTY_VALUE; } } return(0); }