AltrTrend3
Download scriptThis tool is designed to help traders identify the prevailing trend in the financial markets by analyzing price action and volatility. Instead of relying on simple moving averages, it uses a sophisticated logic that adapts to different market conditions to determine whether the momentum is shifting upward or downward.
How the Logic Works
The script operates through three primary stages of calculation:
1. Dynamic Volatility Analysis The tool first measures how "active" the market is using an Average Directional Index (ADX). It uses this data to calculate a variable range—essentially determining how much price movement is normal for the current environment. By identifying these fluctuations, the script can distinguish between significant trend movements and minor "noise."
2. Range Detection Once the volatility is established, the logic looks back over a specific period of historical data to find the highest and lowest prices reached. It then creates a "buffer zone" or a range based on those highs and lows. This allows the script to see the boundaries of the current price action.
3. Trend Confirmation (The Signal) Finally, the script compares the most recent closing price against the boundaries it calculated in the previous steps:
- Bullish Signal: If the price closes significantly above the upper boundary, the tool identifies a strong upward trend (represented visually as Green).
- Bearish Signal: If the price closes significantly below the lower boundary, the tool identifies a strong downward trend (represented visually as Crimson).
Practical Application for Traders
For an automated trading system or a manual trader, this logic provides a clear binary signal. By comparing the relationship between the "Green" and "Red" values generated by the script, a user can determine the direction of the market:
- When the Green value is higher than the Red value, it signals a Buy opportunity.
- When the Red value is higher than the Green value, it signals a Sell opportunity.
In essence, the script acts as a filter that ignores minor price wiggles and only triggers a signal when the price breaks out of its established range with enough momentum to suggest a sustained trend change.
//+------------------------------------------------------------------+
//| AltrTrend.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[];
/* *************************************************
// Code for using in expert
extern string fi="--Altr Trend Settings--";
extern int K=30;
extern double Kstop=0.5;
extern int Kperiod=150;
extern int PerADX=14;
extern int SignalTimeFrame = 60;
bool CheckAltrTrend(int cmd)
{
double val1, val2;
// Get the 2 buffer values
val1 = iCustom(NULL, Signal_TimeFrame, "AltrTrend",K, Kstop, KPeriod, PerADX, 0,1);
val2 = iCustom(NULL, Signal_TimeFrame, "AltrTrend",K, Kstop, KPeriod, PerADX, 1,1);
if (val1 > 0 && val2 > 0)
{
switch (cmd)
{
case OP_BUY : if (val1 > val2) // Check for Green
{
return (true);
}
break;
case OP_SELL : if (val1 < val2) // Check for Red
{
return (true);
}
}
}
return(false);
}
******************************************* */
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
string short_name;
//---- indicator line
IndicatorBuffers(4);
SetIndexStyle(0,DRAW_HISTOGRAM,0,2);
SetIndexStyle(1,DRAW_HISTOGRAM,0,2);
SetIndexStyle(2,DRAW_HISTOGRAM,0,2);
SetIndexStyle(3,DRAW_HISTOGRAM,0,2);
SetIndexBuffer(0,val1);
SetIndexBuffer(1,val2);
//----
return(0);
}
//+------------------------------------------------------------------+
//| AltrTrend |
//+------------------------------------------------------------------+
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,x1=70,x2=30;
double Range,AvgRange,smin,smax,SsMax,SsMin,SSP,price;
//----
if(Bars<=PerADX+1) return(0);
//---- initial zero
if(counted_bars<SSP+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)
{
val1[shift]=Low[shift]; val2[shift]=High[shift];
}
if (Close[shift]>smax)
{
val1[shift]=High[shift]; val2[shift]=Low[shift];
}
}
return(0);
}
//+------------------------------------------------------------------+
Comments