이 전략은 트렌드를 결정하고 거래하기 위해 TSI, CCI 지표 및 Hull 이동 평균을 결합합니다. TSI와 CCI는 가격 파도를 식별하고 Hull MA는 트렌드 방향을 확인합니다. 수익 목표는 수익성있는 출구에 대한 긴 / 짧은 신호가 발생하면 설정됩니다.
TSI 곡선과 신호선은 계산된다. 곡선이 선을 넘어서면 긴 신호, 하향 크로스오버에서 짧은 신호. CCI는 과잉 구매 / 과잉 판매 수준을 나타냅니다. Hull MA 이상의 가격 교차는 황소 시장을 제안하고, 하위에는 곰 시장을 나타냅니다. TSI, CCI 및 Hull MA의 브레이크아웃 조건이 일치 할 때 긴 / 짧은 거래가 수행됩니다. 수익 목표가 도달되면 입장에서 빠져 나가는 것으로 설정됩니다.
위험은 지표 조정, 수익 알고리즘 최적화 등으로 줄일 수 있습니다.
이 다중 지표 전략은 수익 타겟팅으로 좋은 백테스트 결과를 보여줍니다. 매개 변수 최적화와 같은 추가 정화는 안정적인 양 거래 시스템을 만들 수 있습니다.
/*backtest start: 2023-08-18 00:00:00 end: 2023-09-17 00:00:00 period: 3h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy(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.018) long = input(title="Long Length", type=input.integer, defval=50) short = input(title="Short Length", type=input.integer, defval=50) signal = input(title="Signal Length", type=input.integer, defval=25) 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=price length= Period double_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.lime teh = ema(tsi_value*5, signal*5) > lineupper ? color.red : color.lime meh = 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 - nma sqn = round(sqrt(length)) n1 = wma(diff, sqn) cci = (p - n1) / (0.015 * dev(p, length)) c = cci > 0 ? color.lime : color.red c1 = cci > 20 ? color.lime : color.silver c2 = 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 range startDate = 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 range inDateRange = (time >= timestamp(syminfo.timezone, startYear, startMonth, startDate, 0, 0)) and (time < timestamp(syminfo.timezone, endYear, endMonth, endDate, 0, 0)) LongProfitPercent=input(0.5) ShortProfitPercent=input(0.5) LP=(LongProfitPercent/100)+1 SP=(ShortProfitPercent/100)+1 LongProfitSource=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>0 shortCondition = TSI1<TSI2 and hullma_smoothed>price and cci<0 if (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)