Nina_StepMA_1_v1

Download script
Nina_StepMA_1_v1

Overview

The Nina StepMA indicator is a sophisticated technical analysis tool designed to help traders visualize price momentum and trend directions by calculating "steps" based on market volatility. Instead of using standard moving averages that can be overly smooth or lag significantly, this script analyzes the range of price movement (the distance between highs and lows) to determine the strength and direction of the current market trend.

Core Logic and Methodology

1. Volatility-Based Range Calculation The script begins by measuring the "range" of the market over a specific period. It calculates a weighted sum of the differences between the high and low prices. This allows the indicator to understand how much the price is "swinging." By identifying the maximum and minimum ranges reached during its calculation window, it establishes boundaries for price movement.

2. Dynamic Trend Stepping The logic creates three distinct levels of trend monitoring (Minimum, Mid, and Maximum). These levels act as thresholds. The script compares the current price against these dynamically calculated boundaries to decide if the market is trending upward or downward.

  • If the price breaks above a threshold, it registers a positive trend move.
  • If it falls below, it registers a negative trend move.

3. Momentum Filtering (Stochastic Integration) To provide a clearer picture, the script translates these price "steps" into a normalized format. It essentially calculates where the current price sits relative to the established trend boundaries. This is visualized as two primary lines:

  • The Minimum Trend Line: Represents the most sensitive, immediate price movements.
  • The Mid Trend Line: Provides a balanced view of the current market momentum.

4. Signal Generation (Cross-overs) The primary goal of this script is to identify specific "turning points" in the market. It does this by monitoring when the Minimum Trend Line crosses over the Mid Trend Line.

  • Buy Signals: When the Minimum line crosses from below to above the Mid line, it indicates a potential upward shift in momentum.
  • Sell Signals: When the Minimum line crosses from above to below the Mid line, it suggests a potential downward shift.

Visual and Audible Features

  • Trend Lines: The indicator displays two main lines in the separate sub-window, allowing you to see the "flow" of the market momentum in real-time.
  • Visual Arrows: The script automatically places arrows on the chart at the exact moment a trend crossover is confirmed. This eliminates guesswork by highlighting the specific bar where the momentum shifted.
  • Audio Alerts: To ensure traders do not miss a transition, the script includes an integrated sound alert. When a confirmed crossover occurs (where the trend changes from positive to negative or vice versa), the system triggers an audible alarm.

Summary for the User

In simple terms, this indicator filters out market "noise" by looking at how much price is actually moving relative to its recent history. It then places "floors and ceilings" on that movement. When the fast-moving trend line crosses the more balanced mid-line, it signals that the market's energy has shifted, providing you with a clear visual and audible cue to consider a potential trade.

Miscellaneous
Implements a curve of type %1It plays sound alerts
10 Views
0 Downloads
0 Favorites
Nina_StepMA_1_v1
/*-----------------------------+
|			       |
| Shared by www.Aptrafx.com    |
|			       |
+------------------------------*/

//+------------------------------------------------------------------+
//|                                                Nina_StepMA_1.mq4 |
//+------------------------------------------------------------------+
#property indicator_separate_window

#property indicator_buffers 4
#property indicator_color1 Yellow
#property indicator_color2 Aqua
#property indicator_color3 Blue
#property indicator_color4 Red

#property indicator_minimum 0
#property indicator_maximum 1

//----input parameters
extern int PeriodWATR=10;
extern double Kwatr=1.0000;
extern int HighLow=0;
extern int CalculatedBars = 500;
extern bool alert_ON=true; // ON=true, OFF=false

//---- indicator buffers
double LineMinBuffer[];
double LineMidBuffer[];
double LineBuyBuffer[];
double LineSellBuffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
  string short_name;
  IndicatorBuffers(4);
//---- indicator line
   SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,1);
   SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,1);
   SetIndexStyle(2,DRAW_ARROW,STYLE_SOLID,1);
   SetIndexStyle(3,DRAW_ARROW,STYLE_SOLID,1);
   
   SetIndexEmptyValue(2,0);
   SetIndexArrow(2,233);
   SetIndexEmptyValue(3,0);
   SetIndexArrow(3,234);
   
   SetIndexBuffer(0,LineMinBuffer);
   SetIndexBuffer(1,LineMidBuffer);
   SetIndexBuffer(2,LineBuyBuffer);
   SetIndexBuffer(3,LineSellBuffer);

   IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS));
//---- name for DataWindow and indicator subwindow label
   short_name="StepMA_Stoch("+PeriodWATR+","+Kwatr+","+HighLow+")";
   IndicatorShortName(short_name);
//----
   SetIndexDrawBegin(0,PeriodWATR);
   SetIndexDrawBegin(1,PeriodWATR);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int      i,shift,TrendMin,TrendMax,TrendMid;
   double   SminMin0,SmaxMin0,SminMin1,SmaxMin1,SumRange,dK,WATR0,WATRmax,WATRmin,WATRmid;
   double   SminMax0,SmaxMax0,SminMax1,SmaxMax1,SminMid0,SmaxMid0,SminMid1,SmaxMid1;
   double   linemin,linemax,linemid,Stoch1,Stoch2,bsmin,bsmax;
   static bool turn_alarm = true;
   	
   int StepSizeMin,StepSizeMax,StepSizeMid;
   double min,max,mid,h,l,c;
   int position_ind0=0, position_ind1=0;
   // position_ind0 = -1, below
   //               =  1, up
   	
   ArrayInitialize(LineBuyBuffer,0);
   ArrayInitialize(LineSellBuffer,0);
  
   if(CalculatedBars>Bars || CalculatedBars == 0 ) CalculatedBars = Bars;
 
   for(shift=CalculatedBars-1;shift>=0;shift--){	
	  SumRange=0;
	  for (i=PeriodWATR-1;i>=0;i--){ 
         dK = 1+1.0*(PeriodWATR-i)/PeriodWATR;
         SumRange+= dK*MathAbs(High[i+shift]-Low[i+shift]);
         }
	  WATR0 = SumRange/PeriodWATR;
	
	  WATRmax=MathMax(WATR0,WATRmax);
	  if (shift==CalculatedBars-1-PeriodWATR) WATRmin=WATR0;
	  WATRmin=MathMin(WATR0,WATRmin);
	
	  StepSizeMin=MathRound(Kwatr*WATRmin/Point);
	  StepSizeMax=MathRound(Kwatr*WATRmax/Point);
	  StepSizeMid=MathRound(Kwatr*0.5*(WATRmax+WATRmin)/Point);
	  
     min = Kwatr*WATRmin;
     max = Kwatr*WATRmax;
     mid = Kwatr*0.5*(WATRmax+WATRmin);
	  
	  //b = iBarShift(Symbol(),tPeriod,Time[shift]);
	  c = Close[shift];//iClose(Symbol(),tPeriod,b);
	  h = High[shift];//iHigh(Symbol(),tPeriod,b)
	  l = Low[shift];//iLow(Symbol(),tPeriod,b)
	  
	  if (HighLow>0){
	    SmaxMin0=l+2*min;
	    SminMin0=h-2*min;
	  
	    SmaxMax0=l+2*max;
	    SminMax0=h-2*max;
	  
	    SmaxMid0=l+2*mid;
	    SminMid0=h-2*mid;
	  
	    if(c>SmaxMin1) TrendMin=1; 
	    if(c<SminMin1) TrendMin=-1;
	  
	    if(c>SmaxMax1) TrendMax=1; 
	    if(c<SminMax1) TrendMax=-1;
	  
	    if(c>SmaxMid1) TrendMid=1; 
	    if(c<SminMid1) TrendMid=-1;
	    }
	 
	  if (HighLow == 0){
	    SmaxMin0=c+2*min;
	    SminMin0=c-2*min;
	  
	    SmaxMax0=c+2*max;
	    SminMax0=c-2*max;
	  
	    SmaxMid0=c+2*mid;
	    SminMid0=c-2*mid;
	  
	    if(c>SmaxMin1) TrendMin=1; 
	    if(c<SminMin1) TrendMin=-1;
	  
	    if(c>SmaxMax1) TrendMax=1; 
	    if(c<SminMax1) TrendMax=-1;
	  
	    if(c>SmaxMid1) TrendMid=1; 
	    if(c<SminMid1) TrendMid=-1;
	    }
	 	
	  if(TrendMin>0 && SminMin0<SminMin1) SminMin0=SminMin1;
	  if(TrendMin<0 && SmaxMin0>SmaxMin1) SmaxMin0=SmaxMin1;
		
	  if(TrendMax>0 && SminMax0<SminMax1) SminMax0=SminMax1;
	  if(TrendMax<0 && SmaxMax0>SmaxMax1) SmaxMax0=SmaxMax1;
	  
	  if(TrendMid>0 && SminMid0<SminMid1) SminMid0=SminMid1;
	  if(TrendMid<0 && SmaxMid0>SmaxMid1) SmaxMid0=SmaxMid1;
	  
	  
	  if (TrendMin>0) linemin=SminMin0+min;
	  if (TrendMin<0) linemin=SmaxMin0-min;
	  
	  if (TrendMax>0) linemax=SminMax0+max;
	  if (TrendMax<0) linemax=SmaxMax0-max;
	  
	  if (TrendMid>0) linemid=SminMid0+mid;
	  if (TrendMid<0) linemid=SmaxMid0-mid;
	  
	  bsmin=linemax-max;
	  bsmax=linemax+max;
	  Stoch1=(linemin-bsmin)/(bsmax-bsmin);
	  Stoch2=(linemid-bsmin)/(bsmax-bsmin);
	  
	  LineMinBuffer[shift]=Stoch1;
	  LineMidBuffer[shift]=Stoch2;
	  
	  
	  SminMin1=SminMin0;
	  SmaxMin1=SmaxMin0;
	  
	  SminMax1=SminMax0;
	  SmaxMax1=SmaxMax0;
	  
	  SminMid1=SminMid0;
	  SmaxMid1=SmaxMid0;
	  
	  // don't do anything for current bar since it is keeping changing.
	  if(shift != 0) {  
   	  position_ind0 = position_ind1;
   	  if(LineMinBuffer[shift]>LineMidBuffer[shift]){
   	     position_ind1=1;
   	  }
   	  else {
   	     position_ind1=-1;
   	  }
	  // current bar is keeping on changing
	  // so don't put arrow on it
	  // that means we only set on signal for confirmed bar
	     if((position_ind0==-1) && (position_ind1==1)) {
	     // cross up
	        LineBuyBuffer[shift] = LineMidBuffer[shift];
	     }
	     if((position_ind0==1) && (position_ind1==-1)) {
	     // cross down
	        LineSellBuffer[shift] = LineMidBuffer[shift];
	     }
	   }
   }
	
	if(Volume[0]>1) return(0);
	// for the current crossing, make the sound
	// still have problem for this mechanism, leave it for later modification	   
	if(alert_ON) {   
      if(position_ind0*position_ind1<0) {  // time for alarm
         PlaySound("clock-alarm3.wav");
         turn_alarm=false;
      }
   }
      
	return(0);	
 }
//+------------------------------------------------------------------+

Comments