ATR Levels
Download scriptThis script is designed to provide traders with visual reference levels on their trading charts based on market volatility. It specifically utilizes the Average True Range (ATR)—a common technical indicator that measures how much an asset typically moves over a specific period—to establish potential support and resistance zones.
Core Functionality
The logic of the script can be broken down into three main phases:
1. Timeframe Detection and Compatibility The script first identifies which timeframe you are currently viewing (e.g., 1-minute, 15-minute, hourly, etc.). It includes a safety check to ensure the chart is not set to a period longer than one day; if it is, the script will notify the user that it cannot function correctly on such large scales.
2. Data Retrieval and Calculation Rather than looking only at the immediate price action of your current small timeframe, the script pulls data from the Daily (D1) timeframe. It calculates a "Full ATR" value based on a user-defined period (defaulting to 10 days). Using this volatility figure, it mathematically generates several specific price levels:
- Resistance Levels: These are calculated by taking the high prices of previous days and adding the ATR value to them.
- Support Levels: These are calculated by taking the low prices of previous days and subtracting the ATR value from them.
- Extended Variations: The script also generates "half" levels (50% of the ATR) and extended levels (150% of the ATR), providing a multi-layered view of where price might encounter friction or reversal points.
3. Visual Mapping Once these prices are calculated, the script automatically draws horizontal lines on your chart to highlight these key zones. To make the data easily readable:
- The lines are colored yellow for high visibility.
- The script places text labels at the end of the lines. These labels explicitly state whether the level is a "resistance" or "support" point and display the exact numerical price value.
- As new price data arrives, the script dynamically moves these lines and labels to ensure they remain accurate relative to the current market movement.
Summary for the Trader
In simple terms, this tool acts as an automated "volatility map." It looks at how much the market moved yesterday and today, then draws lines on your screen showing you where price might stall or bounce based on that historical volatility. It simplifies the process of identifying key trading zones without requiring you to calculate complex daily averages manually.
//+------------------------------------------------------------------+
//| ATR Levels.mq4 |
//| Mike Ischenko |
//| mishanya_fx@yahoo.com |
//+------------------------------------------------------------------+
#property copyright "Mike Ischenko"
#property link "mishanya_fx@yahoo.com"
#property indicator_chart_window
extern int ATRPeriod = 10;
double rates_d1[][6];
double H1, H2, H3, H4, H4t, H5, L5, L4, L4t, L3, L2, L1, halfatr, fullatr;
int timeshift=0, timeshifts=0, beginner=0;
int periods;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//---- TODO: add your code here
ObjectDelete("H4atr line");
ObjectDelete("L4atr line");
ObjectDelete("L4atr label");
ObjectDelete("H4atr label");
ObjectDelete("H4tatr line");
ObjectDelete("L4tatr line");
ObjectDelete("L4tatr label");
ObjectDelete("H4tatr label");
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int counted_bars=IndicatorCounted();
//if (counted_bars<1) return(0);
switch (Period())
{
case PERIOD_M1: {timeshifts=60; beginner=Hour()*60;} break;
case PERIOD_M5: {timeshifts=300; beginner=Hour()*12;} break;
case PERIOD_M15: {timeshifts=900; beginner=Hour()*4;} break;
case PERIOD_M30: {timeshifts=1800; beginner=Hour()*2;} break;
case PERIOD_H1: {timeshifts=3600; beginner=Hour()*1;} break;
case PERIOD_H4: {timeshifts=14400; beginner=Hour()*0.25;} break;
case PERIOD_D1: {timeshifts=86400; beginner=Hour()*0;} break;
}
timeshift=timeshifts*24;
if(Period() > 86400)
{
Print("Error - Chart period is greater than 1 day.");
return(-1); // then exit
}
ArrayCopyRates(rates_d1, Symbol(), PERIOD_D1);
//beginner=Hour();
fullatr = iATR(Symbol(), PERIOD_D1, ATRPeriod, 1);
L4 = rates_d1[1][3] - fullatr;
H4 = rates_d1[1][2] + fullatr;
L4t = rates_d1[0][3] - fullatr;
H4t = rates_d1[0][2] + fullatr;
halfatr = fullatr * 0.5;
H1 = H4+1.5*fullatr;
H2 = H4+fullatr;
H3 = H4+halfatr;
L3 = L4-halfatr;
L2 = L4-fullatr;
L1 = L4-1.5*fullatr;
if (ObjectFind("H4atr Line") != 0)
{
ObjectCreate("H4atr line",OBJ_HLINE,0,Time[0],H4);
ObjectSet("H4atr line",OBJPROP_COLOR,Yellow);
ObjectSet("H4atr line",OBJPROP_WIDTH,1);
}
else
{
ObjectMove("H4atr line", 0,Time[0],H4);
}
if (ObjectFind("L4atr Line") != 0)
{
ObjectCreate("L4atr line",OBJ_HLINE,0,Time[0],L4);
ObjectSet("L4atr line",OBJPROP_COLOR,Yellow);
ObjectSet("L4atr line",OBJPROP_WIDTH,1);
}
else
{
ObjectMove("L4atr line", 0,Time[0],L4);
}
if (ObjectFind("H4tatr Line") != 0)
{
ObjectCreate("H4tatr line",OBJ_HLINE,0,Time[0],H4t);
ObjectSet("H4tatr line",OBJPROP_COLOR,Yellow);
ObjectSet("H4tatr line",OBJPROP_WIDTH,1);
}
else
{
ObjectMove("H4tatr line", 0,Time[0],H4t);
}
if (ObjectFind("L4tatr Line") != 0)
{
ObjectCreate("L4tatr line",OBJ_HLINE,0,Time[0],L4t);
ObjectSet("L4tatr line",OBJPROP_COLOR,Yellow);
ObjectSet("L4tatr line",OBJPROP_WIDTH,1);
}
else
{
ObjectMove("L4tatr line", 0,Time[0],L4t);
}
if(ObjectFind("H4atr label") != 0)
{
ObjectCreate("H4atr label", OBJ_TEXT, 0, Time[0]+timeshift, H4);
ObjectSetText("H4atr label", "ATR(y) res: " + DoubleToStr(H4,4), 8, "Verdana", Yellow);
}
else
{
ObjectMove("H4atr label", 0, Time[0]+timeshift, H4);
}
if(ObjectFind("L4atr label") != 0)
{
ObjectCreate("L4atr label", OBJ_TEXT, 0, Time[0]+timeshift, L4);
ObjectSetText("L4atr label", "ATR(y) sup: " + DoubleToStr(L4,4), 8, "Verdana", Yellow);
}
else
{
ObjectMove("L4atr label", 0, Time[0]+timeshift, L4);
}
if(ObjectFind("H4tatr label") != 0)
{
ObjectCreate("H4tatr label", OBJ_TEXT, 0, Time[0]+timeshift, H4t);
ObjectSetText("H4tatr label", "ATR(t) res: " + DoubleToStr(H4t,4), 8, "Verdana", Yellow);
}
else
{
ObjectMove("H4tatr label", 0, Time[0]+timeshift, H4t);
}
if(ObjectFind("L4tatr label") != 0)
{
ObjectCreate("L4tatr label", OBJ_TEXT, 0, Time[0]+timeshift, L4t);
ObjectSetText("L4tatr label", "ATR(t) sup: " + DoubleToStr(L4t,4), 8, "Verdana", Yellow);
}
else
{
ObjectMove("L4tatr label", 0, Time[0]+timeshift, L4t);
}
return(0);
}
//+------------------------------------------------------------------+
Comments