ATR Channels
Download scriptThis script is a visual trading tool designed to help market participants understand price volatility and identify potential boundaries for price action. It works by creating a dynamic "envelope" or channel system around the current price trend on a trading chart.
Core Logic Overview
The tool operates by calculating three distinct layers of price boundaries based on two primary financial metrics: Average Price Movement and Market Volatility.
1. The Center Line (Trend Foundation)
At the heart of the indicator is a "Moving Average" line. This serves as the baseline, representing the smoothed average price over a specific period. It helps traders see the general direction of the market (upward, downward, or sideways) by filtering out minor, insignificant price fluctuations.
2. The Volatility Measurement
To determine how wide the trading channels should be, the script uses an Average True Range (ATR). This is a mathematical calculation that measures how much the price typically moves in a given timeframe. By using this, the indicator automatically "breathes" with the market:
- When the market is calm and stable, the channels tighten.
- When the market becomes highly volatile or aggressive, the channels widen automatically to reflect that increased activity.
3. The Triple Channel System
The script projects three different levels of "Upper" and "Lower" bands around the center line. Each level represents a different multiplier of the market volatility:
- Inner Channel (Tight): Represents immediate price fluctuations. These lines are closer to the center and indicate where the price frequently moves in standard conditions.
- Middle Channel (Moderate): Provides a wider buffer, capturing more significant swings in price movement.
- Outer Channel (Wide): These are the furthest boundaries. They represent extreme market movements or "overextended" territory.
How to Interpret the Visuals
By looking at these seven lines simultaneously, a user can gain a sense of "normal" vs. "extreme" behavior:
- Equilibrium: When the price stays within the inner channels, it is moving in line with standard market volatility.
- Expansion: If the price moves toward or touches the outer channels, it suggests that the current move is unusually strong or potentially reaching an exhaustion point.
- Dynamic Adjustment: Because both the center line and the width of the channels are constantly recalculating based on recent history, the indicator remains relevant as market conditions change from day to day.
//+------------------------------------------------------------------+
//| ATR Channels.mq4 |
//| Copyright © 2005, Luis Guilherme Damiani |
//| http://www.damianifx.com.br |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, Luis Guilherme Damiani"
#property link "http://www.damianifx.com.br"
#property indicator_chart_window
#property indicator_buffers 7
#property indicator_color1 Lime //Moving Average
#property indicator_color2 Aqua // Lower band 1
#property indicator_color3 Yellow // Upper band 1
#property indicator_color4 DodgerBlue // Lower band 2
#property indicator_color5 Orange // Upper band 2
#property indicator_color6 Blue // Lower band 3
#property indicator_color7 Red // Upper band 3
//---- indicator buffers
double MA_Buffer0[];
double Ch1up_Buffer1[];
double Ch1dn_Buffer2[];
double Ch2up_Buffer3[];
double Ch2dn_Buffer4[];
double Ch3up_Buffer5[];
double Ch3dn_Buffer6[];
//---- input parameters
extern int PeriodsATR = 18;
extern int MA_Periods = 49;
extern int MA_type = MODE_LWMA;
extern double Mult_Factor1 = 1.6;
extern double Mult_Factor2 = 3.2;
extern double Mult_Factor3 = 4.8;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
string mat;
//---7- indicators
// MA
SetIndexStyle(0, DRAW_LINE);
SetIndexBuffer(0, MA_Buffer0);
SetIndexDrawBegin(0, MathMax(PeriodsATR, MA_Periods));
// ATR 1 up
SetIndexStyle(1, DRAW_LINE);
SetIndexBuffer(1, Ch1up_Buffer1);
SetIndexDrawBegin(1, MathMax(PeriodsATR, MA_Periods));
string sATRu1 = StringConcatenate("ATRu(", PeriodsATR, ", ", Mult_Factor1, ")");
SetIndexLabel(1, sATRu1);
// ATR 1 down
SetIndexStyle(2, DRAW_LINE);
SetIndexBuffer(2, Ch1dn_Buffer2);
SetIndexDrawBegin(2, MathMax(PeriodsATR, MA_Periods));
string sATRd1 = StringConcatenate("ATRd(", PeriodsATR, ", ", Mult_Factor1, ")");
SetIndexLabel(2, sATRd1);
// ATR 2 up
SetIndexStyle(3, DRAW_LINE);
SetIndexBuffer(3, Ch2up_Buffer3);
SetIndexDrawBegin(3, MathMax(PeriodsATR, MA_Periods));
string sATRu2 = StringConcatenate("ATRu(", PeriodsATR, ", ", Mult_Factor2, ")");
SetIndexLabel(3, sATRu2);
// ATR 2 down
SetIndexStyle(4, DRAW_LINE);
SetIndexBuffer(4, Ch2dn_Buffer4);
SetIndexDrawBegin(4, MathMax(PeriodsATR, MA_Periods));
string sATRd2 = StringConcatenate("ATRd(", PeriodsATR, ", ", Mult_Factor2, ")");
SetIndexLabel(4, sATRd2);
// ATR 3 up
SetIndexStyle(5, DRAW_LINE);
SetIndexBuffer(5, Ch3up_Buffer5);
SetIndexDrawBegin(5, MathMax(PeriodsATR, MA_Periods));
string sATRu3 = StringConcatenate("ATRu(", PeriodsATR, ", ", Mult_Factor3, ")");
SetIndexLabel(5, sATRu3);
// ATR 3 down
SetIndexStyle(6, DRAW_LINE);
SetIndexBuffer(6, Ch3dn_Buffer6);
SetIndexDrawBegin(6, MathMax(PeriodsATR, MA_Periods));
string sATRd3 = StringConcatenate("ATRd(", PeriodsATR, ", ", Mult_Factor3, ")");
SetIndexLabel(6, sATRd3);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
if(Bars <= MathMax(PeriodsATR, MA_Periods))
return(0);
int fixed_bars = IndicatorCounted();
//---- check for possible errors
if(fixed_bars < 0)
return(-1);
//---- last counted bar will be recounted
if(fixed_bars > 0)
fixed_bars--;
int limit = Bars - fixed_bars;
//----
for(int i = 0; i < limit; i++)
{
double atr = iATR(NULL, 0, PeriodsATR, i);
double ma = iMA(NULL, 0, MA_Periods, 0, MA_type, PRICE_TYPICAL, i);
MA_Buffer0[i] = ma;
Ch1up_Buffer1[i] = ma + atr*Mult_Factor1;
Ch1dn_Buffer2[i] = ma - atr*Mult_Factor1;
Ch2up_Buffer3[i] = ma + atr*Mult_Factor2;
Ch2dn_Buffer4[i] = ma - atr*Mult_Factor2;
Ch3up_Buffer5[i] = ma + atr*Mult_Factor3;
Ch3dn_Buffer6[i] = ma - atr*Mult_Factor3;
}
//----
return(0);
}
//+------------------------------------------------------------------+
Comments