MBKAsctrend3times1_v1
Download scriptThis tool is designed to identify significant shifts in market direction by analyzing price momentum across three different time horizons simultaneously. Rather than relying on a single indicator, it combines multiple perspectives to filter out "market noise" and pinpoint when a trend is genuinely changing.
Core Logic Overview
The script functions by calculating the Williams Percent Range (WPR)—a momentum oscillator that measures whether prices are trading closer to their highs or lows over a specific period. It performs this calculation three separate times using different lengths (Short, Medium, and Long) to capture various layers of market activity.
How the Analysis Works
1. Weighted Momentum Aggregation Instead of treating every time horizon as equally important, the script applies a "Weighting" system. It calculates the momentum for three distinct periods and combines them into a single unified value. By assigning different importance to these periods, the tool ensures that the final signal is balanced between immediate price action and broader structural trends.
2. The Trend Filtering System To determine if the market is moving up or down, the script looks for two specific conditions:
- The Combined Signal: It checks if the weighted momentum score crosses a specific threshold (representing high-intensity movement).
- The Long-Term Anchor: Simultaneously, it verifies that the longest time horizon confirms the direction. This acts as a safety mechanism; for example, a "Buy" signal is only triggered if both the combined short/medium momentum and the long-term trend are moving in harmony.
3. Dynamic Range Calculation The script calculates the average price range (the distance between highs and lows) over the most recent bars. This allows it to place its visual signals (arrows) at a precise distance from the candles, ensuring that the visual indicators do not overlap with the price action, making them easier for the user to read clearly.
Visual Output and Alerts
- Trend Identification: When the logic confirms a new "Uptrend," the script marks the chart with a specific indicator (Blue). When it identifies a "Downtrend," it marks the chart with a different indicator (Red).
- Alerts: The system is programmed to recognize the exact moment these trend flips occur. If configured, it can provide notifications to alert you immediately when the market transitions from one state to another.
Summary for the User
In simple terms, this tool acts as a multi-layered filter. It looks at the "now," the "recent past," and the "long-term history" all at once. It only signals a trend change when these three perspectives agree, helping to filter out minor price fluctuations and highlighting more significant, sustained movements in the market.
/*-----------------------------+
| |
| Shared by www.Aptrafx.com |
| |
+------------------------------*/
//+------------------------------------------------------------------+
//| MBKAsctrend3times.mq4
//+------------------------------------------------------------------+
#property copyright "MBKAsctrend3times matt kennel"
#property link "http://www.metatrader.org"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Blue
#property indicator_width1 1
#property indicator_color2 Red
#property indicator_width2 1
//---- input parameters
//
//
// Modified by MBK: now have three different timescales (bar lengths)
// to combine for final WPR indicator, with further long-term trend indicator.
//
// try on H1 chart with these parameters.
//
extern int RISK=3;
//extern int CountBars=2000;
extern int NumberofAlerts=0;
extern int WPRLength1=9,WPRLength2=33, WPRLength3=77;
extern int LToffset = -5;
extern double w1=1.0, w2=3.0, w3 = 1.0; // relative weights
int counter=0;
//---- buffers
double val1[];
double val2[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
string short_name;
//---- indicator line
IndicatorBuffers(2);
SetIndexStyle(0,DRAW_ARROW);
SetIndexArrow(0,233);
SetIndexStyle(1,DRAW_ARROW);
SetIndexArrow(1,234);
SetIndexBuffer(0,val1);
SetIndexBuffer(1,val2);
//----
return(0);
}
//+------------------------------------------------------------------+
//| SilverTrend_Signal |
//+------------------------------------------------------------------+
int start() {
//if (CountBars>=Bars) CountBars=Bars;
//SetIndexDrawBegin(0,Bars-CountBars+SSP);
//SetIndexDrawBegin(1,Bars-CountBars+SSP);
int i1,i2,K;
double Range,AvgRange,smin,smax,SsMax,SsMin,price;
double wprvalue;
static bool uptrend,old;
bool flag1, flag2;
int i,shift,counted_bars=IndicatorCounted();
///----
//if(Bars<=SSP+1) return(0);
//---- initial zero
//if(counted_bars<SSP+1)
// {
// for(i=1;i<=SSP;i++) val2[CountBars-i]=0.0;
// }
////----
K=33-RISK;
// wprlength = 3+RISK*2;
uptrend=false;
old = false;
double sumweights = w1+w2+w3;
w1 /= sumweights;
w2 /= sumweights;
w3 /= sumweights;
int SSP = 10;
for (shift = Bars-SSP; shift>=0; shift--) {
Range=0;
AvgRange=0;
for (i1=shift; i1<=shift+SSP; i1++)
{AvgRange=AvgRange+MathAbs(High[i1]-Low[i1]);
}
Range=AvgRange/(SSP+1);
double wprval1 = (100-MathAbs(iWPR(Symbol(),Period(),WPRLength1,shift)));
double wprval2 = (100-MathAbs(iWPR(Symbol(),Period(),WPRLength2,shift)));
double wprval3 = (100-MathAbs(iWPR(Symbol(),Period(),WPRLength3,shift)));
wprvalue = w1*wprval1 + w2*wprval2 + w3*wprval3;
// MathPow(wprval1*wprval2*wprval3,1.0/3.0);
double wprlong = wprval3;
if ((wprvalue < 33-RISK) && (wprlong < 50-LToffset)) {
uptrend = false;
}
if ((wprvalue > 67+RISK) && (wprlong >= 50+LToffset)) {
uptrend = true;
}
if (uptrend!=old && uptrend==true) {
val1[shift]=Low[shift]-Range*0.8; // lower range
counter=0;
if (shift==0 && counter<=NumberofAlerts) {
// Alert("MBKAsctrend ",Period()," ",Symbol()," BUY");
counter=counter+1;
}
}
if (uptrend!=old && uptrend==false) {
counter=0;
val2[shift]=High[shift]+Range*0.8;
if (shift==0 && counter<=NumberofAlerts) {
// Alert("Silver Trend ",Period()," ",Symbol()," SELL");
counter=counter+1;
}
}
Comment(shift);
old=uptrend;
}
return(0);
}
//+------------------------------------------------------------------+
Comments