4 ma strength
Download scriptThis script is a specialized technical analysis tool designed to measure and visualize market sentiment by calculating the relative alignment of four different Moving Averages (MA). Instead of showing you standard price lines, it translates the relationship between these averages into a "Strength" score shown as a histogram.
Core Logic Overview
The tool operates by comparing a fast-moving average against three slower-moving averages simultaneously. It evaluates how many of these "lags" the fast average is leading or trailing. The goal is to identify whether the current market momentum is strongly bullish (positive strength), bearish (negative strength), or neutral.
How the Calculation Works
The script looks at four specific Moving Averages (defined by different time periods) and runs a series of "if-then" checks to see how they stack up against one another:
- Tiered Momentum Checks: The logic evaluates six different levels of alignment. For example, it checks if the fastest average is higher than the second, third, and fourth averages.
- Cumulative Scoring: Every time a condition is met (e.g., the fast average is higher than all others), the script adds a specific value to a "Top Strength" score. Conversely, if the fast average is lower than the others, it subtracts that value from a "Bottom Strength" score.
- Weighting: The scoring system increases in intensity as more Moving Averages align in the same direction. The more "perfectly" stacked the averages are, the higher the resulting strength value on the histogram.
Visual Representation
The result is displayed in a separate window below your main price chart as two distinct histograms:
- Top Strength (Lime): Represents bullish momentum. As the fast moving average stays above the slower ones, this histogram grows taller.
- Bottom Strength (MediumVioletRed): Represents bearish momentum. As the fast moving average falls below the slower averages, this histogram grows downward.
Summary for the User
Think of this tool as a "momentum gauge." Rather than just telling you where the price is, it tells you how much agreement there is between different timeframes.
- High positive values suggest a strong, synchronized upward trend across multiple periods.
- Deep negative values suggest a strong, synchronized downward trend.
- Values near zero indicate a lack of consensus, suggesting the market may be ranging or in a transition phase where the different averages are crossing each other frequently.
//+----------------------------------------------------------------------+
//| 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 0.0000
//---- input parameters
extern int ChartTimePeriod = 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;
double prevtime;
//---- 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(ChartTimePeriod ( "+ChartTimePeriod+" ) 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 counted_bars=IndicatorCounted();
int i;
//----
double ShowBars = ((1440/Period())*ShowDays);
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(), ChartTimePeriod, Ma1_Period, Ma1_Shift, Ma1_Method, Ma1_Price, i)*1000;
double Ma2_0 = iMA(Symbol(), ChartTimePeriod, Ma2_Period, Ma2_Shift, Ma2_Method, Ma2_Price, i)*1000;
double Ma3_0 = iMA(Symbol(), ChartTimePeriod, Ma3_Period, Ma3_Shift, Ma3_Method, Ma3_Price, i)*1000;
double Ma4_0 = iMA(Symbol(), ChartTimePeriod, 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