iMA_TrueFibs_Above
Download scriptThis script is a specialized technical analysis tool designed for the MetaTrader 4 platform. It combines two popular trading concepts—Moving Averages and Fibonacci-based price levels—into a single visual indicator to help traders identify potential support and resistance zones.
Core Functionality
The primary purpose of this tool is to calculate a central "baseline" using a Moving Average (MA) and then project seven distinct price levels above that baseline. These levels are determined by specific Fibonacci values, creating a dynamic "ribbon" or "zone" that moves along with the market price.
Key Components and Logic
1. Customizable Moving Averages The tool does not rely on just one type of average. It allows the user to choose between several different mathematical models to determine the baseline:
- SMA (Simple): The standard average.
- EMA (Exponential): Weights recent price action more heavily.
- SMMA (Smoothed): A slower, smoother transition.
- LWMA (Linear Weighted): Assigns weight based on the age of the data.
- LSMA (Least Squares): A linear regression method that calculates the "best fit" line for price.
2. Fibonacci Level Projection Once the Moving Average (the baseline) is calculated, the script automatically generates seven additional lines. These lines are positioned at specific distances from the moving average based on a sequence of Fibonacci numbers (21, 34, 55, 89, 144, 233, and 377).
Instead of being static horizontal lines on your chart, these levels are "dynamic." Because they are anchored to the Moving Average, they shift up and down in real-time as the market moves.
3. Visual Interpretation For a trader, this script provides a comprehensive view of potential price targets or reaction zones:
- The Baseline: Represents the current overall trend.
- The Fibonacci Ribbons: Provide a visual "map" of where price might encounter resistance (if moving up) or support (if moving down) based on the current trend's momentum.
Summary for Users
Think of this tool as a dynamic "scaffold" that follows the price. By choosing your preferred Moving Average, you set the trend; by viewing the seven Fibonacci lines, you can see the specific mathematical layers where the market may react or pivot during a trend.
//+------------------------------------------------------------------+
//| iMA_Fibs.mq4 |
//| Copyright © 2006, Robert L Hill |
//| mailto:robydoby314@yahoo.com |
//+------------------------------------------------------------------+
// This indicator allows selection of MA type and sets levels based on Fib values
// Added MAType 4 to use LSMA
#property copyright "Copyright © 2005, Metaquotes"
#property link "mailto:metaquotes@metaquotes.net"
#property indicator_chart_window
#property indicator_buffers 8
#property indicator_color1 Blue
#property indicator_color2 Magenta
#property indicator_color3 Magenta
#property indicator_color4 Magenta
#property indicator_color5 Magenta
#property indicator_color6 Magenta
#property indicator_color7 Magenta
#property indicator_color8 Magenta
#property indicator_width1 2
#property indicator_width2 1
#property indicator_width3 1
#property indicator_width4 1
#property indicator_width5 1
#property indicator_width6 1
#property indicator_width7 1
#property indicator_width8 1
//---- input parameters
extern int MAPeriod=157;
extern int MAType=1;
extern int fibo1 = 21;
extern int fibo2 = 34;
extern int fibo3 = 55;
extern int fibo4 = 89;
extern int fibo5 = 144;
extern int fibo6 = 233;
extern int fibo7 = 377;
//---- buffers
double LineBuffer[];
double Fib1[];
double Fib2[];
double Fib3[];
double Fib4[];
double Fib5[];
double Fib6[];
double Fib7[];
//---- variables
int MAMode;
string strMAType;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)+1);
//---- indicators
IndicatorBuffers(8);
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,LineBuffer);
SetIndexDrawBegin(0,MAPeriod);
SetIndexStyle(1,DRAW_LINE);
SetIndexBuffer(1,Fib1);
SetIndexDrawBegin(1,MAPeriod);
SetIndexStyle(2,DRAW_LINE);
SetIndexBuffer(2,Fib2);
SetIndexDrawBegin(2,MAPeriod);
SetIndexStyle(3,DRAW_LINE);
SetIndexBuffer(3,Fib3);
SetIndexDrawBegin(3,MAPeriod);
SetIndexStyle(4,DRAW_LINE);
SetIndexBuffer(4,Fib4);
SetIndexDrawBegin(4,MAPeriod);
SetIndexStyle(5,DRAW_LINE);
SetIndexBuffer(5,Fib5);
SetIndexDrawBegin(5,MAPeriod);
SetIndexStyle(6,DRAW_LINE);
SetIndexBuffer(6,Fib6);
SetIndexDrawBegin(6,MAPeriod);
SetIndexStyle(7,DRAW_LINE);
SetIndexBuffer(7,Fib7);
SetIndexDrawBegin(7,MAPeriod);
//---- name for DataWindow and indicator subwindow label
IndicatorShortName( strMAType+ " (" +MAPeriod + ") ");
//----
switch (MAType)
{
case 1: strMAType="EMA"; MAMode=MODE_EMA; break;
case 2: strMAType="SMMA"; MAMode=MODE_SMMA; break;
case 3: strMAType="LWMA"; MAMode=MODE_LWMA; break;
case 4: strMAType="LSMA"; break;
default: strMAType="SMA"; MAMode=MODE_SMA; break;
}
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
double LSMA(int Rperiod, int shift)
{
int i;
double sum;
int length;
double lengthvar;
double tmp;
double wt;
length = Rperiod;
sum = 0;
for(i = length; i >= 1 ; i--)
{
lengthvar = length + 1;
lengthvar /= 3;
tmp = 0;
tmp = ( i - lengthvar)*Close[length-i+shift];
sum+=tmp;
}
wt = sum*6/(length*(length+1));
return(wt);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
double MA;
int limit;
int counted_bars = IndicatorCounted();
//---- check for possible errors
if (counted_bars<0) return(-1);
//---- last counted bar will be recounted
if (counted_bars>0) counted_bars--;
limit = Bars - counted_bars;
for(int i=limit; i>=0; i--)
{
if (MAType == 4)
{
MA = LSMA(MAPeriod,i);
}
else
{
MA = iMA(NULL,0,MAPeriod,0,MAMode,PRICE_CLOSE,i);
}
LineBuffer[i] = MA;
Fib1[i] = MA + fibo1*Point;
Fib2[i] = MA + fibo2*Point;
Fib3[i] = MA + fibo3*Point;
Fib4[i] = MA + fibo4*Point;
Fib5[i] = MA + fibo5*Point;
Fib6[i] = MA + fibo6*Point;
Fib7[i] = MA + fibo7*Point;
}
//----
return(0);
}
//+------------------------------------------------------------------+
Comments