AltrTrend_Signal_v2_2

Download script
AltrTrend_Signal_v2_2

This trading indicator is designed to identify significant shifts in market momentum by detecting when the price breaks out of established historical ranges. Instead of simply reacting to every small price movement, it uses a dynamic approach to determine the strength of a trend and identifies specific "flip" points where the market sentiment changes from bullish to bearish, or vice versa.

How the Logic Works

1. Dynamic Market Intensity (The Adaptive Window) The tool doesn't use a fixed timeframe for its calculations. Instead, it uses a volatility and momentum metric (ADX) to determine how many previous candles it needs to look at to define the "current" market range. When the market is moving strongly, it looks at a smaller window; when the market is choppy or slow, it expands its view. This allows the tool to adapt to different market speeds automatically.

2. Range Analysis and Boundary Setting For every point on the chart, the script calculates the highest and lowest prices reached during that adaptive window. It then establishes a "buffer zone" around these peaks and valleys. By calculating the average size of the candles within this period, it determines how much "breathing room" the market usually has before moving significantly.

3. Breakout Detection The core logic focuses on identifying when the closing price pierces through the calculated boundaries:

  • Bullish Signal: If the price closes above the upper boundary of the established range, the logic registers a transition into an upward trend.
  • Bearish Signal: If the price closes below the lower boundary of the established range, the logic registers a transition into a downward trend.

4. Visual Signaling To make this data useful for a trader, the script places visual markers (arrows) only at the exact moment the trend flips:

  • Green Arrows: These appear when the market switches from a neutral or bearish state to a confirmed upward trend. They are positioned slightly below the current price to indicate a "Buy" sentiment.
  • Crimson Arrows: These appear when the market switches from a neutral or bullish state to a confirmed downward trend. They are positioned slightly above the current price to indicate a "Sell" sentiment.

Summary for the User

Essentially, this script filters out "market noise." It waits for the price to move significantly enough to break out of its recent historical behavior before giving you a signal. By using an adaptive look-back period, it attempts to remain relevant whether the market is in a high-volatility news cycle or a slow, grinding trend.

Indicators Used
Movement directional index
Miscellaneous
Implements a curve of type %1
13 Views
0 Downloads
0 Favorites
AltrTrend_Signal_v2_2
//+------------------------------------------------------------------+
//| AltrTrend_Signal_v2_2.mq4 
//| Ramdass - Conversion only
//+------------------------------------------------------------------+
#property  copyright "Author - OlegVS, GOODMAN"

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Green
#property indicator_color2 Crimson

//---- input parameters
extern int K=30;
extern double Kstop=0.5;
extern int Kperiod=150;
extern int PerADX=14;
extern int CountBars=350;

//---- buffers
double val1[];
double val2[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   string short_name;
//---- indicator line
   IndicatorBuffers(2);
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexArrow(0,108);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexArrow(1,108);
   SetIndexBuffer(0,val1);
   SetIndexBuffer(1,val2);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| AltrTrend_Signal_v2_2                                            |
//+------------------------------------------------------------------+
int start()
  {   
   if (CountBars>=Bars) CountBars=Bars;
   SetIndexDrawBegin(0,Bars-CountBars+PerADX);
   SetIndexDrawBegin(1,Bars-CountBars+PerADX);
   int i,shift,counted_bars=IndicatorCounted();
   int i1,i2;
   double Range,AvgRange,smin,smax,SsMax,SsMin,SSP,price;
   bool uptrend,old;
//----
   if(Bars<=PerADX+1) return(0);
//---- initial zero
   if(counted_bars<PerADX+1)
   {
      for(i=1;i<=PerADX;i++) val1[CountBars-i]=0.0;
      for(i=1;i<=PerADX;i++) val2[CountBars-i]=0.0;
   }
//----


for (shift = CountBars-PerADX; shift>=0; shift--) 
{ 

SSP=MathCeil(Kperiod/iADX(NULL,0,PerADX,PRICE_CLOSE,MODE_MAIN,1));
	Range=0;
	AvgRange=0;
	for (i1=shift; i1<=shift+SSP; i1++)
		{AvgRange=AvgRange+MathAbs(High[i1]-Low[i1]);
		}
	Range=AvgRange/(SSP+1);

SsMax=High[shift]; SsMin=Low[shift]; 
   for (i2=shift;i2<=shift+SSP-1;i2++)
        {
         price=High[i2];
         if(SsMax<price) SsMax=price;
         price=Low[i2];
         if(SsMin>=price)  SsMin=price;
        }
 
smin = SsMin+(SsMax-SsMin)*K/100; 
smax = SsMax-(SsMax-SsMin)*K/100; 
	val1[shift]=0;
	val2[shift]=0;
	if (Close[shift]<smin)
		{
		uptrend = false;
		}
	if (Close[shift]>smax)
		{
		uptrend = true;
		}
   if (uptrend!=old && uptrend==true) {val1[shift]=Low[shift]-Range*Kstop;}
   if (uptrend!=old && uptrend==false) {val2[shift]=High[shift]+Range*Kstop;}
   old=uptrend;

}
   return(0);
  }
//+------------------------------------------------------------------+

Comments