StepMA_v7[1].1
Download scriptThe StepMA (Step Moving Average) is a sophisticated technical analysis tool designed to identify market trends by filtering out minor price fluctuations. Unlike traditional moving averages that create smooth, continuous curves, this indicator operates on a "stepped" logic, reacting primarily to significant price breakouts while remaining stable during periods of consolidation.
Core Logic and Mechanism
1. Dynamic Volatility Measurement The indicator begins by assessing the market's current environment. It calculates the average range of price movement over a user-defined period. By identifying the maximum and minimum volatility within this timeframe, it establishes a "Step Size." This ensures that the size of the steps is proportional to the market's actual behavior—making the indicator more responsive in volatile markets and more stable during quieter periods.
2. Price Breakout Detection The logic relies on establishing boundaries above and below the current price. The script monitors whether the market price closes outside of these boundaries:
- Upward Trend: If the price breaks above the upper boundary, the indicator recognizes a bullish shift.
- Downward Trend: If the price falls below the lower boundary, it recognizes a bearish shift.
3. The "Stepped" Movement Once a trend is identified, the moving average does not move with every tiny tick of the price. Instead:
- In an Upward Trend, the indicator stays flat (horizontal) and only "steps" upward when the market pushes past new lows or maintains its momentum relative to the calculated step size.
- In a Downward Trend, it stays flat and only "steps" downward when the price establishes new highs or continues its descent.
4. High/Low Sensitivity Toggle The script includes a specific logic switch that allows users to choose between analyzing the "Close" price (standard) or the "High/Low" prices. Using the High/Low mode makes the indicator significantly more sensitive, as it reacts to the extreme reaches of each candle rather than just where the price finished the session.
Visual Representation and User Experience
The indicator provides different visual modes to help traders interpret these trends:
- Standard Mode: Displays a single line representing the stepped average.
- Trend Signal Mode: Specifically highlights upward and downward movements as distinct lines or markers, making it easier to see exactly when a trend reversal has occurred.
- Color Coding: Supports various visual modes to separate bullish and bearish segments clearly on the chart.
Summary for the Trader
Essentially, this script acts as a "noise filter." By using a stepped approach based on volatility, it prevents traders from being "whipsawed" by minor price movements that don't signify a real change in direction. It stays flat until the market proves its intent through a significant move, at which point it jumps to the next level, clearly defining the current trend.
/*-----------------------------+
| |
| Shared by www.Aptrafx.com |
| |
+------------------------------*/
//+------------------------------------------------------------------+
//| StepMA_v7.1.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 Aqua
#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 = 0;
//---- 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 StepSizeCalc ( int Len, double Km, int Size, int k)
{
double result;
if( Size==0 )
{
double AvgRange=0;
double Weight = 0;
for (int i=Len-1;i>=0;i--)
{
if(MA_Mode==0) double alfa= 1.0; else alfa= 1.0*(Len-i)/Len;
AvgRange+= alfa*(High[k+i]-Low[k+i]);
Weight += alfa;
}
ATR0 = AvgRange/Weight;
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.1 |
//+------------------------------------------------------------------+
int start()
{
int shift, counted_bars=IndicatorCounted();
if ( BarsNumber > 0 ) int Nbars=BarsNumber; else Nbars=Bars;
if ( counted_bars > 0 ) limit=Bars-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, Kv, StepSize, shift);
Comment (" StepSize= ", Step);
StepMA = StepMACalc ( HighLow, Step, shift)+Percentage/100.0*Step*Point;
if ( ColorMode == 0) LineBuffer[shift]=StepMA;
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;
}
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