StepMA_v7a_v1
Download scriptThe StepMA (Step Moving Average) is a sophisticated technical analysis tool designed to help traders identify market trends by smoothing out price fluctuations. Unlike standard moving averages that follow every minor price wiggle, this script focuses on identifying distinct "steps" or structural shifts in price movement.
Core Logic and Functionality
1. Dynamic Volatility Sensing The indicator does not treat all price movements equally. It uses a calculation based on Keltner Channels to assess market volatility. By analyzing the distance between the high and low prices over a specific period, the script determines how much "room" the market is moving in. This allows the tool to adjust its sensitivity automatically—tightening up during stable periods and widening out during high-activity phases.
2. Step Size Determination A key feature of this logic is the calculation of the "Step." Depending on your settings, the script determines a fixed or dynamic distance that the price must move before the trend is considered to have changed. It calculates an average range (ATR) and uses it to ensure that the "steps" are proportional to the current market environment, preventing small noise from triggering false signals.
3. Trend Detection and Filtering The script monitors whether the price has broken above or below specific calculated boundaries.
- Upward Trend: When the price closes significantly above the current upper boundary, the trend switches to positive.
- Downward Trend: When the price closes significantly below the current lower boundary, the trend switches to negative.
The logic ensures that once a trend is established, it stays "locked" until the price makes a significant enough move (a "step") in the opposite direction. This prevents the indicator from flickering back and forth during minor price consolidations.
4. Visual Representation Modes The script offers different ways to display this data on your chart:
- Standard Line: A continuous line that smooths the trend, providing a clear path of market direction.
- Trend Arrows/Buffers: In more advanced modes, the indicator can separate upward and downward movements into distinct visual elements, making it easier to see exactly where a trend reversal has occurred.
Summary for the User
In plain terms, this tool acts as a "filter" for the market. It ignores the "noise" of minor price fluctuations and only reacts when the price moves with enough strength to form a new step. It tells you not just where the price is going, but helps confirm the underlying structure of the trend by identifying significant shifts in momentum.
/*-----------------------------+
| |
| Shared by www.Aptrafx.com |
| |
+------------------------------*/
//+------------------------------------------------------------------+
//| 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 (ATR0<ATRmin) ATRmin=ATR0;
result=MathRound(0.5*Km*(ATRmax+ATRmin)/Point);
}
else
result=Km*StepSize;
return(result);
}
//---- StepMA Calculation
double StepMACalc (bool HL, double Size, int k)
{
int counted_bars=IndicatorCounted();
double result;
if (HL)
{
smax[k]=Low[k]+2.0*Size*Point;
smin[k]=High[k]-2.0*Size*Point;
}
else
{
smax[k]=Close[k]+2.0*Size*Point;
smin[k]=Close[k]-2.0*Size*Point;
}
if (counted_bars==0){smax[limit+1]=smax[limit];smin[limit+1]=smin[limit];trend[limit+1]=0;}
trend[k]=trend[k+1];
if (Close[k]>smax[k+1]) trend[k]=1;
if (Close[k]<smin[k+1]) trend[k]=-1;
if(trend[k]>0)
{
if(smin[k]<smin[k+1]) smin[k]=smin[k+1];
result=smin[k]+Size*Point;
}
else
{
if(smax[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);
}
Comments