Repaints Chewie's Super Trend, Hull Average, Donchian Trend Ribbon Trading System for ThinkorSwim

Repaints
I got the DTR code from this thread here on useThinkScript: https://usethinkscript.com/threads/donchian-trend-ribbon-for-thinkorswim.10861/

Keep in mind that if you use my version of Chewie's script in the upper chart, the DTR summary line will only match the lower study if you use the default value (20) for the "dtc trend cutoff" input parameter. Changing this value will make the summary line not match the lower study (since that code doesn't have an input to change what it considers the buy/sell range).

Thanks for the feedback, too.
Thanks for the quick reply!
 
I got the DTR code from this thread here on useThinkScript: https://usethinkscript.com/threads/donchian-trend-ribbon-for-thinkorswim.10861/

Keep in mind that if you use my version of Chewie's script in the upper chart, the DTR summary line will only match the lower study if you use the default value (20) for the "dtc trend cutoff" input parameter. Changing this value will make the summary line not match the lower study (since that code doesn't have an input to change what it considers the buy/sell range).

Thanks for the feedback, too.
Looking at ES futures tonight on your version, 2m tf, between 6:22pm and 6:24pm CDT, there was SE entry signal, but no short targets ever printed. Looks like everything aligned. Am I missing something? Thanks
 
Looking at ES futures tonight on your version, 2m tf, between 6:22pm and 6:24pm CDT, there was SE entry signal, but no short targets ever printed. Looks like everything aligned. Am I missing something? Thanks
Interesting. Basically, it's a weird case where the stop loss line for the short (which is based on the HMA max) is actually lower than the short entry line (which is based on the last supertrend value before ST flipped to a short indication). The script actually drew in the 1/2x line above the short entry, which is the wrong direction but that calculation is based on the difference between the entry and stop loss lines, so it's right for what the script is seeing here.

Chewie's original script does the same thing at that time...
m0amy4K.png


I'll have to think about if there's anything that can be done in those cases. At the very least, maybe just ignore the signal if the entry and stop loss values are inverted from the way they would be expected for whichever direction the trade is supposed to happen.
 
Interesting. Basically, it's a weird case where the stop loss line for the short (which is based on the HMA max) is actually lower than the short entry line (which is based on the last supertrend value before ST flipped to a short indication). The script actually drew in the 1/2x line above the short entry, which is the wrong direction but that calculation is based on the difference between the entry and stop loss lines, so it's right for what the script is seeing here.

Chewie's original script does the same thing at that time...
m0amy4K.png


I'll have to think about if there's anything that can be done in those cases. At the very least, maybe just ignore the signal if the entry and stop loss values are inverted from the way they would be expected for whichever direction the trade is supposed to happen.

Ok, I like what you've done here. Great! Also, the other lines of code you grayed out are not needed. I think it was from aspects of other indicators that didn't add value to this strategy and I didn't remove them completely. Thanks.
I was wondering if there is a way to display (put a label) the distance between the Entry Line and Stop-Loss Line in percentage and Price. Doing this would certainly help eliminate taking trades that has poor risk to reward. Any thoughts??
 
Interesting. Basically, it's a weird case where the stop loss line for the short (which is based on the HMA max) is actually lower than the short entry line (which is based on the last supertrend value before ST flipped to a short indication). The script actually drew in the 1/2x line above the short entry, which is the wrong direction but that calculation is based on the difference between the entry and stop loss lines, so it's right for what the script is seeing here.

Chewie's original script does the same thing at that time...
m0amy4K.png


I'll have to think about if there's anything that can be done in those cases. At the very least, maybe just ignore the signal if the entry and stop loss values are inverted from the way they would be expected for whichever direction the trade is supposed to happen.
Thank you for the explanation. Makes sense. Just looked kind of weird and it actually wound up being a decent short of about 10 points.
I'm not a coder, but hoping you can come up with an adjustment. If not, I'll take you up on your advice! Thanks again.

FOLLOW UP OBSERVATION: August 23, 2022

Watching ES ETH into RTH open, a nice long setup occurred I had both original and your setup side by side with a 2m tf on both. Both charts showed a long ATR change at the same time 8:28a CDT. Big difference so far is the original showed the Long Entry line, but the revised did not until criteria was met. By the time the LE line was formed, the move was above both 1/2x and 1x long targets. Is there a way to show the "potential" LE or SE line as appropriate so one could prepare for entry? In this case, ES was oversold and a logical bounce play was in order. Thanks again!!
 
Last edited:
I was wondering if there is a way to display (put a label) the distance between the Entry Line and Stop-Loss Line in percentage and Price. Doing this would certainly help eliminate taking trades that has poor risk to reward. Any thoughts??
I updated the code in my original post to display the price level of the entry and price level and percentage change (relative to the entry price) for the stop loss and target lines.
 
Thank you for the explanation. Makes sense. Just looked kind of weird and it actually wound up being a decent short of about 10 points.
I'm not a coder, but hoping you can come up with an adjustment. If not, I'll take you up on your advice! Thanks again.

FOLLOW UP OBSERVATION: August 23, 2022

Watching ES ETH into RTH open, a nice long setup occurred I had both original and your setup side by side with a 2m tf on both. Both charts showed a long ATR change at the same time 8:28a CDT. Big difference so far is the original showed the Long Entry line, but the revised did not until criteria was met. By the time the LE line was formed, the move was above both 1/2x and 1x long targets. Is there a way to show the "potential" LE or SE line as appropriate so one could prepare for entry? In this case, ES was oversold and a logical bounce play was in order. Thanks again!!
Adding the "potential" entry line would be exactly counter to the reason I made to changes that I did to the script. The whole point of my modification was to make sure that all of the lines (entry, stop loss and targets) only showed up when all three of Chewie's trade constraints were met (looks like the Donchian was the culprit today, since the Supertrend had already turned and the HMA hit its minimum just before market open). You can add it manually - the entry line is just the endpoint of the previous phase of the Supertrend. Keep a price level drawing object on the chart and move it when the Supertrend flips?
 
Adding the "potential" entry line would be exactly counter to the reason I made to changes that I did to the script. The whole point of my modification was to make sure that all of the lines (entry, stop loss and targets) only showed up when all three of Chewie's trade constraints were met (looks like the Donchian was the culprit today, since the Supertrend had already turned and the HMA hit its minimum just before market open). You can add it manually - the entry line is just the endpoint of the previous phase of the Supertrend. Keep a price level drawing object on the chart and move it when the Supertrend flips?
I completely understand and appreciate all your efforts. Great idea on the price level line for flips.

Not being a pain here, but when the conditions are met, no matter what tf one is using, it's actually misleading when the LE or SE shows up due to the lag time when all criteria are met. I just watched ES on 4m tf and SE showed up on the 10:00am CDT candle.
Thanks again. I'll work with the manual price lines for potential moves.
 
I updated the code in my original post to display the price level of the entry and price level and percentage change (relative to the entry price) for the stop loss and target lines


That's Amazing!!! Thank you for updating the code. One thing is that the chart looks really crowded the moment. Would it be possible to update the script where it only shows the most recent signals? Thank you in advance!!!
 
I completely understand and appreciate all your efforts. Great idea on the price level line for flips.

Not being a pain here, but when the conditions are met, no matter what tf one is using, it's actually misleading when the LE or SE shows up due to the lag time when all criteria are met. I just watched ES on 4m tf and SE showed up on the 10:00am CDT candle.
Thanks again. I'll work with the manual price lines for potential moves.
It depends on which indicator the system is waiting for. If the other two are ready and the HMA min/max is the last one to signal, the lines will lag by a candle because of the way the HMA min/max is calculated. The code doesn't know if it's a min or max until the bar after it happens (how do you know the curve has rolled over until you see the rollover). This is what you saw at 10:00a - the Supertrend was already in "Sell" mode, the Donchian flipped to red on the 10:00a candle. The HMA hit its peak on the 9:56a candle, but the code can't know that until 10:00a when it sees the average drop from the previous point.

If the HMA has already turned, the lines will show up as soon as the other two are good. See the ES 2m today. HMA had put in a max at 12:44p CDT, but the other two hadn't given a corresponding signal yet. Both the Supertrend and Donchian flipped at 12:50p and the entry and target lines start drawing immediately from that point.
 
It depends on which indicator the system is waiting for. If the other two are ready and the HMA min/max is the last one to signal, the lines will lag by a candle because of the way the HMA min/max is calculated. The code doesn't know if it's a min or max until the bar after it happens (how do you know the curve has rolled over until you see the rollover). This is what you saw at 10:00a - the Supertrend was already in "Sell" mode, the Donchian flipped to red on the 10:00a candle. The HMA hit its peak on the 9:56a candle, but the code can't know that until 10:00a when it sees the average drop from the previous point.

If the HMA has already turned, the lines will show up as soon as the other two are good. See the ES 2m today. HMA had put in a max at 12:44p CDT, but the other two hadn't given a corresponding signal yet. Both the Supertrend and Donchian flipped at 12:50p and the entry and target lines start drawing immediately from that point.
Thanks for the detailed info and explanation. You've done a truly outstanding job here! Nice to know these details of what's happening with the coding!! (y)
 
I updated the code in my original post to display the price level of the entry and price level and percentage change (relative to the entry price) for the stop loss and target lines.
I like that chart bubble. I made another addition. When you enter the Dollar input as how many dollars is equal to one point in your trading, it will auto calculate how much money your are risking and how much money you would make for each target hit. check it out. http://tos.mx/LXMDMg8
 
I like that chart bubble. I made another addition. When you enter the Dollar input as how many dollars is equal to one point in your trading, it will auto calculate how much money your are risking and how much money you would make for each target hit. check it out. http://tos.mx/LXMDMg8
Thanks Chewie. Can you explain what you mean by "the Dollar input as how many dollars is equal to one point in your trading"? I'm fairly new to the intraday trading thing, so don't quite understand that. I'll incorporate your updates into my code so we keep a common code base.

Other question, since this is your system... I thought that the issue that rfb found (inverted entry and stop loss lines) would be a pretty rare thing, but there's another instance today (ES 2m chart at 11:04a). So, one approach I thought of to handle it would be to check the entry and stop loss values for each direction (long / short). If they are inverted/backwards, flip the values that are used for each line. So, that would make the HMA min/max the entry (instead of SL) and the previous Supertrend value the SL (instead of the entry), but only for that signal. That would put the entry and SL in the right place relative to each other and allow the target lines to be calculated. Thoughts?
 
Thanks Chewie. Can you explain what you mean by "the Dollar input as how many dollars is equal to one point in your trading"? I'm fairly new to the intraday trading thing, so don't quite understand that. I'll incorporate your updates into my code so we keep a common code base.

Other question, since this is your system... I thought that the issue that rfb found (inverted entry and stop loss lines) would be a pretty rare thing, but there's another instance today (ES 2m chart at 11:04a). So, one approach I thought of to handle it would be to check the entry and stop loss values for each direction (long / short). If they are inverted/backwards, flip the values that are used for each line. So, that would make the HMA min/max the entry (instead of SL) and the previous Supertrend value the SL (instead of the entry), but only for that signal. That would put the entry and SL in the right place relative to each other and allow the target lines to be calculated. Thoughts?
"Quantity" is the number of contracts, or number of shares. This will calculate the amount of risk and reward automatically when you enter a value.
As for the issue, I recognized that, but sadly, I was not sure how to get the code written to fix it. I was able to fix all of the other lines, just not that one. If you can fix it, have at it. For all of the SHORT target lines, I added a ,0 after the color of the chart bubble so that the bubble prints below the line. I found this to be easier to see the price.

Here is an example. NQ with one contract. If you enter long at the L/E, you would get $119 at 1/2 target and $238 at the 1X target. Risking $238 at Stoploss.

 
Last edited:
6Og7rXF.png

Okay did some tweaks to the 2 minute, Hull 55, ATR 2.25.

Added the RSIL Laguerre indicator for confirmation / being able to stay in the trades longer after 1-4x profit targets. Notice, $VOLD and $ADD donchian green, all 3 confirmations on Chewie's system, RSIL is sloping upwards then pins at the top, along with lower donchian being Cyan (major buying pressure) and the move skyrockets with 0 indication to get out or even stress about your trade. Obviously hindsight though.

Back tested it over 30 days and it seems to work wonders on /ES and /NQ.

Clearly a handpicked example, but it is incredible on just about every entry once all confirmations line up.

Thanks again @chewie76.

Would it be possible to get the code for the lower donchian (cyan/magenta)?
 
Greetings all. I like the overall approach of Chewie's script, but, to be honest, the original version presented in the original post is a bit "busy" to me. There are also a few things that I consider glitches - primarily the way the entry lines and target lines didn't align. So, I wanted to offer an updated script that kept the spirit of Chewie's method but simplified the presentation some.

I've made the following changes to the code:
1) Added Donchian Trend Channel code. Item 2.2 in Chewie's OP says the Donchian Trend Ribbon should be red or green in the direction of your trade. I had already created code that generated a summary value of the DTR to use in an upper study, so I move that to this script. There are several inputs associated with this code:
  • Donchian_Channel_Period = 20; #length to calculate main trend - regular input from the lower study
  • secondary_colors = { default yellow , green_red } - regular input from the lower study
  • DTC_Trend_Cutoff = 20 - the summary code adds up the color values of each of the DTR lengths. This value is the limit of that summation used to determine if the trend is green, yellow (neutral) or red. A value of 20 means the entire trend ribbon has to be the same color. Lower values allow some yellow values to be included. Experiment with the values to see what works for you.
  • plotDTCResult = yes - turns the plot of the summary line on or off. Mostly used for debugging my code. If you're looking for the cleanest chart, set to "No".
2) Added constraints to drawing target lines based on HMA, Supertrend and DTC. Per Chewie's OP, all three of these indicators should be in buy or sell mode before entering the trade. So, I made it so that the entry and target lines won't appear unless that's true.
3) Added ability to remove drawing the Dyno lines and cloud (label and price bar coloring remain). The Dyno lines didn't seem to be used in determining buy/sell conditions, so I just added an input to allow you to turn off the plot of the lines/cloud to clean up the chart.
4) Commented out some code that didn't appear to be doing anything. Looks like it might have been left over from a previous iteration of the code (leaving in for Chewie to evaluate if it's actually needed - see lines 36-37, 54-58 and 150).
5) Made entry and target lines all start/end at the same place. Just some cleanup to the code so that all of these lines appear consistently.
6) Some general cleanup and rearranging (no effect to output)

Here's the updated script:
Code:
#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);


EDITS:
8/18/22 - original version posted
8/23/22 - code updated to add price level and % change (relative to entry price) for the stop loss and target lines
I was wondering if there is a way to view only the most recent targets, just to keep chart looking much cleaner.
 

Join useThinkScript to post your question to a community of 21,000+ developers and traders.

Not the exact question you're looking for?

Start a new thread and receive assistance from our community.

87k+ Posts
326 Online
Create Post

The Market Trading Game Changer

Join 2,500+ subscribers inside the useThinkScript VIP Membership Club
  • Exclusive indicators
  • Proven strategies & setups
  • Private Discord community
  • ‘Buy The Dip’ signal alerts
  • Exclusive members-only content
  • Add-ons and resources
  • 1 full year of unlimited support

Frequently Asked Questions

What is useThinkScript?

useThinkScript is the #1 community of stock market investors using indicators and other tools to power their trading strategies. Traders of all skill levels use our forums to learn about scripting and indicators, help each other, and discover new ways to gain an edge in the markets.

How do I get started?

We get it. Our forum can be intimidating, if not overwhelming. With thousands of topics, tens of thousands of posts, our community has created an incredibly deep knowledge base for stock traders. No one can ever exhaust every resource provided on our site.

If you are new, or just looking for guidance, here are some helpful links to get you started.

What are the benefits of VIP Membership?
VIP members get exclusive access to these proven and tested premium indicators: Buy the Dip, Advanced Market Moves 2.0, Take Profit, and Volatility Trading Range. In addition, VIP members get access to over 50 VIP-only custom indicators, add-ons, and strategies, private VIP-only forums, private Discord channel to discuss trades and strategies in real-time, customer support, trade alerts, and much more. Learn all about VIP membership here.
How can I access the premium indicators?
To access the premium indicators, which are plug and play ready, sign up for VIP membership here.
Back
Top