TSI 지표 CCI 지표 Hall 이동 평균 거래 전략


생성 날짜: 2023-09-18 17:17:52 마지막으로 수정됨: 2023-09-18 17:17:52
복사: 4 클릭수: 847
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

개요

이 전략은 TSI 지표, CCI 지표, 그리고 홀 이동 평균의 조합을 통해 트렌드를 판단하고 거래한다. TSI 지표와 CCI 지표는 가격 유동 경향을 식별하기 위해 사용되며, 홀 평균은 트렌드 방향을 확인하는 데 도움을 준다. 더 많은 하락 신호가 나타나면 스톱포트를 설정하여 수익을 얻습니다.

전략 원칙

TSI 지표의 곡선과 신호선을 계산하고, 지표가 신호선을 통과할 때 더 많은 신호를 발생시키고, 아래로 통과할 때 공백 신호를 낸다. 동시에 CCI 지표를 계산하여, 과매도 과매도 지역을 판단한다. 가격 상단으로 홀 평평선을 통과하면 더 많은 시장을 촉구하고, 아래로 공백 시장을 통과한다.

우위 분석

  • TSI 지표는 트렌드 방향을 판단하는 능력이 강합니다.
  • CCI 지표는 과매매 현상을 효과적으로 식별할 수 있습니다.
  • 홀 평선 필터 가짜 돌파, 신호 품질을 향상
  • 스톱 가격 설정, 수익을 극대화 할 때 탈퇴
  • 다양한 지표들을 통합하여 전략적 안정성을 강화합니다.

위험 분석

  • TSI, CCI 등 지표의 부진
  • 홀 평행선은 전환점을 완벽하게 판단하지 못합니다.
  • 가격 전환 시점을 정확히 판단할 수 없습니다.
  • 오작동 설정은 수익을 줄일 수 있습니다.

지표 매개 변수 조정, 정지 알고리즘 최적화 등으로 위험을 줄일 수 있다.

최적화 방향

  • 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)