4_MA_Strength
Download scriptThis script is designed to measure and visualize market momentum by analyzing the relative positions of four different Moving Averages (MAs). Rather than just showing you the price trends, it calculates a "strength score" to help identify how dominant a particular trend is at any given moment.
How the Logic Works
The core principle behind this tool is the comparison of four distinct Moving Averages, each representing a different timeframe or "speed" of price action (ranging from short-term to long-term trends).
1. The Hierarchy Comparison The script looks at these four Moving Averages and checks how they stack up against one another. It essentially asks: "Is the shortest-term average above or below the longer-term averages?"
2. Cumulative Strength Scoring Instead of giving a simple "up" or "down" signal, the script assigns specific numerical weights based on how many Moving Averages are aligned in the same direction. It calculates two separate scores:
- Top Strength (Bullish): This score increases as more Moving Averages fall into a sequential order from highest to lowest price. The more MAs that confirm the upward trend, the higher this value climbs.
- Bottom Strength (Bearish): Conversely, this score becomes more negative as the Moving Averages align in a descending order, indicating a stronger downward trend.
3. Progressive Weighting The logic uses a step-based weighting system. For example:
- If only the first two averages are aligned, it adds a small amount of weight.
- As more averages (3, 4, and so on) join the trend in the correct sequence, the weights increase significantly.
- When all four Moving Averages are perfectly stacked in order, the script reaches its maximum strength value.
Visual Representation
The results are displayed as a histogram in a separate window rather than directly on the price chart. This allows you to see the "momentum" of the market as a fluctuating bar:
- Positive values (Upper Histogram): Indicate increasing bullish momentum. The higher the bar, the more "stacked" the moving averages are in an upward trend.
- Negative values (Lower Histogram): Indicate increasing bearish momentum. The lower the bar, the more "stacked" the moving averages are in a downward trend.
Summary for the User
This tool is built to filter out market noise. By looking at the height of the histogram bars, you can quickly see whether the current trend is gaining "strength" (as the MAs align) or losing steam. It provides a visual representation of total market consensus across multiple time horizons simultaneously.
//+----------------------------------------------------------------------+
//| 4_MA_Strength.mq4 |
//| Copyright © 2006 , kurkafund on 11/05/2006 by David Honeywell |
//| kurkafund@yahoo.com , transport.david@gmail.com |
//+----------------------------------------------------------------------+
#property copyright "Copyright © 2006, Custom Built For kurkafund on 11/05/2006 by David Honeywell"
#property link "kurkafund@yahoo.com , transport.david@gmail.com"
//+--------------------------------------------------------------------------------------------------------------------+
//| Custom Built For kurkafund on 11/05/2006 by David Honeywell , transport.david@gmail.com |
//+--------------------------------------------------------------------------------------------------------------------+
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Lime
#property indicator_color2 MediumVioletRed
#property indicator_level1 3.5000
#property indicator_level2 0.0000
#property indicator_level3 -3.5000
//---- input parameters
extern int Ind_TimePeriod = 60;
extern int Ma1_Period = 8; // Averaging period for calculation.
extern int Ma1_Shift = 0; // MA shift. Indicators line offset relate to the chart by timeframe.
extern int Ma1_Method = 1; // MA method. It can be any of the Moving Average method enumeration value. 0=sma, 1=ema, 2=smma, 3=lwma
extern int Ma1_Price = 0; // Applied price. It can be any of Applied price enumeration values. 0=close, 1=open, 2=high, 3=low, 4=median, 5=typical, 6=weightedclose
extern int Ma2_Period = 24; // Averaging period for calculation.
extern int Ma2_Shift = 0; // MA shift. Indicators line offset relate to the chart by timeframe.
extern int Ma2_Method = 1; // MA method. It can be any of the Moving Average method enumeration value. 0=sma, 1=ema, 2=smma, 3=lwma
extern int Ma2_Price = 0; // Applied price. It can be any of Applied price enumeration values. 0=close, 1=open, 2=high, 3=low, 4=median, 5=typical, 6=weightedclose
extern int Ma3_Period = 72; // Averaging period for calculation.
extern int Ma3_Shift = 0; // MA shift. Indicators line offset relate to the chart by timeframe.
extern int Ma3_Method = 1; // MA method. It can be any of the Moving Average method enumeration value. 0=sma, 1=ema, 2=smma, 3=lwma
extern int Ma3_Price = 0; // Applied price. It can be any of Applied price enumeration values. 0=close, 1=open, 2=high, 3=low, 4=median, 5=typical, 6=weightedclose
extern int Ma4_Period = 216; // Averaging period for calculation.
extern int Ma4_Shift = 0; // MA shift. Indicators line offset relate to the chart by timeframe.
extern int Ma4_Method = 1; // MA method. It can be any of the Moving Average method enumeration value. 0=sma, 1=ema, 2=smma, 3=lwma
extern int Ma4_Price = 0; // Applied price. It can be any of Applied price enumeration values. 0=close, 1=open, 2=high, 3=low, 4=median, 5=typical, 6=weightedclose
extern int ShowDays = 22;
//---- buffers
double TopStrength[];
double BottomStrength[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
SetIndexStyle(0,DRAW_HISTOGRAM);
SetIndexEmptyValue(0,0.0);
SetIndexLabel(0,"iCustom mode 0 TopStrength");
SetIndexBuffer(0,TopStrength);
SetIndexStyle(1,DRAW_HISTOGRAM);
SetIndexEmptyValue(1,0.0);
SetIndexLabel(1,"iCustom mode 1 BottomStrength");
SetIndexBuffer(1,BottomStrength);
IndicatorShortName("4_MA_Strength(Ind_TimePeriod ( "+Ind_TimePeriod+" ) MA ( "+Ma1_Period+" | "+Ma2_Period+" | "+Ma3_Period+" | "+Ma4_Period+" ) ");
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
//----
int i , ShowBars = ((1440/Period())*ShowDays);
if (ShowBars >= Bars) ShowBars = Bars - 1;
for ( i=ShowBars; i>=0; i--)
{
double MA1, MA2, MA3, MA4;
double ustrength1 = 0, ustrength2 = 0, ustrength3 = 0, ustrength4 = 0, ustrength5 = 0, ustrength6 = 0;
double dstrength1 = 0, dstrength2 = 0, dstrength3 = 0, dstrength4 = 0, dstrength5 = 0, dstrength6 = 0;
double Ma1_0 = iMA(Symbol(), Ind_TimePeriod, Ma1_Period, Ma1_Shift, Ma1_Method, Ma1_Price, i)*1000;
double Ma2_0 = iMA(Symbol(), Ind_TimePeriod, Ma2_Period, Ma2_Shift, Ma2_Method, Ma2_Price, i)*1000;
double Ma3_0 = iMA(Symbol(), Ind_TimePeriod, Ma3_Period, Ma3_Shift, Ma3_Method, Ma3_Price, i)*1000;
double Ma4_0 = iMA(Symbol(), Ind_TimePeriod, Ma4_Period, Ma4_Shift, Ma4_Method, Ma4_Price, i)*1000;
if ( Ma1_0 > Ma2_0 ) ustrength1 = 0.25;
if ( Ma1_0 > Ma2_0 ) dstrength1 = -0.25;
if ( Ma1_0 > Ma2_0 && Ma1_0 > Ma3_0 ) ustrength2 = 0.50;
if ( Ma1_0 < Ma2_0 && Ma1_0 < Ma3_0 ) dstrength2 = -0.50;
if ( Ma1_0 > Ma2_0 && Ma1_0 > Ma3_0 && Ma1_0 > Ma4_0 ) ustrength3 = 0.75;
if ( Ma1_0 < Ma2_0 && Ma1_0 < Ma3_0 && Ma1_0 < Ma4_0 ) dstrength3 = -0.75;
if ( Ma1_0 > Ma2_0 && Ma1_0 > Ma3_0 && Ma1_0 > Ma4_0 && Ma2_0 > Ma3_0 ) ustrength4 = 1.00;
if ( Ma1_0 < Ma2_0 && Ma1_0 < Ma3_0 && Ma1_0 < Ma4_0 && Ma2_0 < Ma3_0 ) dstrength4 = -1.00;
if ( Ma1_0 > Ma2_0 && Ma1_0 > Ma3_0 && Ma1_0 > Ma4_0 && Ma2_0 > Ma3_0 && Ma2_0 > Ma4_0 ) ustrength5 = 1.25;
if ( Ma1_0 < Ma2_0 && Ma1_0 < Ma3_0 && Ma1_0 < Ma4_0 && Ma2_0 < Ma3_0 && Ma2_0 < Ma4_0 ) dstrength5 = -1.25;
if ( Ma1_0 > Ma2_0 && Ma1_0 > Ma3_0 && Ma1_0 > Ma4_0 && Ma2_0 > Ma3_0 && Ma2_0 > Ma4_0 && Ma3_0 > Ma4_0 ) ustrength6 = 1.50;
if ( Ma1_0 < Ma2_0 && Ma1_0 < Ma3_0 && Ma1_0 < Ma4_0 && Ma2_0 < Ma3_0 && Ma2_0 < Ma4_0 && Ma3_0 > Ma4_0 ) dstrength6 = -1.50;
TopStrength[i] = ustrength1 + ustrength2 + ustrength3 + ustrength4 + ustrength5 + ustrength6;
BottomStrength[i] = dstrength1 + dstrength2 + dstrength3 + dstrength4 + dstrength5 + dstrength6;
}
//----
return(0);
}
//+------------------------------------------------------------------+
Comments