ASCTrend
Download scriptThis script is designed as a visual trading tool for the MetaTrader platform that identifies potential trend reversal points or significant momentum shifts. It works by analyzing historical price data to detect "exhaustion" in a trend and signals when the price might be ready to move in the opposite direction.
How the Logic Works
The core logic of this script can be broken down into three main stages:
1. Market Volatility Analysis First, the tool looks at a small window of recent price bars to calculate the average "range" (the distance between the highest and lowest prices). It uses this average to determine what "normal" movement looks like for the current market conditions.
2. Momentum Detection The script then performs two specific checks to see if the current trend is becoming overextended:
- Gap Analysis: It looks for significant jumps or gaps between the opening of one bar and the closing of the previous one.
- Price Stretching: It measures how far the price has traveled relative to the average volatility. If the price moves too quickly or too far in a short period, the script flags it as an overextended move.
3. Signal Generation (The "Arrows") The final step combines the momentum data with a calculation of market relative position (similar to a percentage oscillator). It looks for specific "breakout" conditions:
- Bearish Signal: If the price has been pushed up significantly and the momentum begins to weaken or retreat below a certain threshold, the script places a visual marker above the candle.
- Bullish Signal: Conversely, if the price has been pushed down significantly and shows signs of losing that downward energy, it places a marker below the candle.
Key Features for the User
- Visual Cues: Instead of complex numbers, the script provides clear visual markers (arrows) directly on your chart to highlight potential areas of interest.
- Risk Customization: The logic includes a "Risk" input, which allows you to adjust the sensitivity of these signals based on how aggressive or conservative you want your trading strategy to be.
- Lookback Window: You can define how many bars of historical data the script should analyze at once, helping to balance its responsiveness to new price action against older trends.
In summary, this tool acts as a "momentum brake." It identifies when a move has become too large too quickly and provides a visual signal that the market may be reaching a turning point.
//+------------------------------------------------------------------+
//| ASCTrend1sig_noSound.mq4
//| Ramdass - Conversion only
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Magenta
#property indicator_color2 Aqua
//---- input parameters
extern int RISK=3;
extern int CountBars=300;
//---- buffers
double val1[];
double val2[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicator line
IndicatorBuffers(2);
SetIndexStyle(0,DRAW_ARROW);
SetIndexArrow(0,234);
SetIndexStyle(1,DRAW_ARROW);
SetIndexArrow(1,233);
SetIndexBuffer(0,val1);
SetIndexBuffer(1,val2);
//----
return(0);
}
//+------------------------------------------------------------------+
//| ASCTrend1sig |
//+------------------------------------------------------------------+
int start()
{
if (CountBars>=1000) CountBars=950;
SetIndexDrawBegin(0,Bars-CountBars+11+1);
SetIndexDrawBegin(1,Bars-CountBars+11+1);
int i,shift,counted_bars=IndicatorCounted();
int Counter,i1,value10,value11;
double value1,x1,x2;
double value2,value3;
double TrueCount,Range,AvgRange,MRO1,MRO2;
double Table_value2[1000];
value10=3+RISK*2;
x1=67+RISK;
x2=33-RISK;
value11=value10;
//----
if(Bars<=11+1) return(0);
//---- initial zero
if(counted_bars<11+1)
{
for(i=1;i<=0;i++) val1[CountBars-i]=0.0;
for(i=1;i<=0;i++) val2[CountBars-i]=0.0;
}
//----
shift=CountBars-11-1;
while(shift>=0)
{
Counter=shift;
Range=0.0;
AvgRange=0.0;
for (Counter=shift; Counter<=shift+9; Counter++) AvgRange=AvgRange+MathAbs(High[Counter]-Low[Counter]);
Range=AvgRange/10;
Counter=shift;
TrueCount=0;
while (Counter<shift+9 && TrueCount<1)
{if (MathAbs(Open[Counter]-Close[Counter+1])>=Range*2.0) TrueCount=TrueCount+1;
Counter=Counter+1;
}
if (TrueCount>=1) {MRO1=Counter;} else {MRO1=-1;}
Counter=shift;
TrueCount=0;
while (Counter<shift+6 && TrueCount<1)
{if (MathAbs(Close[Counter+3]-Close[Counter])>=Range*4.6) TrueCount=TrueCount+1;
Counter=Counter+1;
}
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,shift)); // PercentR(value11=9)
Table_value2[shift]=value2;
val1[shift]=0;
val2[shift]=0;
value3=0;
if (value2<x2)
{i1=1;
while (Table_value2[shift+i1]>=x2 && Table_value2[shift+i1]<=x1){i1++;}
if (Table_value2[shift+i1]>x1)
{
value3=High[shift]+Range*0.5;
val1[shift]=value3;
}
}
if (value2>x1)
{i1=1;
while (Table_value2[shift+i1]>=x2 && Table_value2[shift+i1]<=x1){i1++;}
if (Table_value2[shift+i1]<x2)
{
value3=Low[shift]-Range*0.5;
val2[shift]=value3;
}
}
shift--;
}
return(0);
}
//+------------------------------------------------------------------+
Comments