PerkyAsctrend11

Download script
Author: Copyright � 2005, MetaQuotes Software Corp.
PerkyAsctrend11

The ASCtrend script is a technical analysis tool designed to identify potential trend reversals by analyzing historical price action, volatility, and momentum. Instead of simply following the current price direction, it uses a multi-layered logic system to determine when a market move has become overextended and is likely to "exhaust" itself.

Here is a breakdown of the underlying logic in plain terms:

1. Volatility and Range Analysis

The script begins by calculating a "Normal Range" for the market. It looks at the previous 10 candles to determine the average height (volatility) of price movements. This baseline is crucial because it allows the tool to distinguish between standard market noise and significant, outsized price swings.

2. Movement Validation

The script does not react to every price change. It uses two specific filters to validate a move:

  • Gap/Jump Detection: It checks if the distance between opening prices and previous closes is significantly larger than the average range (specifically twice the average).
  • Momentum Strength: It looks for sustained moves where the price covers a large percentage of its expected range over several candles. If these conditions aren't met, the script considers the move "weak" and ignores it as standard market fluctuation.

3. Momentum Overload (WPR Logic)

The tool utilizes a momentum oscillator to measure how "stretched" the price is. It dynamically adjusts its sensitivity based on whether a valid move (identified in the previous step) has occurred:

  • If a significant jump is detected, it tightens its logic to look for high-intensity exhaustion.
  • It converts these momentum values into a percentage-based scale (0 to 100).

4. Trend Reversal Identification

The script looks for specific "Overbought" and "Oversold" conditions combined with a recovery check:

  • Buy Signals: When the momentum drops below a specific lower threshold (Oversold), the script scans forward in time to ensure the price has broken out of that low zone. If it confirms the price is recovering, it identifies a potential BUY opportunity.
  • Sell Signals: When momentum rises above a specific upper threshold (Overbought), the script checks to see if the price has dropped back down from that high zone. If confirmed, it identifies a potential SELL opportunity.

5. Execution and Alerts

To prevent the tool from giving multiple signals during a single move, it includes a "state" memory. Once a Buy or Sell signal is triggered, it locks out further opposite signals until a new, distinct trend reversal is confirmed. When these conditions are met on the most recent candles, the script provides a visual marker on the chart and triggers a real-time notification (Alert) to the user.

Indicators Used
Larry William percent range indicator
Miscellaneous
Implements a curve of type %1
19 Views
0 Downloads
0 Favorites
PerkyAsctrend11
//+------------------------------------------------------------------+
//|                                                ASCtrend.mq4 |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Aqua
#property indicator_color2 Magenta

extern int RISK=4;
extern int AllBars=250;
int up=0,dn=0;
double val1buffer[];
double val2buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
      SetIndexStyle(0,DRAW_ARROW,EMPTY);
      SetIndexArrow(0,108);
      SetIndexBuffer(0, val1buffer);

      SetIndexStyle(1,DRAW_ARROW,EMPTY);
      SetIndexArrow(1,108);
      SetIndexBuffer(1, val2buffer);
      return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
   {
     return(0);
   }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
// int    counted_bars=IndicatorCounted();

int start()
{   
   
   double value2;
   double value3;
   double value10=10;
   double value11;
   double x1=70;
   double x2=30;
   int TrueCount;
   int counter;
   int MRO1;
   int MRO2;
   int i1;
   double Range;
   double AvgRange;
   double val1;
   double val2;
   double Table_value2[500][2];
   int counted_bars=IndicatorCounted();
   
   value10=3+RISK*2;
   x1=67+RISK;
   x2=33-RISK;
   value11=value10;
  //---------------------------- 
    
   if(counted_bars<0) return (-1);
   if(counted_bars>0) counted_bars--;       //last bar recounted
   int i;
   int shift = Bars-counted_bars-1;
   if (shift > AllBars) shift = AllBars;
         
  for(i=shift; i>0; i--)
   {
   


   
                 
      counter=i;
      Range=0;
      AvgRange=0;
      for (counter=i ;counter<=i+9;counter++)
      {
         AvgRange=AvgRange+MathAbs(High[counter]-Low[counter]);
      }
      Range=AvgRange/10;
      
      
      counter=i;
      TrueCount=0;
      while (counter<i+9 && TrueCount<1)
      {
         if (MathAbs(Open[counter]-Close[counter+1])>=Range*2.0 )
               TrueCount++;
         counter++;
      }

      if (TrueCount>=1) 
            MRO1=counter ; 
      else 
            MRO1=-1;
            
      counter=i;
      TrueCount=0;
      while (counter<i+6 && TrueCount<1)
      {
           if(MathAbs(Close[counter+3]-Close[counter])>=Range*4.6)
            {TrueCount++;}
           counter++;
      }
      
      if(TrueCount>=1) 
            MRO2=counter; 
      else 
            MRO2=-1;
            
      if (MRO1>-1) 
            value11=3; 
      else 
            value11=value10;
            
      if (MRO2>-1) 
            value11=4; 
      else 
           value11=value10;
          
            
      value2=100-MathAbs(iWPR(NULL,0,value11,i));
      Table_value2[i][0]=i;
      Table_value2[i][1]=value2;
      val1=0;
      val2=0;
      value3=0;
      //-------------------     val1  
      if (value2<x2 )  //  x2 = 30
      {
         i1=1;
         while (Table_value2[i+i1][1]>=x2 && Table_value2[i+i1][1]<=x1)
         {i1++;}

         if (Table_value2[i+i1][1]>x1)
         {
            value3=High[i]+Range*0.5;
            val1=value3;
         }
      }
      
      //-------------------     val2  
      if ( value2>x1) // x1 = 70 
      {  
            i1=1;
            while (Table_value2[i+i1][1]>=x2 && Table_value2[i+i1][1]<=x1)
            {i1++;}
            
            if (Table_value2[i+i1][1]< x2)
            {
               value3=Low[i]-Range*0.5;
               val2=value3;
            } 
      }
      
      
       
     
      if (val2!=0 && up==0 )
      {     
           val1buffer[i]= val2-1*Point;
           up=1;
           dn=0;
           if(shift<=2)
           {
            Alert (Symbol()," ",Period(),"M  Asctrend BUY ");
            }
      }  
      if (val1 !=0 && dn==0)
      {
      
            val2buffer[i]= val1+1*Point;
            dn=1;
            up=0;
            if(shift<=2)
            {
            Alert (Symbol()," ",Period(),"M   Asctrend SELL ");
            }
       }
   
   }
return(0);

}

Comments