Hull CCI TSI 이동평균 거래 전략

저자:차오장, 날짜: 2023-09-18 17:17:52
태그:

전반적인 설명

이 전략은 트렌드를 결정하고 거래하기 위해 TSI, CCI 지표 및 Hull 이동 평균을 결합합니다. TSI와 CCI는 가격 파도를 식별하고 Hull MA는 트렌드 방향을 확인합니다. 수익 목표는 수익성있는 출구에 대한 긴 / 짧은 신호가 발생하면 설정됩니다.

전략 논리

TSI 곡선과 신호선은 계산된다. 곡선이 선을 넘어서면 긴 신호, 하향 크로스오버에서 짧은 신호. CCI는 과잉 구매 / 과잉 판매 수준을 나타냅니다. Hull MA 이상의 가격 교차는 황소 시장을 제안하고, 하위에는 곰 시장을 나타냅니다. TSI, CCI 및 Hull MA의 브레이크아웃 조건이 일치 할 때 긴 / 짧은 거래가 수행됩니다. 수익 목표가 도달되면 입장에서 빠져 나가는 것으로 설정됩니다.

장점

  • TSI는 유행 방향을 명확히 밝히고 있습니다.
  • CCI는 과잉 구매/ 과잉 판매를 효과적으로 감지합니다.
  • 배체 MA는 잘못된 신호를 필터링하여 신호를 개선합니다.
  • 이윤 목표가 최고 수익률에서 탈퇴 할 수 있습니다.
  • 여러 지표를 결합하면 안정성이 향상됩니다.

위험성

  • TSI, CCI 및 다른 지표에서 지연이 존재합니다.
  • 헬스 MA는 전환점을 완벽하게 결정할 수 없습니다.
  • 정확한 가격 전환 시기는 정확하게 결정할 수 없습니다.
  • 수익 목표가 제대로 설정되지 않은 경우 수익 잠재력이 부족할 위험이 있습니다.

위험은 지표 조정, 수익 알고리즘 최적화 등으로 줄일 수 있습니다.

개선

  • 감수성을 향상시키기 위한 시험 TSI/CCI 조합
  • 역동적/후속 수익 목표가 고려됩니다.
  • 반전을 결정하기 위해 다른 지표를 추가합니다.
  • 내구성을 높이기 위해 다양한 제품을 테스트합니다

결론

이 다중 지표 전략은 수익 타겟팅으로 좋은 백테스트 결과를 보여줍니다. 매개 변수 최적화와 같은 추가 정화는 안정적인 양 거래 시스템을 만들 수 있습니다.


/*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)

더 많은