still having problems getting this one set up as a scan. tried to copy paste the entire text from about but still receiving a too complex error "com.devexperts.tos.thinkscript.runtime.TooComplexException: The complexity of the expression suggests that it may not be reliable with real-time data."@chewie76 @AnimalMother The following step-by-step outlines how to successfully create a scan when TOS says "it's too complex to scan"...
Below is a sample excerpt of the conversion:
- Open the Hull SuperTrend System code in your preferred text editor
- Change all "plots" to "def" (except if part of a Script or an Input)
- Delete all corresponding plot formatting code
- Add desired Scan Query using plot statement
#200 DAY MOVING AVERAGEdef price1 = close;def displace = 0;input lengthAvgEXP = 200;Delete the plot and replace with defplotdef AvgExp = ExpAverage(price1[-displace], lengthAvgExp);Delete all plot formatting codeAvgExp.SetDefaultColor(Color.white);AvgExp.setlineweight(2);Add desired Scan Queryplot bullscan = close > open and close > AvgExp and AvgExp > AvgExp[1];#plot bearscan = close < open and close < AvgExp and AvgExp < AvgExp[1];
Complete conversion of Chewie's SuperTrend/Hull Average/Donchian Trend Ribbon Trading System:
Rich (BB code):# filename: Hull_SuperTrend_System_SCAN #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 #input Target_Bubbles = yes; #input Entry_SL_Bubbles = yes; #input labels = yes; #input alertON = no; input Bands = no; input EMA1 = 10; input EMA2 = 20; input AvgType = AverageType.HULL; input STAtrMult = 2.75; input nATR = 12; 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; def EMA1Val = MovAvgExponential(close, EMA1); def EMA2Val = MovAvgExponential(close, EMA2); def EMADirection = if EMA1Val > EMA2Val then 1 else if EMA1Val < EMA2Val then -1 else 0; def Long = if close > ST then ST else Double.NaN; def Short = if close < ST then ST else Double.NaN; def LongTrigger = IsNaN(Long[1]) and !IsNaN(Long); def ShortTrigger = IsNaN(Short[1]) and !IsNaN(Short); def LongDot = if LongTrigger then ST else Double.NaN; def ShortDot = if ShortTrigger then ST else Double.NaN; # # Hull Moving Average Concavity and Turning Points # # Author: Seth Urion (Mahsume) # Version: 2020-05-01 V4 # # Now with support for ToS Mobile - disabled # declare upper; input HMA_Length = 60; input lookback = 3; input arrows = no; def price = HL2; def 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; def turning_point = if concavity[1] != concavity then HMA else Double.NaN; def MA_Max = if HMA[-1] < HMA and HMA > HMA[1] then HMA else Double.NaN; def MA_Min = if HMA[-1] > HMA and HMA < HMA[1] then HMA else Double.NaN; #def BuySetup = HMA > HMA[1] and HMA[1] < HMA[2]; #def SellSetup = HMA < HMA[1] and HMA[1] > HMA[2]; #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); #sell.hide(); #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); #buy.hide(); def divergence = HMA - next_bar; ################### # # 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); #CCD_D.hide(); #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); #CCD_I.hide(); #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); #CCU_D.hide(); #plot CCU_I = if concavity == 1 and HMA > HMA[1] then HMA else Double.NaN; #CCU_I.SetDefaultColor(Color.GREEN); #CCU_I.SetLineWeight(1); #CCU_I.hide(); #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); #Target lines # created by chewie rec line = if IsNaN(MA_Min) then line[1] else MA_Min[0]; def L_stoploss = if IsNaN(MA_Min) then line else Double.NaN; def LSL = (if IsNaN(L_stoploss[1]) then L_stoploss else Double.NaN); rec line2 = if IsNaN(MA_Max) then line2[1] else MA_Max[0]; def S_stoploss = if IsNaN(MA_Max) then line2 else Double.NaN; 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]; def S_Entry = if IsNaN(Long) then line3 else Double.NaN; def SE = (if IsNaN(S_Entry[1]) then S_Entry else Double.NaN); #Long Entry rec line4 = if IsNaN(Short) then line4[1] else Short[0]; def L_Entry = if IsNaN(Short) then line4 else Double.NaN; def LE = (if IsNaN(L_Entry[1]) then L_Entry else Double.NaN); #HalfX Long def x1a_Long = (L_Entry + (L_Entry - L_stoploss) / 2) ; #OneX Long def x1_Long = if x1a_Long > line4 then (L_Entry + (L_Entry - L_stoploss)) else Double.NaN; #TwoX Long def x2_Long = x1_Long + (L_Entry - L_stoploss) ; def X2L = (if IsNaN(x2_Long[1]) then x2_Long else Double.NaN); #ThreeX Long def x3_Long = x2_Long + (L_Entry - L_stoploss) ; def X3L = (if IsNaN(x3_Long[1]) then x3_Long else Double.NaN); #FourX Long def x4_Long = x3_Long + (L_Entry - L_stoploss) ; def X4L = (if IsNaN(x4_Long[1]) then x4_Long else Double.NaN); #HalfX Short def x1a_Short = (S_Entry - (S_stoploss - S_Entry) / 2); #OneX Short def x1_Short = if x1a_Short < line3 then (S_Entry - (S_stoploss - S_Entry)) else Double.NaN; #TwoX Short def x2_Short = x1_Short - (S_stoploss - S_Entry); def X2S = (if IsNaN(x2_Short[1]) then x2_Short else Double.NaN); #ThreeX Short def x3_Short = x2_Short - (S_stoploss - S_Entry); def X3S = (if IsNaN(x3_Short[1]) then x3_Short else Double.NaN); #FourX Short def x4_Short = x3_Short - (S_stoploss - S_Entry); def X4S = (if IsNaN(x4_Short[1]) then x4_Short else Double.NaN); #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; #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 Linear Regression averages def LR = LinReg; def EMA_LinReg = EMA_LR; #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); def HighBand = if Bands then EMA_LinReg + deviations * stdDeviation else Double.NaN; def LowBand = if Bands then EMA_LinReg - deviations * stdDeviation else Double.NaN; #200 DAY MOVING AVERAGE def price1 = close; def displace = 0; input lengthAvgEXP = 200; def AvgExp = ExpAverage(price[-displace], lengthAvgEXP); AvgExp.SetDefaultColor(Color.white); AvgExp.setlineweight(2); plot bullscan = close > open and close > AvgExp and AvgExp > AvgExp[1]; #plot bearscan = close < open and close < AvgExp and AvgExp < AvgExp[1];
Rich (BB code):# filename: Donchian_Trend_Ribbon_SCAN # donchian_trend_ribbon_0e # convert - donchian trend ribbon # halcyonguy # 22-04-07 # 00e # can chg secondary colors ( 1 , -1) to yellow or diff shades # 00d # add histogram , sum of color numbers # https://usethinkscript.com/threads/convert-tradingview-donchian-trend-ribbon.10822/ # Convert Tradingview Donchian Trend Ribbon # chewie76 4/4 # Can someone convert the Donchian Trend Ribbon into TOS? # -------------------------------- # https://www.tradingview.com/script/PxLqmP8o-Donchian-Trend-Ribbon/ #I think you all know Donchian Channels . so I am not going to write about it. #https://www.tradingview.com/scripts/donchianchannels/ #With this indicator I tried to create Donchian Trend Ribbon by using Donchian Channels . # 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. # ----------------------------- #declare lower; input Donchian_Channel_Period = 20; def dlen = if Donchian_Channel_Period < 10 then 10 else Donchian_Channel_Period; input show_data_rows = yes; input show_sum_histo = yes; def na = double.nan; input secondary_colors = { default yellow , green_red }; input show_full_height_of_histogram = yes; def z = if show_full_height_of_histogram and !isnan(close) then 0 else na; 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; # plot tr = trend; } def maintrend = dchannel(dlen); # --------------------------------- # input secondary_colors = { default yellow , green_red }; 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 DefineGlobalColor("up2", color.green); DefineGlobalColor("up1", color.dark_green); DefineGlobalColor("none", color.dark_gray); DefineGlobalColor("dwn1", color.dark_red); DefineGlobalColor("dwn2", color.red); # GlobalColor("up1") DefineGlobalColor("alt1", color.yellow); # GlobalColor("alt1") #---------------------------------------- input bottom_row = 0; def rowstart = if bottom_row <> 0 then bottom_row else if ( show_data_rows and show_sum_histo ) then 25 else 0; input rowskip = 5; input square_size = 4; #plot( 5, color = dchannelalt(dlen - 0, maintrend), style = plot.style_columns, histbase= 0) def c01 = dchannelalt(dlen - 0, maintrend); def row01 = if isnan(close) then double.nan else (rowstart + ( 1 * rowskip)); def c02 = dchannelalt(dlen - 1, maintrend); def row02 = if isnan(close) then double.nan else (rowstart + ( 2 * rowskip)); def c03 = dchannelalt(dlen - 2, maintrend); def row03 = if isnan(close) then double.nan else (rowstart + ( 3 * rowskip)); def c04 = dchannelalt(dlen - 3, maintrend); def row04 = if isnan(close) then double.nan else (rowstart + ( 4 * rowskip)); def c05 = dchannelalt(dlen - 4, maintrend); def row05 = if isnan(close) then double.nan else (rowstart + ( 5 * rowskip)); def c06 = dchannelalt(dlen - 5, maintrend); def row06 = if isnan(close) then double.nan else (rowstart + ( 6 * rowskip)); def c07 = dchannelalt(dlen - 6, maintrend); def row07 = if isnan(close) then double.nan else (rowstart + ( 7 * rowskip)); def c08 = dchannelalt(dlen - 7, maintrend); def row08 = if isnan(close) then double.nan else (rowstart + ( 8 * rowskip)); def c09 = dchannelalt(dlen - 8, maintrend); def row09 = if isnan(close) then double.nan else (rowstart + ( 9 * rowskip)); def c10 = dchannelalt(dlen - 9, maintrend); def row10 = if isnan(close) then double.nan else (rowstart + ( 10 * rowskip)); # ----------------------------- # 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 ); # plot a histogram of colorsum. # it uses absvalue( ), so it is positive numbers, 0 to 20 #input vert1 = 0; + vert1 def zc = if show_sum_histo then (absvalue(colorsum)) else na; plot bullscan = colorsum >= 19; #plot bearscan = colorsum <= -19;
Hope this helps...
Good Luck and Good Trading
I had to # out several lines throughout to include the first line "
Rich (BB code):
" just to get it past the first line. Is the scan available as a shared link or in the Discord?