Adaptative Stochastic v4

Author: Copyright � 2005, Luis Guilherme Damiani
Adaptative Stochastic v4

This tool is a sophisticated technical analysis indicator designed to help traders identify momentum and potential price reversals by using an "adaptive" approach. Unlike standard indicators that use a fixed, rigid timeframe for calculation, this script automatically adjusts its sensitivity based on current market volatility.

Core Logic & Functionality

1. Dynamic Volatility Adaptation The primary strength of this indicator is its ability to "breathe" with the market. It monitors market volatility using two different scales (fast and slow average true ranges). By comparing these two, the script calculates a multiplier that determines how much weight to give to recent price action.

  • In periods of high volatility, the indicator adjusts to prevent "noise" from creating false signals.
  • In periods of low volatility, it tightens up to capture subtle movements more quickly.

2. Automated Period Scaling Instead of requiring the user to manually change settings when the market shifts from a trending state to a sideways state, the script handles this automatically. It takes a base timeframe and scales it mathematically (using a quadratic calculation option) based on the volatility multiplier. This ensures that the indicator remains relevant whether the market is moving aggressively or drifting slowly.

3. Momentum Analysis Once the adaptive period is determined, the tool calculates an adjusted Stochastic oscillator. It shifts the standard output to center around a zero-axis. This provides a clear visual representation of momentum:

  • It measures the strength of the current price trend relative to its recent history.
  • The resulting data point helps traders see if the market is becoming "overextended" or if it still has room to move in a specific direction.

4. Visual Guidance Levels To make the data actionable, the script plots several horizontal reference levels on the chart:

  • Entry Levels: These act as markers to identify zones where momentum might be shifting enough to consider a potential trade.
  • Overbought/Oversold Boundaries: These define the outer limits of the indicator, helping traders identify extreme conditions where a price correction or reversal is statistically more likely to occur.

Summary for the User

In simple terms, this script acts as a "smart" momentum tracker. It monitors how much the market is currently swinging and automatically adjusts its own settings to match that speed. This allows it to provide clearer, more reliable signals of whether a market move is gaining strength or running out of steam, helping traders avoid getting caught in "fake" price movements during choppy conditions.

Indicators Used
Indicator of the average true rangeStochastic oscillator
Miscellaneous
Implements a curve of type %1
10 Views
0 Downloads
0 Favorites
Adaptative Stochastic v4
//+------------------------------------------------------------------+
//|                                     Adaptative Stochastic v4.mq4 |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, Luis Guilherme Damiani"
#property link      "http://www.damianifx.com.br"

#property indicator_separate_window
#property indicator_minimum -100
#property indicator_maximum 130
#property indicator_buffers 6
#property indicator_color1 DeepSkyBlue
#property indicator_color2 DodgerBlue
#property indicator_color3 DodgerBlue
#property indicator_color4 Red
#property indicator_color5 Red
#property indicator_color6 PaleGreen

//---- input parameters
extern int       base_periods=10;
extern int       fast_ATR=7;
extern int       slow_ATR=49;
extern bool      quadratic=true;
extern int       over_bs_level=90;
extern int       entry_level=75;
extern int       maxbars=500; 
extern int       step=2;
//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
double ExtMapBuffer4[];
double ExtMapBuffer5[];
double ExtMapBuffer6[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators   
   SetIndexStyle(0,DRAW_LINE,1,2);
   SetIndexBuffer(0,ExtMapBuffer1);  
   SetIndexStyle(1,DRAW_LINE,1,2);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexStyle(2,DRAW_LINE,1,2);
   SetIndexBuffer(2,ExtMapBuffer3);
   SetIndexStyle(3,DRAW_LINE,1,2);
   SetIndexBuffer(3,ExtMapBuffer4);
   SetIndexStyle(4,DRAW_LINE,1,2);
   SetIndexBuffer(4,ExtMapBuffer5);
   SetIndexStyle(5,DRAW_LINE,1,1);
   SetIndexBuffer(5,ExtMapBuffer6);
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
      double multiplier=0;
      int    counted_bars=IndicatorCounted();
      //---- check for possible errors
      if(counted_bars<0) return(-1);
      //---- last counted bar will be recounted
      int limit=Bars-counted_bars;
      if(limit>maxbars)limit=maxbars;
      if (limit>Bars-base_periods*2-1)limit=Bars-base_periods*2-1;
      double adapt_stoch=0;
      //Comment(Bars+"    "+limit); 
      int periods=0;
      static double factor=0;
      for (int shift = 0; shift<=limit;shift++)
      {  
         if(MathMod(shift,step)==0)
         {
            //factor=10000*iMACD(NULL,0,adapt_fast,adapt_slow,1,PRICE_CLOSE,MODE_MAIN,shift);
            //factor=MathAbs(iCCI(NULL,0,adapt_n,PRICE_TYPICAL,shift));
            factor=iATR(NULL,0,fast_ATR,shift)/iATR(NULL,0,slow_ATR,shift);
            if (quadratic)multiplier = factor*factor;else multiplier=factor;        
            periods=MathRound(base_periods*multiplier);
         }
                             
         adapt_stoch=2*(iStochastic(NULL,0,periods,1,4,MODE_LWMA,1,MODE_MAIN,shift)-50);
   
   
         ExtMapBuffer1[shift]=adapt_stoch;
         ExtMapBuffer2[shift]=entry_level;
         ExtMapBuffer3[shift]=-entry_level;
         ExtMapBuffer4[shift]=over_bs_level;
         ExtMapBuffer5[shift]=-over_bs_level;
         ExtMapBuffer6[shift]=0;
      }
//----
   return(0);
  }
//+------------------------------------------------------------------+

Comments