#Hull_SuperTrend_Trading_System
# assembled by Chewie 4/10/2022
# many thanks to all the other noted contributors to this system.
# SuperTrend Yahoo Finance Replica - Modified from Modius SuperTrend
# Modified Modius ver. by RConner7
# Modified by Barbaros to replicate look from TradingView version
# Modified by Barbaros to add EMA cross for bubbles and alerts
# Modified by Barbaros to update bar color painting
# v3.3
# Modified by Zetta_wow:
# - Add Donchian Trend Channel code to provide summary value of DTC and include in target lines
# - Added constraints to drawing target lines based on HMA, Supertrend and DTC
# - Added ability to remove drawing the Dyno lines and cloud (label and price bar coloring remain)
# - Commented out some code that didn't appear to be doing anything (leaving in for Chewie to evaluate need)
# - Made entry and target lines all start/end at the same place
# - Some general cleanup and rearranging (no effect to output)
# From the useThinkScript thread introducing Chewie's strategy:
#2. SETUP: You must see three things to define an entry position.
# 1. A top or bottom reversal signal of the Hull Moving Avg plotted with a white square (top) or white triangle (bottom).
# 2. Lower Donchian Trend Ribbon either green or red in the color of the direction you are entering the trade. (Shout out to @halcyonguy who converted this into TOS. Much appreciated, you are awesome!!!)
# 3. Break of the Super Trend indicator. (Default setting is 2.75. Feel free to adjust this if you want in the settings)
#
# HMA signal indicated by Hull_is_buy and Hull_is_sell variables
# Donchian Trend Ribbon signal indicated by DTC_is_buy and DTC_is_sell
# Supertrend signal indicated by Long and Short variables (plots)
# Don't draw entry/1x/2x/3x/4x lines unless all three match signals (buy/long or sell/short)
input Target_Bubbles = no;
input Entry_SL_Bubbles = no;
input Targetlines = yes;
input Labels = yes;
input alertON = yes;
input Bands = yes;
input AvgType = AverageType.HULL;
input STAtrMult = 2.75;
input nATR = 12;
#======== Calculate the Supertrend =====================================================
def ATR = ATR("length" = nATR, "average type" = AvgType);
def UP_Band_Basic = HL2 + (STAtrMult * ATR);
def LW_Band_Basic = HL2 + (-STAtrMult * ATR);
def UP_Band = if ((UP_Band_Basic < UP_Band[1]) or (close[1] > UP_Band[1])) then UP_Band_Basic else UP_Band[1];
def LW_Band = if ((LW_Band_Basic > LW_Band[1]) or (close[1] < LW_Band[1])) then LW_Band_Basic else LW_Band[1];
def ST = if ((ST[1] == UP_Band[1]) and (close < UP_Band)) then UP_Band
else if ((ST[1] == UP_Band[1]) and (close > Up_Band)) then LW_Band
else if ((ST[1] == LW_Band[1]) and (close > LW_Band)) then LW_Band
else if ((ST[1] == LW_Band) and (close < LW_Band)) then UP_Band
else LW_Band;
plot Long = if close > ST then ST else Double.NaN;
Long.AssignValueColor(Color.cyan);
Long.SetLineWeight(3);
plot Short = if close < ST then ST else Double.NaN;
Short.AssignValueColor(Color.magenta);
Short.SetLineWeight(3);
def LongTrigger = isNaN(Long[1]) and !isNaN(Long);
def ShortTrigger = isNaN(Short[1]) and !isNaN(Short);
plot LongDot = if LongTrigger then ST else Double.NaN;
LongDot.SetPaintingStrategy(PaintingStrategy.POINTS);
LongDot.AssignValueColor(Color.cyan);
LongDot.SetLineWeight(4);
plot ShortDot = if ShortTrigger then ST else Double.NaN;
ShortDot.SetPaintingStrategy(PaintingStrategy.POINTS);
ShortDot.AssignValueColor(Color.magenta);
ShortDot.SetLineWeight(4);
AddChartBubble(Entry_SL_Bubbles and LongTrigger, ST, "BUY", Color.GREEN, no);
AddChartBubble(Entry_SL_Bubbles and ShortTrigger, ST, "SELL", Color.RED, yes);
#Super Trend Labels
AddLabel(yes and labels and Long, "ST:LONG", color.CYAN);
AddLabel(yes and labels and Short, "ST:SHORT", color.magenta);
#======== End of Supertrend calcs =====================================================
# =====================================================================================
# Hull Moving Average Concavity and Turning Points
#
# Author: Seth Urion (Mahsume)
# Version: 2020-05-01 V4
#
# Now with support for ToS Mobile
#
declare upper;
input HMA_Length = 60;
input lookback = 3;
input arrows = no;
def price = HL2;
plot HMA = HullMovingAvg(price = price, length = HMA_Length);
def delta = HMA[1] - HMA[lookback + 1];
def delta_per_bar = delta / lookback;
def next_bar = HMA[1] + delta_per_bar;
def concavity = if HMA > next_bar then 1 else -1;
HMA.AssignValueColor(color = if concavity[1] == -1 then
if HMA > HMA[1] then color.dark_orange else color.red else
if HMA < HMA[1] then color.dark_green else color.green);
HMA.SetLineWeight(3);
#Define turning point where concavity switches directiion
plot turning_point = if concavity[1] != concavity then HMA else double.nan;
turning_point.SetLineWeight(2);
turning_point.SetPaintingStrategy(paintingStrategy = PaintingStrategy.POINTS);
turning_point.SetDefaultColor(color.white);
#Plot maximum/minimum points of HMA
# Note: the HMA[-1] term will cause repainting at the end of the chart (looks forward 1 bar)
plot MA_Max = if HMA[-1] < HMA and HMA > HMA[1] then HMA else Double.NaN;
MA_Max.SetDefaultColor(Color.WHITE);
MA_Max.SetPaintingStrategy(PaintingStrategy.SQUARES);
MA_Max.SetLineWeight(5);
plot MA_Min = if HMA[-1] > HMA and HMA < HMA[1] then HMA else Double.Nan;
MA_Min.SetDefaultColor(Color.WHITE);
MA_Min.SetPaintingStrategy(PaintingStrategy.TRIANGLES);
MA_Min.SetLineWeight(5);
#Define conditions for HMA-based alerts (see end of code)
def BuySetup = HMA > HMA[1] and HMA[1] < HMA[2];
def SellSetup = HMA < HMA[1] and HMA[1] > HMA[2];
#Plot buy/sell arrows based on HMA
# Up arrow if at a turning point and concavity is "up"
# Down arrow if at a turning point and concavity is "down"
plot sell = if arrows and turning_point and concavity == -1 then high else double.nan;
sell.SetDefaultColor(Color.DARK_ORANGE);
sell.SetPaintingStrategy(PaintingStrategy.ARROW_DOWN);
sell.SetLineWeight(3);
plot buy = if arrows and turning_point and concavity == 1 then low else double.nan;
buy.SetDefaultColor(Color.CYAN);
buy.SetPaintingStrategy(PaintingStrategy.ARROW_UP);
buy.SetLineWeight(3);
###################
#
# 2020-05-01
#
# MOBILE TOS SUPPORT
#
# Each color of the HMA needs to be a separate plot as ToS Mobile
# lacks the ability to assign colors the way ToS Desktop does.
# I recommend a plain colored HMA behind the line
# Set the line color of the HMA above to gray or some neutral
#
# CCD_D -> ConCave Down and Decreasing
# CCD_I -> ConCave Down and Increasing
# CCU_D -> ConCave Up and Decreasing
# CCU_I -> ConCave Up and Increasing
#
###################
plot CCD_D = if concavity == -1 and HMA < HMA[1] then HMA else double.nan;
CCD_D.SetDefaultColor(Color.RED);
CCD_D.SetLineWeight(1);
plot CCD_I = if concavity == -1 and HMA >= HMA[1] then HMA else double.nan;
CCD_I.SetDefaultColor(Color.DARK_ORANGE);
CCD_I.SetLineWeight(1);
plot CCU_D = if concavity == 1 and HMA <= HMA[1] then HMA else double.nan;
CCU_D.SetDefaultColor(COLOR.DARK_GREEN);
CCU_D.SetLineWeight(1);
plot CCU_I = if concavity == 1 and HMA > HMA[1] then HMA else double.nan;
CCU_I.SetDefaultColor(COLOR.GREEN);
CCU_I.SetLineWeight(1);
#======= End of mobile HMA coloring support =============================
#Hull Label
AddLabel(yes and labels and CCD_D, "HULL:SELL", color.RED);
AddLabel(yes and labels and CCU_I, "HULL:BUY", color.green);
AddLabel(yes and labels and CCU_D, "HULL:WEAK SELL", color.dark_green);
AddLabel(yes and labels and CCD_I, "HULL:WEAK BUY", color.DARK_ORANGE);
def Hull_is_buy = !IsNaN(CCD_I) or !IsNaN(CCU_I);
def Hull_is_sell = !IsNaN(CCD_D) or !IsNaN(CCU_D);
#======= End of Hull Moving Avg Calcs =================================
#============ Create Donchian Trend Ribbon values =======================================
# Donchian Trend Channel parameters
input Donchian_Channel_Period = 20; #length to calculate main trend
input DTC_Trend_Cutoff = 20; #value of sum of all trends to exceed to use for buy/sell signal
input plotDTCResult = yes;
input secondary_colors = { default yellow , green_red };
#=======================================================================
# Donchian Trend Channel calcs
# all plots have been removed leaving only the value calculations
# How it works ?
# - it calculates main trend direction by using the length that is user-defined. so you can change it as you wish
# - then it calculates trend direction for each 9 lower lengths. if you set the length = 20 then the lengths are 19, 18,...11
# - and it checks if the trend directions that came from lower lengths is same or not with main trend direction.
# - it changes the trend color of the ribbon.
# -----------------------------
def dlen = if Donchian_Channel_Period < 10 then 10 else Donchian_Channel_Period;
def na = Double.NaN;
script dchannel {
input len = 0;
def hh = Highest(high, len);
def ll = Lowest(low, len);
def trend = if BarNumber() == 1 then 0 else if close > hh[1] then 1 else if close < ll[1] then -1 else trend[1];
plot z = trend;
}
script dchannelalt {
input len = 0;
input maintrend = 0;
def hh = Highest(high, len);
def ll = Lowest(low, len);
def trend = if BarNumber() == 1 then 0 else if close > hh[1] then 1 else if close < ll[1] then -1 else trend[1];
def maincolor =
if maintrend == 1 then if trend == 1 then 2 else 1
else if maintrend == -1 then if trend == -1 then -2 else -1
else 0;
plot color = maincolor;
}
def maintrend = dchannel(dlen);
# ---------------------------------
def c01 = dchannelalt(dlen - 0, maintrend);
def c02 = dchannelalt(dlen - 1, maintrend);
def c03 = dchannelalt(dlen - 2, maintrend);
def c04 = dchannelalt(dlen - 3, maintrend);
def c05 = dchannelalt(dlen - 4, maintrend);
def c06 = dchannelalt(dlen - 5, maintrend);
def c07 = dchannelalt(dlen - 6, maintrend);
def c08 = dchannelalt(dlen - 7, maintrend);
def c09 = dchannelalt(dlen - 8, maintrend);
def c10 = dchannelalt(dlen - 9, maintrend);
# -----------------------------
# add up color numbers, to come up with a 'trend' number , 20 to -20
def colorsum = ( c01 + c02 + c03 + c04 + c05 + c06 + c07 + c08 + c09 + c10 );
# colors
# 2 - up trend - green
# 1 - up trend - dark green
# 0 no trend
# -1 - down trend - dark red
# -2 - down trend - red
def DTC_Result = if colorsum >= DTC_Trend_Cutoff then 1
else if colorsum <= -DTC_Trend_Cutoff then -1
else 0;
def seccolor;
switch (secondary_colors) {
case yellow:
seccolor = 1;
case green_red:
seccolor = 2;
}
# colors
# 2 - up trend - green
# 1 - up trend - dark green
# 0 no trend
# -1 - down trend - dark red
# -2 - down trend - red
plot DTC_Trend = if (plotDTCResult) then (0.995 * low) else na;
DTC_Trend.SetPaintingStrategy(PaintingStrategy.LINE);
DTC_Trend.SetLineWeight(3);
DTC_Trend.DefineColor("up2", Color.GREEN);
DTC_Trend.DefineColor("up1", Color.DARK_GREEN);
DTC_Trend.DefineColor("none", Color.DARK_GRAY);
DTC_Trend.DefineColor("dwn1", Color.DARK_RED);
DTC_Trend.DefineColor("dwn2", Color.RED);
DTC_Trend.DefineColor("alt1", Color.YELLOW);
DTC_Trend.AssignValueColor( if colorsum >= DTC_Trend_Cutoff then DTC_Trend.Color("up2")
else if (colorsum > 0 and colorsum < DTC_Trend_Cutoff) and seccolor == 1 then DTC_Trend.Color("alt1") else if (colorsum > 0 and colorsum < DTC_Trend_Cutoff) and seccolor == 2 then DTC_Trend.Color("up1")
else if colorsum <= -DTC_Trend_Cutoff then DTC_Trend.Color("dwn2")
else if (colorsum < 0 and colorsum > -DTC_Trend_Cutoff) and seccolor == 1 then DTC_Trend.Color("alt1") else if (colorsum < 0 and colorsum > -DTC_Trend_Cutoff) and seccolor == 2 then DTC_Trend.Color("dwn1")
else Color.GRAY);
DTC_Trend.SetHiding(!plotDTCResult);
def DTC_is_buy = if colorsum >= DTC_Trend_Cutoff then yes else no;
def DTC_is_sell = if colorsum <= -DTC_Trend_Cutoff then yes else no;
# === End of Donchian Trend Channel code ===
#Target lines
# created by chewie
#=========== Determine long stoploss, entry point, and target lines =====================
#Stop Loss = minimum point of Hull MA
def line = if IsNaN(MA_Min) then line[1] else MA_Min[0];
plot L_stoploss = if IsNaN(MA_Min) and Hull_is_buy and Long and DTC_is_buy then line else double.nan;
L_stoploss.setpaintingStrategy(paintingStrategy.LINE);
L_stoploss.setlineWeight(3);
L_stoploss.setdefaultColor(color.dark_green);
L_stoploss.hideBubble();
def LSL = (if isNaN(L_stoploss[1]) then L_stoploss else Double.NaN);
#Long Entry = final value of previous Supertrend (short)
def line4 = if IsNaN(short) then line4[1] else short[0];
plot L_Entry = if IsNaN(short) and Hull_is_buy and DTC_is_buy then line4 else double.nan;
L_Entry.setpaintingStrategy(paintingStrategy.LINE);
L_Entry.setlineWeight(3);
L_Entry.setdefaultColor(color.green);
L_Entry.hideBubble();
def LE = (if isNaN(L_Entry[1]) then L_Entry else Double.NaN);
addchartBubble(Entry_SL_Bubbles and L_stoploss, LSL,"L/SL (" + AsDollars(L_stoploss) + " : " + AsPercent((L_stoploss - L_Entry)/L_Entry) + ")",color.DARK_GREEN);
addchartBubble(Entry_SL_Bubbles and L_Entry, LE,"L/E (" + AsDollars(L_Entry) + ")",color.GREEN);
#HalfX Long
plot x1a_Long = if Targetlines and L_Entry then (L_Entry + (L_Entry - L_Stoploss)/2) else double.nan;
x1a_Long.setpaintingStrategy(paintingStrategy.dashes);
x1a_Long.setlineWeight(1);
x1a_Long.setdefaultColor(color.magenta);
x1a_Long.hideBubble();
def x1aL = (if isNaN(x1a_Long[1]) then x1a_Long else Double.NaN);
addchartBubble(Target_Bubbles and x1a_Long, x1aL,"1/2xL (" + AsDollars(x1a_Long) + " : " + AsPercent((x1a_Long - L_Entry)/L_Entry) + ")",color.magenta);
#OneX Long
plot x1_Long = if Targetlines and x1a_Long > line4 then (L_Entry +(L_Entry - L_Stoploss)) else double.nan;
x1_Long.setpaintingStrategy(paintingStrategy.dashes);
x1_Long.setlineWeight(1);
x1_Long.setdefaultColor(color.yellow);
def X1L = (if isNaN(x1_Long[1]) then x1_Long else Double.NaN);
addchartBubble(Target_Bubbles and x1_Long, x1L,"1xL (" + AsDollars(x1_Long) + " : " + AsPercent((x1_Long - L_Entry)/L_Entry) + ")",color.yellow);
#TwoX Long
plot x2_Long = if Targetlines then x1_Long + (L_Entry - L_Stoploss) else double.nan;
x2_Long.setpaintingStrategy(paintingStrategy.dashes);
x2_Long.setlineWeight(2);
x2_Long.setdefaultColor(color.light_red);
def X2L = (if isNaN(x2_Long[1]) then x2_Long else Double.NaN);
addchartBubble(Target_Bubbles and x2_Long, x2L,"2xL (" + AsDollars(x2_Long) + " : " + AsPercent((x2_Long - L_Entry)/L_Entry) + ")",color.light_red);
#ThreeX Long
plot x3_Long = if Targetlines then x2_Long + (L_Entry - L_Stoploss) else double.nan;
x3_Long.setpaintingStrategy(paintingStrategy.dashes);
x3_Long.setlineWeight(1);
x3_Long.setdefaultColor(color.cyan);
def X3L = (if isNaN(x3_Long[1]) then x3_Long else Double.NaN);
addchartBubble(Target_Bubbles and x3_Long, x3L,"3xL (" + AsDollars(x3_Long) + " : " + AsPercent((x3_Long - L_Entry)/L_Entry) + ")",color.cyan);
#FourX Long
plot x4_Long = if Targetlines then x3_Long + (L_Entry - L_Stoploss) else double.nan;
x4_Long.setpaintingStrategy(paintingStrategy.dashes);
x4_Long.setlineWeight(1);
x4_Long.setdefaultColor(color.white);
def X4L = (if isNaN(x4_Long[1]) then x4_Long else Double.NaN);
addchartBubble(Target_Bubbles and x4_Long, x4L,"4xL (" + AsDollars(x4_Long) + " : " + AsPercent((x4_Long - L_Entry)/L_Entry) + ")",color.white);
#=========== Determine short stoploss, entry point, and target lines =====================
rec line2 = if IsNaN(MA_Max) then line2[1] else MA_Max[0];
plot S_stoploss = if IsNaN(MA_MAX) and Short and Hull_is_sell and DTC_is_sell then line2 else double.nan;
S_stoploss.setpaintingStrategy(paintingStrategy.LINE);
S_stoploss.setlineWeight(3);
S_stoploss.setdefaultColor(color.dark_red);
S_stoploss.hideBubble();
def SSL = (if isNaN(S_stoploss[1]) then S_stoploss else Double.NaN);
#Short Entry
rec line3 = if IsNaN(long) then line3[1] else long[0];
plot S_Entry = if IsNaN(long) and Hull_is_sell and DTC_is_sell then line3 else double.nan;
S_Entry.setpaintingStrategy(paintingStrategy.LINE);
S_Entry.setlineWeight(3);
S_Entry.setdefaultColor(color.red);
S_Entry.hideBubble();
def SE = (if isNaN(S_Entry[1]) then S_Entry else Double.NaN);
addchartBubble(Entry_SL_Bubbles and S_stoploss, SSL,"S/SL (" + AsDollars(S_stoploss) + " : " + AsPercent((S_stoploss - S_Entry)/S_Entry) + ")",color.DARK_RED);
addchartBubble(Entry_SL_Bubbles and S_Entry, SE,"S/E (" + AsDollars(S_Entry) + ")",color.RED);
#HalfX Short
plot x1a_Short = if Targetlines and S_Entry then (S_Entry - (S_Stoploss - S_Entry)/2) else double.nan;
x1a_Short.setpaintingStrategy(paintingStrategy.dashes);
x1a_Short.setlineWeight(1);
x1a_Short.setdefaultColor(color.magenta);
x1a_Short.hideBubble();
def x1a = (if isNaN(x1a_Short[1]) then x1a_Short else Double.NaN);
addchartBubble(Target_Bubbles and x1a_Short, x1a,"1/2xS (" + AsDollars(x1a_Short) + " : " + AsPercent((x1a_Short - S_Entry)/S_Entry) + ")",color.magenta);
#OneX Short
plot x1_Short = if Targetlines and x1a_short < line3 then (S_Entry -(S_Stoploss - S_Entry)) else double.nan;
x1_Short.setpaintingStrategy(paintingStrategy.dashes);
x1_Short.setlineWeight(1);
x1_Short.setdefaultColor(color.yellow);
def X1S = (if isNaN(x1_Short[1]) then x1_Short else Double.NaN);
addchartBubble(Target_Bubbles and x1_Short, x1S,"1xS (" + AsDollars(x1_Short) + " : " + AsPercent((x1_Short - S_Entry)/S_Entry) + ")",color.yellow);
#TwoX Short
plot x2_Short = if Targetlines then x1_Short - (S_Stoploss - S_Entry) else double.nan;
x2_Short.setpaintingStrategy(paintingStrategy.dashes);
x2_Short.setlineWeight(2);
x2_Short.setdefaultColor(color.light_green);
def X2S = (if isNaN(x2_Short[1]) then x2_Short else Double.NaN);
addchartBubble(Target_Bubbles and x2_Short, x2S,"2xS (" + AsDollars(x2_Short) + " : " + AsPercent((x2_Short - S_Entry)/S_Entry) + ")",color.light_green);
#ThreeX Short
plot x3_Short = if Targetlines then x2_Short - (S_Stoploss - S_Entry) else double.nan;
x3_Short.setpaintingStrategy(paintingStrategy.dashes);
x3_Short.setlineWeight(1);
x3_Short.setdefaultColor(color.cyan);
def X3S = (if isNaN(x3_Short[1]) then x3_Short else Double.NaN);
addchartBubble(Target_Bubbles and x3_Short, x3S,"3xS (" + AsDollars(x3_Short) + " : " + AsPercent((x3_Short - S_Entry)/S_Entry) + ")",color.cyan);
#FourX Short
plot x4_Short = if Targetlines then x3_Short - (S_Stoploss - S_Entry) else double.nan;
x4_Short.setpaintingStrategy(paintingStrategy.dashes);
x4_Short.setlineWeight(1);
x4_Short.setdefaultColor(color.white);
def X4S = (if isNaN(x4_Short[1]) then x4_Short else Double.NaN);
addchartBubble(Target_Bubbles and x4_Short, x4S,"4xS (" + AsDollars(x4_Short) + " : " + AsPercent((x4_Short - S_Entry)/S_Entry) + ")",color.white);
#=================================================================
#LinearRegCh100 RegressionDivergence - Trigger Lines - Trend Cross
# From Lizard Indicators Link: https://www.lizardindicators.com/trigger-lines-cross-vs-thrust/
# Line #1 - Fast = LinReg (80)
# Line #2 - Slow = EXPEMA[LinReg (80)]
input LinRegLength = 80;
input EMAlength = 20;
input ColorOn = yes; #Color price bars based on linear reg
input ShowDynoLines = yes;
#Definitions
def price1 = close;
def displace = 0;
def LinReg = Inertia(price1[-displace], LinRegLength);
def EMA_LR = ExpAverage(LinReg[-displace], EMAlength);
def Body = (open + close)/2;
# Defining Long/Short Filters (these instructions determine entries / exits)
# Entry Requirements
def Long_Entry = close > LinReg and close > EMA_LR and body > LinReg and body > EMA_LR and close > high[1] and body > body[1];
# LinReg > LinReg[1] and
def Long_Stay_In = close > LinReg and close > EMA_LR;
def Long_Exit = (close < LinReg or close < EMA_LR) or Long_Stay_In == 0;
def Long_State = If Long_Entry then 1 else if Long_Exit then 0 else Long_State[1];
def Long1 = Long_State;
# Exit Requirements
def Short_Entry = close < LinReg and close < EMA_LR and body < LinReg and body < EMA_LR and close < low[1] and body < body[1];
# LinReg < LinReg[1] and
def Short_Stay_In = close < LinReg and close < EMA_LR;
def Short_Exit = (close > LinReg or close > EMA_LR) or Short_Stay_In == 0;
def Short_State = If Short_Entry then 1 else if Short_Exit then 0 else Short_State[1];
def Short1 = Short_State;
#Adding plot lines for Linear Regression averages
plot LR = if ShowDynoLines then LinReg else double.NaN;
LR.SetDefaultColor(CreateColor(0, 130, 255));
LR.setlineweight(1);
plot EMA_LinReg = if ShowDynoLines then EMA_LR else double.NaN;
EMA_LinReg.SetDefaultColor(CreateColor(255, 215,0));
EMA_LinReg.setlineweight(2);
#Add cloud between linear reg and EMA of lin reg lines
DefineGlobalColor("Bullish", Color.dark_Green);
DefineGlobalColor("Bearish", Color.dark_Red);
AddCloud(EMA_LinReg, LR, GlobalColor("Bearish"), GlobalColor("Bullish"));
#DYNO Label
AddLabel(yes and labels and Short1, "DYNO:BEARISH", color.RED);
AddLabel(yes and labels and Long1, "DYNO:BULLISH", color.green);
AddLabel(yes and labels and Long1 == Short1, "DYNO:NEUTRAL", color.YELLOW);
#Regression Bands
input deviations = 1.618; #set your deviation units here.
input length = 500; #set your channel lookback period here.
def stdDeviation = StDevAll(price, length);
plot HighBand = if Bands then EMA_LinReg + deviations * stdDeviation else double.nan;
HighBand.SetDefaultColor(Color.red);
plot LowBand = if Bands then EMA_LinReg - deviations * stdDeviation else double.nan;
LowBand.SetDefaultColor(Color.green);
DefineGlobalColor("Bullish", Color.light_green);
DefineGlobalColor("Bearish", Color.light_RED);
# Coloring Bars
AssignPriceColor(if ColorON and Long_State then Color.GREEN else if ColorON and Short_State then Color.RED else Color.Yellow);
#==========End Dyno / Lin Reg Section ============================
#========= Plot Long Moving Average ==============================
input lengthAvgEXP = 200;
plot AvgExp = ExpAverage(price[-displace], lengthAvgExp);
AvgExp.SetDefaultColor(Color.white);
AvgExp.setlineweight(2);
#========== End Long Moving Average =============================
###################
#
# ALERTS
#
###################
Alert(alertON and LongTrigger, "Long Entry", Alert.BAR, Sound.Ding);
Alert(alertON and ShortTrigger, "Short Entry", Alert.BAR, Sound.Ding);
Alert(alertON and Buysetup, "HULL Buy", Alert.BAR, Sound.Bell);
Alert(alertON and Sellsetup, "HULL Sell", Alert.BAR, Sound.Bell);
Alert(alertON and high > highband, "Short Band", Alert.BAR, Sound.Ding);
Alert(alertON and low < lowband, "Long Band", Alert.BAR, Sound.Ding);