ATR Cloud Levels for ThinkorSwim

Welkin

Welkin

Active member
VIP
Think I might've posted a older version of something similar I'd made in the past, but couldn't find it... figured I'd post this one because it's far less intrusive on a chart, especially when you have other indicators on top of it.
Plots ATR Levels above and below the day's open to a max of 2x ATR in quarter segments.




Code:
#[email protected]
#Plots Upper and Lower ATR ranges onto the current day's open

def NA = Double.NaN;

input atrLength = 14;
input averageType = AverageType.WILDERS;
input showClouds = yes;
input showAtrLabel = yes;
input showAtrStatsLabel = yes;

#ATR
def TR1 = high("period"= AggregationPeriod.DAY) - low("period"= AggregationPeriod.DAY);
def TR2 = AbsValue(high("period"= AggregationPeriod.DAY) - close("period"= AggregationPeriod.DAY)[1]);
def TR3 = AbsValue(low("period"= AggregationPeriod.DAY) - close("period"= AggregationPeriod.DAY)[1]);
def TrueRange = if TR1 > TR2 and TR1 > TR3 then TR1 else if TR2 > TR1 and TR2 > TR3 then TR2 else TR3;
def ATR = MovingAverage(averageType, TrueRange, atrLength);
def DayHigh = high("period"= AggregationPeriod.DAY);
def DayLow = low("period"= AggregationPeriod.DAY);
def Range = DayHigh - DayLow;
#PLOTS
plot DayOpen = open("period"= AggregationPeriod.DAY);
plot ATRQuarterH = DayOpen + (ATR[1]/4);
plot ATRQuarterL = DayOpen - (ATR[1]/4);
plot ATRHalfH = DayOpen + (ATR[1]/2);
plot ATRHalfL = DayOpen - (ATR[1]/2);
plot ATR3QuarterH = DayOpen + (ATR[1]*.75);
plot ATR3QuarterL = DayOpen - (ATR[1]*.75);
plot ATRFullH = DayOpen + (ATR[1]);
plot ATRFullL = DayOpen - (ATR[1]);
plot ATRFullQuarterH = DayOpen + (ATR[1]*1.25);
plot ATRFullQuarterL = DayOpen - (ATR[1]*1.25);
plot ATRFullHalfH = DayOpen + (ATR[1]*1.5);
plot ATRFullHalfL = DayOpen - (ATR[1]*1.5);
plot ATRFull3QuarterH = DayOpen + (ATR[1]*1.75);
plot ATRFull3QuarterL = DayOpen - (ATR[1]*1.75);
plot ATRFull2xH = DayOpen + (ATR[1]*2);
plot ATRFull2xL = DayOpen - (ATR[1]*2);


#LABEL
AddLabel(if showAtrLabel then 1 else 0, "ATR: " + Round(ATR,2) + " / Range: " + Round(Range,2) + " / " + Round(Range/ATR,2) +"xATR", Color.GRAY);



#CLOUDS
AddCloud(if !showClouds then NA else ATRFull2xH, ATRFull3QuarterH, CreateColor(160,160,160),CreateColor(160,160,160), no);
AddCloud(if !showClouds then NA else ATRFull3QuarterH, ATRFullHalfH, CreateColor(140,140,140),CreateColor(140,140,140), no);
AddCloud(if !showClouds then NA else ATRFullHalfH, ATRFullQuarterH, CreateColor(120,120,120),CreateColor(120,120,120), no);
AddCloud(if !showClouds then NA else ATRFullQuarterH, ATRFullH, CreateColor(100,100,100),CreateColor(100,100,100), no);
AddCloud(if !showClouds then NA else ATRFullH, ATR3QuarterH, CreateColor(80,80,80),CreateColor(80,80,80), no);
AddCloud(if !showClouds then NA else ATR3QuarterH, ATRHalfH, CreateColor(60,60,60),CreateColor(60,60,60), no);
AddCloud(if !showClouds then NA else ATRHalfH, ATRQuarterH, CreateColor(40,40,40),CreateColor(40,40,40), no);

AddCloud(if !showClouds then NA else ATRFull3QuarterL, ATRFull2xL, CreateColor(160,160,160),CreateColor(160,160,160), no);
AddCloud(if !showClouds then NA else ATRFullHalfL, ATRFull3QuarterL, CreateColor(140,140,140),CreateColor(140,140,140), no);
AddCloud(if !showClouds then NA else ATRFullQuarterL, ATRFullHalfL, CreateColor(120,120,120),CreateColor(120,120,120), no);
AddCloud(if !showClouds then NA else ATRFullL, ATRFullQuarterL, CreateColor(100,100,100),CreateColor(100,100,100), no);
AddCloud(if !showClouds then NA else ATR3QuarterL, ATRFullL, CreateColor(80,80,80),CreateColor(80,80,80), no);
AddCloud(if !showClouds then NA else ATRHalfL, ATR3QuarterL, CreateColor(60,60,60),CreateColor(60,60,60), no);
AddCloud(if !showClouds then NA else ATRQuarterL, ATRHalfL, CreateColor(40,40,40),CreateColor(40,40,40), no);

#FORMATTING
#ATRQuarterH.Hide();
#ATRQuarterL.Hide();
#ATRHalfH.Hide();
#ATRHalfL.Hide();
#ATR3QuarterH.Hide();
#ATR3QuarterL.Hide();
#ATRFullH.Hide();
#ATRFullL.Hide();
#ATRFullQuarterH.Hide();
#ATRFullQuarterL.Hide();
#ATRFullHalfH.Hide();
#ATRFullHalfL.Hide();
#ATRFullHalfH.Hide();
#ATRFullHalfL.Hide();
#ATRFullHalfH.Hide();
#ATRFullHalfL.Hide();
#ATRFull3QuarterH.Hide();
#ATRFull3QuarterL.Hide();
#ATRFull2xH.Hide();
#ATRFull2xL.Hide();

DayOpen.SetDefaultColor(Color.WHITE);
DayOpen.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);

ATRQuarterH.SetDefaultColor(Color.DARK_GRAY);
ATRQuarterL.SetDefaultColor(Color.DARK_GRAY);
ATRQuarterH.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
ATRQuarterL.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);

ATRHalfH.SetDefaultColor(Color.DARK_GRAY);
ATRHalfL.SetDefaultColor(Color.DARK_GRAY);
ATRHalfH.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
ATRHalfL.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);

ATR3QuarterH.SetDefaultColor(Color.DARK_GRAY);
ATR3QuarterL.SetDefaultColor(Color.DARK_GRAY);
ATR3QuarterH.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
ATR3QuarterL.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);

ATRFullH.SetDefaultColor(Color.DARK_GRAY);
ATRFullL.SetDefaultColor(Color.DARK_GRAY);
ATRFullH.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
ATRFullL.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);

ATRFullQuarterH.SetDefaultColor(Color.DARK_GRAY);
ATRFullQuarterL.SetDefaultColor(Color.DARK_GRAY);
ATRFullQuarterH.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
ATRFullQuarterL.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);

ATRFullHalfH.SetDefaultColor(Color.DARK_GRAY);
ATRFullHalfL.SetDefaultColor(Color.DARK_GRAY);
ATRFullHalfH.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
ATRFullHalfL.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);

ATRFull3QuarterH.SetDefaultColor(Color.DARK_GRAY);
ATRFull3QuarterL.SetDefaultColor(Color.DARK_GRAY);
ATRFull3QuarterH.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
ATRFull3QuarterL.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);

ATRFull2xH.SetDefaultColor(Color.DARK_GRAY);
ATRFull2xL.SetDefaultColor(Color.DARK_GRAY);
ATRFull2xH.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
ATRFull2xL.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
Edit: cleaned up the calculations
 
Last edited:
luiscervantes30

luiscervantes30

New member
VIP
How do you use this, what's the strategy behind it long or short?
 
Welkin

Welkin

Active member
VIP
How do you use this, what's the strategy behind it long or short?
I use this as a way to determine whether a stock is potentially exhausted in a certain direction, or look for a reversal play, depending on the time of day it manages to reach that full ATR level. typically if a stock moves a full ATR (4 quarter segments in the indicator) early in the day, you can try and make a play off a reversal. How you decide to use it is up to you. I recommend using it in combination with other indicators that show deviations in price movements such as Bollinger Bands, VWAP deviations, etc..
 
W

whats up

Member
VIP
great script Think I might've posted a older version of something similar I'd made in the past, but couldn't find it... figured I'd post this one because it's far less intrusive on a chart, especially when you have other indicators on top of it.
Plots ATR Levels above and below the day's open to a max of 2x ATR in quarter segments.


https://tos.mx/RVicBnG

Code:
#[email protected]
#Plots Upper and Lower ATR ranges onto the current day's open

def NA = Double.NaN;

input atrLength = 14;
input averageType = AverageType.WILDERS;
input showClouds = yes;
input showAtrLabel = yes;
input showAtrStatsLabel = yes;

#ATR
def TR1 = high("period"= AggregationPeriod.DAY) - low("period"= AggregationPeriod.DAY);
def TR2 = AbsValue(high("period"= AggregationPeriod.DAY) - close("period"= AggregationPeriod.DAY)[1]);
def TR3 = AbsValue(low("period"= AggregationPeriod.DAY) - close("period"= AggregationPeriod.DAY)[1]);
def TrueRange = if TR1 > TR2 and TR1 > TR3 then TR1 else if TR2 > TR1 and TR2 > TR3 then TR2 else TR3;
def ATR = MovingAverage(averageType, TrueRange, atrLength);
def DayHigh = high("period"= AggregationPeriod.DAY);
def DayLow = low("period"= AggregationPeriod.DAY);
def Range = DayHigh - DayLow;
#PLOTS
plot DayOpen = open("period"= AggregationPeriod.DAY);
plot ATRQuarterH = DayOpen + (ATR[1]/4);
plot ATRQuarterL = DayOpen - (ATR[1]/4);
plot ATRHalfH = DayOpen + (ATR[1]/2);
plot ATRHalfL = DayOpen - (ATR[1]/2);
plot ATR3QuarterH = DayOpen + (ATR[1]/2) + (ATR[1]/4);
plot ATR3QuarterL = DayOpen - (ATR[1]/2) - (ATR[1]/4);
plot ATRFullH = DayOpen + (ATR[1]);
plot ATRFullL = DayOpen - (ATR[1]);
plot ATRFullQuarterH = DayOpen + (ATR[1]) + (ATR[1]/4);
plot ATRFullQuarterL = DayOpen - (ATR[1]) - (ATR[1]/4);
plot ATRFullHalfH = DayOpen + (ATR[1]) + (ATR[1]/2);
plot ATRFullHalfL = DayOpen - (ATR[1]) - (ATR[1]/2);
plot ATRFull3QuarterH = DayOpen + (ATR[1]) + (ATR[1]/2) + (ATR[1]/4);
plot ATRFull3QuarterL = DayOpen - (ATR[1]) - (ATR[1]/2) - (ATR[1]/4);
plot ATRFull2xH = DayOpen + (ATR[1]) + (ATR[1]);
plot ATRFull2xL = DayOpen - (ATR[1]) - (ATR[1]);


#LABEL
AddLabel(if showAtrLabel then 1 else 0, "ATR: " + Round(ATR,2) + " / Range: " + Round(Range,2) + " / " + Round(Range/ATR,2) +"xATR", Color.GRAY);



#CLOUDS
AddCloud(if !showClouds then NA else ATRFull2xH, ATRFull3QuarterH, CreateColor(160,160,160),CreateColor(160,160,160), no);
AddCloud(if !showClouds then NA else ATRFull3QuarterH, ATRFullHalfH, CreateColor(140,140,140),CreateColor(140,140,140), no);
AddCloud(if !showClouds then NA else ATRFullHalfH, ATRFullQuarterH, CreateColor(120,120,120),CreateColor(120,120,120), no);
AddCloud(if !showClouds then NA else ATRFullQuarterH, ATRFullH, CreateColor(100,100,100),CreateColor(100,100,100), no);
AddCloud(if !showClouds then NA else ATRFullH, ATR3QuarterH, CreateColor(80,80,80),CreateColor(80,80,80), no);
AddCloud(if !showClouds then NA else ATR3QuarterH, ATRHalfH, CreateColor(60,60,60),CreateColor(60,60,60), no);
AddCloud(if !showClouds then NA else ATRHalfH, ATRQuarterH, CreateColor(40,40,40),CreateColor(40,40,40), no);

AddCloud(if !showClouds then NA else ATRFull3QuarterL, ATRFull2xL, CreateColor(160,160,160),CreateColor(160,160,160), no);
AddCloud(if !showClouds then NA else ATRFullHalfL, ATRFull3QuarterL, CreateColor(140,140,140),CreateColor(140,140,140), no);
AddCloud(if !showClouds then NA else ATRFullQuarterL, ATRFullHalfL, CreateColor(120,120,120),CreateColor(120,120,120), no);
AddCloud(if !showClouds then NA else ATRFullL, ATRFullQuarterL, CreateColor(100,100,100),CreateColor(100,100,100), no);
AddCloud(if !showClouds then NA else ATR3QuarterL, ATRFullL, CreateColor(80,80,80),CreateColor(80,80,80), no);
AddCloud(if !showClouds then NA else ATRHalfL, ATR3QuarterL, CreateColor(60,60,60),CreateColor(60,60,60), no);
AddCloud(if !showClouds then NA else ATRQuarterL, ATRHalfL, CreateColor(40,40,40),CreateColor(40,40,40), no);

#FORMATTING
ATRQuarterH.Hide();
ATRQuarterL.Hide();
ATRHalfH.Hide();
ATRHalfL.Hide();
ATR3QuarterH.Hide();
ATR3QuarterL.Hide();
ATRFullH.Hide();
ATRFullL.Hide();
ATRFullQuarterH.Hide();
ATRFullQuarterL.Hide();
ATRFullHalfH.Hide();
ATRFullHalfL.Hide();
ATRFullHalfH.Hide();
ATRFullHalfL.Hide();
ATRFullHalfH.Hide();
ATRFullHalfL.Hide();
ATRFull3QuarterH.Hide();
ATRFull3QuarterL.Hide();
ATRFull2xH.Hide();
ATRFull2xL.Hide();

DayOpen.SetDefaultColor(Color.WHITE);
DayOpen.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);

ATRQuarterH.SetDefaultColor(Color.GRAY);
ATRQuarterL.SetDefaultColor(Color.GRAY);
ATRQuarterH.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
ATRQuarterL.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);

ATRHalfH.SetDefaultColor(Color.MAGENTA);
ATRHalfL.SetDefaultColor(Color.MAGENTA);
ATRHalfH.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
ATRHalfL.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);

ATR3QuarterH.SetDefaultColor(Color.GRAY);
ATR3QuarterL.SetDefaultColor(Color.GRAY);
ATR3QuarterH.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
ATR3QuarterL.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);

ATRFullH.SetDefaultColor(Color.MAGENTA);
ATRFullL.SetDefaultColor(Color.MAGENTA);
ATRFullH.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
ATRFullL.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);

ATRFullQuarterH.SetDefaultColor(Color.GRAY);
ATRFullQuarterL.SetDefaultColor(Color.GRAY);
ATRFullQuarterH.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
ATRFullQuarterL.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);

ATRFullHalfH.SetDefaultColor(Color.MAGENTA);
ATRFullHalfL.SetDefaultColor(Color.MAGENTA);
ATRFullHalfH.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
ATRFullHalfL.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
hi welkin...this is great for /es that opens at 1800, gives you an ideal were it may go when markets open,but when you trade FB AAPL NVDA most stocks starts premarket at 4.00am, can you make the open at 4.00am? may give you a better ideal were some stocks will do during the day..thanks this is great script
 
Welkin

Welkin

Active member
VIP
hi welkin...this is great for /es that opens at 1800, gives you an ideal were it may go when markets open,but when you trade FB AAPL NVDA most stocks starts premarket at 4.00am, can you make the open at 4.00am? may give you a better ideal were some stocks will do during the day..thanks this is great script
Appreciate the feedback and glad you've found it useful in your trading. The open value is pulled from the daily aggregation, a new daily candle doesn't start until regular trading hours market open. It might be possible to do what you want, I have an idea of where to start, but I'll just have to dwell on it for a bit and figure it out how I'm going to script it. I feel that having the ATR levels plotted with the RTH market open as a base is key, so who knows how accurate the levels would be if it is plotted at premarket open. Been pretty busy lately, so can't really say when I'll get to mess around with it.
 
Last edited:
W

whats up

Member
VIP
Appreciate the feedback and glad you've found it useful in your trading. The open value is pulled from the daily aggregation, a new daily candle doesn't start until regular trading hours market open. It might be possible to do what you want, I have an idea of where to start, but I'll just have to dwell on it for a bit and figure it out how I'm going to script it. I feel that having the ATR levels plotted with the RTH market open as a base is key, so who knows how accurate the levels would be if it is plotted at premarket open. Been pretty busy lately, so can't really say when I'll get to mess around with it.
thank you. appreciate you feed back
 

Similar threads

Top