To make our community more profitable we decided to start a series in which we will review open-source TradingView strategies. The aim of the review is to select a strategy (or a number of strategies) from TradingView and run a reality check on it, optimise them and convert into alerts, so you can set it up as a bot on Wunderbit Trading platform.
Open-strategy source
Strategy adjustment for particular exchange, pair and timeframe
Backtest
Revised study script that you can apply in Wunderbit Trading platform for bot trading.
This week we decided to start with the 15 min CCI strategy from the user: faresg7900
You will find original strategy code here: TSI CCI Hull
IMPORTANT
This is a trend strategy and works better in the uptrend
This strategy doe not have a stop-loss so your drawdown in the position can be large
This strategy is only working for long positions
This strategy take-profit will be triggered only if the price will “close” above 0.5% of the entry price. Therefore, you do not need to set a take-profit target in Wunderbit Trading cabinet.
Applicable to FTX: BTC-PERP 15min
Variable | Value |
Long Length | 41 |
Short Length | 43 |
Signal Length | 21 |
Source | CLOSE |
Period | 26 |
Upper Line Line | 100 |
Lower Line | -100 |
LongProfitPercent | 0.5 |
ShortProfitPercent | 0.5 |
Profit Long Source | CLOSE |
Profit Short Source | CLOSE |
You can copy this code and paste it into your TradingView.
//@version=4strategy(title="TSI CCI Hull", shorttitle="TSICCIHULL", default_qty_type=strategy.percent_of_equity, default_qty_value=100, calc_on_order_fills= false, calc_on_every_tick=true, pyramiding=0, commission_type=strategy.commission.percent, commission_value=0.07)long = input(title="Long Length", type=input.integer, defval=41)short = input(title="Short Length", type=input.integer, defval=43)signal = input(title="Signal Length", type=input.integer, defval=21)price=input(title="Source",type=input.source,defval=close)Period=input(26, minval=1)lineupper = input(title="Upper Line", type=input.integer, defval=100)linelower = input(title="Lower Line", type=input.integer, defval=-100)p=pricelength= Perioddouble_smooth(src, long, short) =>fist_smooth = ema(src, long)ema(fist_smooth, short)pc = change(price)double_smoothed_pc = double_smooth(pc, long, short)double_smoothed_abs_pc = double_smooth(abs(pc), long, short)tsi_value = 100 * (double_smoothed_pc / double_smoothed_abs_pc)keh = tsi_value*5 > linelower ? color.red : color.limeteh = ema(tsi_value*5, signal*5) > lineupper ? color.red : color.limemeh = ema(tsi_value*5, signal*5) > tsi_value*5 ? color.red : color.limei1=plot(tsi_value*5, title="TSI Value", color=color.black, linewidth=1,transp=100)i2=plot(ema(tsi_value*5, signal*5), title="TSI Signal", color=color.black, linewidth=1,transp=100)fill(i1,i2,color=meh,transp=85)plot(cross(tsi_value*5, ema(tsi_value*5, signal*5)) ? tsi_value*5 : na, style=plot.style_circles, color=color.black, linewidth=10)plot(cross(tsi_value*5, ema(tsi_value*5, signal*5)) ? tsi_value*5 : na, style=plot.style_circles, color=color.white, linewidth=8,transp=0)plot(cross(tsi_value*5, ema(tsi_value*5, signal*5)) ? tsi_value*5 : na, style=plot.style_circles, color=meh, linewidth=5)n2ma = 2 * wma(p, round(length / 2))nma = wma(p, length)diff = n2ma - nmasqn = round(sqrt(length))n1 = wma(diff, sqn)cci = (p - n1) / (0.015 * dev(p, length))c = cci > 0 ? color.lime : color.redc1 = cci > 20 ? color.lime : color.silverc2 = cci < -20 ? color.red : color.silvercc=plot(cci, color=c, title="CCI Line", linewidth=2)cc2=plot(cci[1], color=color.gray, linewidth=1,transp=100)fill(cc,cc2,color=c,transp=85)plot(cross(20, cci) ? 20 : na, style=plot.style_cross,title="CCI cross UP", color=c1, linewidth=2,transp=100,offset=-2)plot(cross(-20, cci) ? -20 : na, style=plot.style_cross,title="CCI cross down", color=c2, linewidth=2,transp=100,offset=-2)TSI1=ema(tsi_value*5, signal*5)TSI2=ema(tsi_value*5, signal*5)[2]hullma_smoothed = wma(2*wma(n1, Period/2)-wma(n1, Period), round(sqrt(Period)))//plot(hullma_smoothed*200)// Make input options that configure backtest date rangestartDate = input(title="Start Date", type=input.integer,defval=1, minval=1, maxval=31)startMonth = input(title="Start Month", type=input.integer,defval=1, minval=1, maxval=12)startYear = input(title="Start Year", type=input.integer,defval=2018, minval=1800, maxval=2100)endDate = input(title="End Date", type=input.integer,defval=1, minval=1, maxval=31)endMonth = input(title="End Month", type=input.integer,defval=7, minval=1, maxval=12)endYear = input(title="End Year", type=input.integer,defval=9999, minval=1800, maxval=2100)// Look if the close time of the current bar// falls inside the date rangeinDateRange = (time >= timestamp(syminfo.timezone, startYear,startMonth, startDate, 0, 0)) and(time < timestamp(syminfo.timezone, endYear, endMonth, endDate, 0, 0))LongProfitPercent=input(0.5, step=0.1)ShortProfitPercent=input(0.5,step=0.1)LP=(LongProfitPercent/100)+1SP=(ShortProfitPercent/100)+1LongProfitSource=input(title="profit long source",type=input.source,defval=close)ShortProfitSource=input(title="profit short source",type=input.source,defval=close)longCondition = TSI1>TSI2 and hullma_smoothed<price and cci>0shortCondition = TSI1<TSI2 and hullma_smoothed>price and cci<0if (longCondition and cci>cci[1] and cci > 0 and n1>n1[1] and inDateRange)strategy.entry("buy", strategy.long)strategy.close("buy", when = shortCondition and cci<cci[1] and cci < 0 and n1<n1[1] or LongProfitSource>strategy.position_avg_price*LP and inDateRange)// if (shortCondition and cci<cci[1] and cci < 0 and n1<n1[1] and inDateRange)// strategy.entry("sell", strategy.short)// strategy.close("sell", when = longCondition and cci>cci[1] and cci > 0 and n1>n1[1] or ShortProfitSource<strategy.position_avg_price/SP and inDateRange)
You can copy this code and paste it into your TradingView.
//@version=4study(title="TSI CCI Hull", overlay=true)long = input(title="Long Length", type=input.integer, defval=41)short = input(title="Short Length", type=input.integer, defval=43)signal = input(title="Signal Length", type=input.integer, defval=21)price=input(title="Source",type=input.source,defval=close)Period=input(26, minval=1)lineupper = input(title="Upper Line", type=input.integer, defval=100)linelower = input(title="Lower Line", type=input.integer, defval=-100)p=pricelength= Perioddouble_smooth(src, long, short) =>fist_smooth = ema(src, long)ema(fist_smooth, short)pc = change(price)double_smoothed_pc = double_smooth(pc, long, short)double_smoothed_abs_pc = double_smooth(abs(pc), long, short)tsi_value = 100 * (double_smoothed_pc / double_smoothed_abs_pc)keh = tsi_value*5 > linelower ? color.red : color.limeteh = ema(tsi_value*5, signal*5) > lineupper ? color.red : color.limemeh = ema(tsi_value*5, signal*5) > tsi_value*5 ? color.red : color.lime// i1=plot(tsi_value*5, title="TSI Value", color=color.black, linewidth=1,transp=100)// i2=plot(ema(tsi_value*5, signal*5), title="TSI Signal", color=color.black, linewidth=1,transp=100)// fill(i1,i2,color=meh,transp=85)// plot(cross(tsi_value*5, ema(tsi_value*5, signal*5)) ? tsi_value*5 : na, style=plot.style_circles, color=color.black, linewidth=10)// plot(cross(tsi_value*5, ema(tsi_value*5, signal*5)) ? tsi_value*5 : na, style=plot.style_circles, color=color.white, linewidth=8,transp=0)// plot(cross(tsi_value*5, ema(tsi_value*5, signal*5)) ? tsi_value*5 : na, style=plot.style_circles, color=meh, linewidth=5)n2ma = 2 * wma(p, round(length / 2))nma = wma(p, length)diff = n2ma - nmasqn = round(sqrt(length))n1 = wma(diff, sqn)cci = (p - n1) / (0.015 * dev(p, length))c = cci > 0 ? color.lime : color.redc1 = cci > 20 ? color.lime : color.silverc2 = cci < -20 ? color.red : color.silver// cc=plot(cci, color=c, title="CCI Line", linewidth=2)// cc2=plot(cci[1], color=color.gray, linewidth=1,transp=100)// fill(cc,cc2,color=c,transp=85)// plot(cross(20, cci) ? 20 : na, style=plot.style_cross,title="CCI cross UP", color=c1, linewidth=2,transp=100,offset=-2)// plot(cross(-20, cci) ? -20 : na, style=plot.style_cross,title="CCI cross down", color=c2, linewidth=2,transp=100,offset=-2)TSI1=ema(tsi_value*5, signal*5)TSI2=ema(tsi_value*5, signal*5)[2]hullma_smoothed = wma(2*wma(n1, Period/2)-wma(n1, Period), round(sqrt(Period)))//plot(hullma_smoothed*200)// Make input options that configure backtest date rangestartDate = input(title="Start Date", type=input.integer,defval=1, minval=1, maxval=31)startMonth = input(title="Start Month", type=input.integer,defval=1, minval=1, maxval=12)startYear = input(title="Start Year", type=input.integer,defval=2018, minval=1800, maxval=2100)endDate = input(title="End Date", type=input.integer,defval=1, minval=1, maxval=31)endMonth = input(title="End Month", type=input.integer,defval=7, minval=1, maxval=12)endYear = input(title="End Year", type=input.integer,defval=9999, minval=1800, maxval=2100)// Look if the close time of the current bar// falls inside the date rangeinDateRange = (time >= timestamp(syminfo.timezone, startYear,startMonth, startDate, 0, 0)) and(time < timestamp(syminfo.timezone, endYear, endMonth, endDate, 0, 0))LongProfitPercent=input(0.5, step=0.1)ShortProfitPercent=input(0.5,step=0.1)LP=(LongProfitPercent/100)+1SP=(ShortProfitPercent/100)+1LongProfitSource=input(title="profit long source",type=input.source,defval=close)ShortProfitSource=input(title="profit short source",type=input.source,defval=close)longCondition = TSI1>TSI2 and hullma_smoothed<price and cci>0shortCondition = TSI1<TSI2 and hullma_smoothed>price and cci<0isEntry_Long = falseisEntry_Long := nz(isEntry_Long[1], false)isExit_Long = falseisExit_Long := nz(isExit_Long[1], false)entry_long= not isEntry_Long and (longCondition and cci>0 and cci>cci[1] and cci > 0 and n1>n1[1] and inDateRange)entry_value=valuewhen(entry_long,close,0)take_profit=entry_value*LPexit_long= not isExit_Long and (shortCondition and cci<cci[1] and cci < 0 and n1<n1[1] or close>take_profit and inDateRange)if (entry_long)isEntry_Long := trueisExit_Long := falseif (exit_long)isEntry_Long := falseisExit_Long := truealertcondition(entry_long, title="Enter Long")alertcondition(exit_long, title="Exit Long")plotshape(series=entry_long, text="BUY", style=shape.triangleup, location=location.belowbar, color=color.green, size=size.small)plotshape(series=exit_long, text="EXIT BUY",style=shape.triangledown, location=location.abovebar, color=color.purple, size=size.small)