PerkyAsctrend11
Download scriptThe 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.
//+------------------------------------------------------------------+
//| 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