#one_two_punch
#-------------------------
def na = double.nan;
def bn = BarNumber();
def data = close;
input avg1_type = AverageType.exponential;
input avg1_length = 3;
def avg1 = MovingAverage(avg1_type, data, avg1_length );
input avg2_type = AverageType.exponential;
input avg2_length = 8;
def avg2 = MovingAverage(avg2_type, data, avg2_length );
input show_avg_lines = yes;
plot zavg1 = if show_avg_lines then avg1 else na;
plot zavg2 = if show_avg_lines then avg2 else na;
zavg1.SetDefaultColor(Color.cyan);
zavg1.SetLineWeight(1);
zavg1.HideBubble();
zavg2.SetDefaultColor(Color.yellow);
zavg2.SetLineWeight(1);
zavg2.HideBubble();
def xup = avg1 crosses above avg2;
def xdwn = avg1 crosses below avg2;
#https://toslc.thinkorswim.com/center/reference/thinkScript/Constants/AverageType
#input avg1_type = AverageType.Simple;
#input avg1_type = AverageType.exponential;
#input avg1_type = AverageType.hull;
#input avg1_type = AverageType.weighted;
#input avg1_type = AverageType.wilders;
AddLabel(1,
(if avg1_type == AverageType.SIMPLE then "SMA"
else if avg1_type == AverageType.EXPONENTIAL then "EMA"
else if avg1_type == AverageType.HULL then "HULL"
else if avg1_type == AverageType.WEIGHTED then "WT"
else if avg1_type == AverageType.WILDERS then "WILD"
else "---") + avg1_length
, Color.CYAN);
AddLabel(1,
(if avg2_type == AverageType.SIMPLE then "SMA"
else if avg2_type == AverageType.EXPONENTIAL then "EMA"
else if avg2_type == AverageType.HULL then "HULL"
else if avg2_type == AverageType.WEIGHTED then "WT"
else if avg2_type == AverageType.WILDERS then "WILD"
else "---") + avg2_length
, Color.yellow);
#https://toslc.thinkorswim.com/center/reference/thinkScript/Constants/AverageType
#input avg1_type = AverageType.Simple;
#input avg1_type = AverageType.exponential;
#input avg1_type = AverageType.hull;
#input avg1_type = AverageType.weighted;
#input avg1_type = AverageType.wilders;
plot zxup = if xup then high * 1.001 else na;
zxup.SetPaintingStrategy(PaintingStrategy.POINTS);
zxup.SetDefaultColor(Color.cyan);
zxup.setlineweight(3);
plot zxdwn = if xdwn then low * 0.999 else na;
zxdwn.SetPaintingStrategy(PaintingStrategy.POINTS);
zxdwn.SetDefaultColor(Color.cyan);
zxdwn.setlineweight(3);
#------------------------
# keltner ch
input displace = 0;
#input factor = 1.5;
input factor = 3.0;
input length = 20;
input price = close;
input averageType = AverageType.SIMPLE;
input trueRangeAverageType = AverageType.SIMPLE;
def shift = factor * MovingAverage(trueRangeAverageType, TrueRange(high, close, low), length);
def average = MovingAverage(averageType, price, length);
plot Avg = average[-displace];
#Avg.SetDefaultColor(GetColor(1));
avg.SetDefaultColor(Color.white);
plot Upper_Band = average[-displace] + shift[-displace];
#Upper_Band.SetDefaultColor(GetColor(8));
upper_band.SetDefaultColor(Color.gray);
plot Lower_Band = average[-displace] - shift[-displace];
#Lower_Band.SetDefaultColor(GetColor(5));
lower_band.SetDefaultColor(Color.gray);
#----------------------
# is close outside 3.0 keltner bands?
def iskeltlo = close < lower_band;
def iskelthi = close > upper_band;
plot zkup = iskelthi;
zkup.SetPaintingStrategy(PaintingStrategy.BOOLEAN_WEDGE_up);
plot zkdwn = iskeltlo;
zkdwn.SetPaintingStrategy(PaintingStrategy.BOOLEAN_WEDGE_down);
#-----------------
#