다중 시간 프레임 이동 평균 시스템 거래 전략

저자:차오장, 날짜: 2023-12-12 16:07:18
태그:

img

전반적인 설명

이 전략은 다중 시간 프레임 이동 평균 시스템을 채택하고, RSI 및 다른 기술적 지표와 결합하여 긴 위치와 짧은 위치 사이의 자동 전환을 달성합니다. 전략 이름은 다중 시간 프레임 이동 평균 시스템 거래 전략입니다. 주요 아이디어는 다른 기간 동안 가격 추세를 비교하여 더 신뢰할 수있는 거래 신호를 생성하는 것입니다.

원칙

이 전략의 핵심 지표는 이동 평균 시스템이다. 전략은 JMA, TEMA, DEMA와 같은 여러 이동 평균 지표를 사용하여 15min, 30min, 60min과 같은 다른 기간 동안 가격 추세를 계산합니다. 예를 들어, 15min 시간 프레임에서 JMA에 의해 계산된 MA 추세는 그 시간 프레임 내의 가격 추세 판단을 나타냅니다. 그 다음 전략은 더 긴 추세와 짧은 추세 사이의 오차를 식별하기 위해 다른 시간 프레임 간의 가격 추세를 비교합니다. 상당한 오차가 감지되면 거래 신호가 생성됩니다. 또한 전략은 거래 신호의 신뢰성을 보장하기 위해 RSI 및 웨이브 트렌드와 같은 다른 지표를 포함합니다.

구체적으로, 전략의 트렌드, 트렌드2 및 트렌드3 변수는 각각 15분, 30분 및 60분 시간 프레임의 가격 트렌드를 나타냅니다. 30분 및 60분이 아직 반전되지 않은 동안 15분 가격 반전이 발생하면 짧은 트렌드와 긴 트렌드 사이의 오차로 판단되며, 따라서 거래 신호를 생성합니다. 모든 시간 프레임의 트렌드가 일관성있는 경우 신호가 생성되지 않습니다.

여러 시간 프레임 간의 관계를 비교하고 일부 잘못된 신호를 필터링함으로써 더 신뢰할 수있는 거래 신호를 생성 할 수 있습니다. 이것이 전략의 핵심 아이디어입니다.

이점 분석

이 전략의 주요 장점은 다음과 같습니다.

  1. 여러 시간 프레임 분석과 거짓 신호 필터링을 통해 신호 신뢰성을 향상시킵니다.
  2. 종합적인 판단을 위해 여러 지표를 결합함으로써 단일 지표로 문제를 피하는 것
  3. 수동 개입 없이 긴 위치와 짧은 위치 사이의 자동 전환, 운영의 어려움을 줄입니다.

위험 분석

이 전략에는 몇 가지 위험이 있습니다.

  1. 다중 시간 프레임 분석은 거래 입시 시점에 대한 불확실성을 도입하여 최고의 입시 가격을 놓칠 수 있습니다.
  2. 여러 지표를 조합할 때 적절하지 않은 매개 변수 설정은 거래 신호 품질의 악화로 이어질 수 있습니다.
  3. 자동적인 위치 전환은 과도한 최적화와 백테스트에 비해 실전 거래 성능이 약해질 위험이 있습니다.

우리는 위 위험을 줄이기 위해 다음 조치를 취할 수 있습니다.

  1. 시간 프레임 매개 변수를 세밀하게 조정하여 적시에 입력하기 위해 단기 신호를 캡처하는 것을 보장합니다.
  2. 지속적으로 지표 매개 변수를 최적화하기 위한 광범위한 백트테스팅
  3. 자동화된 시스템으로 맹목적 거래를 방지하기 위해 실제 거래에 합리적인 개입.

최적화 방향

이 전략은 더 이상 최적화 할 수 있습니다.

  1. 모델 트레이닝을 통해 여러 지표에서 매개 변수를 자동 최적화하기 위한 기계 학습 알고리즘을 도입한다.
  2. 실제 거래 성과를 향상시키기 위해 시장 변동성 수준에 기반한 적응성 미끄러짐 설정을 추가합니다.
  3. 급속한 트렌드 역전으로 인한 손실을 피하기 위해 가격-용량 확인 메커니즘을 포함합니다.

결론

이 전략은 다중 시간 프레임 가격 트렌드를 비교하여 장기간 대 단기 관계를 식별하고 여러 지표를 분석하여 거래 신호를 생성합니다. 좋은 백테스트 결과로 장기 및 단위 사이의 자동 전환을 달성합니다. 또한 실제 거래 성과를 더욱 향상시키기 위해 기계 학습, 적응성 미끄러짐 및 볼륨 확인과 같은 방법을 통해 개선 할 수있는 몇 가지 영역을 확인했습니다.


/*backtest
start: 2023-11-11 00:00:00
end: 2023-12-11 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
strategy("Drexel Strategy", overlay=true )
Length1=7
Length2=9
Multiplier=input(1.5,"Multiplier")
jma(src,length) =>
    beta = 0.45*(length-1)/(0.45*(length-1)+2)
    alpha = beta
    tmp0 = (1-alpha)*src + alpha*nz(tmp0[1])
    tmp1 = (src - tmp0[0])*(1-beta) + beta*nz(tmp1[1])
    tmp2 = tmp0[0] + tmp1[0]
    tmp3 = (tmp2[0] - nz(tmp4[1]))*((1-alpha)*(1-alpha)) + (alpha*alpha)*nz(tmp3[1])
    tmp4 = nz(tmp4[1]) + tmp3[0]
    JMA = tmp4
    JMA
rsx(src,length) =>
    f90_ = (nz(f90_[1]) == 0.0) ? 1.0 : (nz(f88[1]) <= nz(f90_[1])) ? nz(f88[1])+1 : nz(f90_[1])+1
    f88 = (nz(f90_[1]) == 0.0) and (length-1 >= 5) ? length-1.0 : 5.0 
    f8 =  100.0*(src) 
    f18 = 3.0 / (length + 2.0) 
    f20 = 1.0 - f18 
    f10 = nz(f8[1])
    v8 = f8 - f10 
    f28 = f20 * nz(f28[1]) + f18 * v8 
    f30 = f18 * f28 + f20 * nz(f30[1])
    vC = f28 * 1.5 - f30 * 0.5 
    f38 = f20 * nz(f38[1]) + f18 * vC 
    f40 = f18 * f38 + f20 * nz(f40[1])
    v10 = f38 * 1.5 - f40 * 0.5 
    f48 = f20 * nz(f48[1]) + f18 * v10 
    f50 = f18 * f48 + f20 * nz(f50[1])
    v14 = f48 * 1.5 - f50 * 0.5 
    f58 = f20 * nz(f58[1]) + f18 * abs(v8) 
    f60 = f18 * f58 + f20 * nz(f60[1])
    v18 = f58 * 1.5 - f60 * 0.5
    f68 = f20 * nz(f68[1]) + f18 * v18 
    f70 = f18 * f68 + f20 * nz(f70[1])
    v1C = f68 * 1.5 - f70 * 0.5 
    f78 = f20 * nz(f78[1]) + f18 * v1C 
    f80 = f18 * f78 + f20 * nz(f80[1])
    v20 = f78 * 1.5 - f80 * 0.5
    f0 = ((f88 >= f90_) and (f8 != f10)) ? 1.0  : 0.0
    f90 = ((f88 == f90_) and (f0 == 0.0))  ? 0.0  : f90_
    v4_ = ((f88 < f90) and (v20 > 0.0000000001)) ? (v14 / v20 + 1.0) * 50.0 : 50.0
    rsx = ((v4_ > 100.0) ? 100.0 : (v4_ < 0.0) ? 0.0 : v4_)-50
    rsx
xPrice=open
emaA = ema(xPrice, Length2)  
Xprice = rsx(open,14)
XPrice = high, xprice = low
xe1 = jma(xPrice, Length1)
xe11 = jma(Xprice[1],Length1)
xe111 = jma(XPrice[1],Length1)
xe1111=jma(xprice[1],Length1)
xe2 = jma(xe1, Length1)
xe21 = jma(xe111, Length1)
xe3 = jma(xe2, Length1)
xe31 = jma(xe1111,Length2)
xe3a = jma(xe2,Length1)
xe4 = jma(xe3, Length1)
xe5 = jma(xe4, Length1)
xe6 = jma(xe5, Length1)
b = 0.7
c1 = -b*b*b
c2 = 3*b*b+3*b*b*b
c3 = -6*b*b-3*b-3*b*b*b
c3a = nz(c3a[1])
c4 = 1+3*b+b*b*b+3*b*b
TEMA = c1 * xe6 + c2 * xe5 + c3 * xe4 + c4 * xe3
DEMA = 2 * emaA - ema(emaA, Length2)
Length(mod)=>(mod*c3a)+Length2
Trend1=TEMA/DEMA
a=rsx(open,Length(2))
b1=rsx(open,Length(3))
c=rsx(open,Length(5))
d=rsx(open,Length(8))
e=rsx(open,Length(13))
f=rsx(open,Length(21))
g=rsx(open,Length(34))
h=rsx(open,Length(55))
i=rsx(open,Length(89))
j=rsx(open,Length(144))
trend1 = (((a-b1)+(c-d)+(e-f)+(g-h)+(i-j))/10)
trend = trend1>0?avg(a,b,c4,c2):trend1==0?XPrice:avg(rsx(open,24),jma(open,24),rsx(jma(open,24),24))
trend2 = trend1>0?avg(d,e,c2,c1):trend1==0?XPrice:avg(rsx(open,48),jma(open,48),rsx(jma(open,48),48))
trend3 = trend1>0?avg(d,e,c2,c1):trend1==0?xprice:avg(rsx(open,96),jma(open,96),rsx(jma(open,96),96))
bc=request.security(syminfo.tickerid,'15',trend)
bc1=request.security(syminfo.tickerid,'15',trend2)
bc2=request.security(syminfo.tickerid,'15',trend3)
bd=request.security(syminfo.tickerid,'30',trend)
bd1=request.security(syminfo.tickerid,'30',trend2)
bd2=request.security(syminfo.tickerid,'30',trend3)
be=request.security(syminfo.tickerid,'60',trend)
be1=request.security(syminfo.tickerid,'60',trend2)
be2=request.security(syminfo.tickerid,'60',trend3)
bf=request.security(syminfo.tickerid,'120',trend)
bf1=request.security(syminfo.tickerid,'120',trend2)
bf2=request.security(syminfo.tickerid,'120',trend3)
bg=request.security(syminfo.tickerid,'240',trend)
bg1=request.security(syminfo.tickerid,'240',trend2)
bg2=request.security(syminfo.tickerid,'240',trend3)
bh=request.security(syminfo.tickerid,'D',trend)
bh1=request.security(syminfo.tickerid,'D',trend2)
bh2=request.security(syminfo.tickerid,'D',trend3)
Trend=((bc-bc1)+(bd-bd1)+(be-be1)+(bf-bf1)+(bg-bg1)+(bh))
Trend11=((bc-bc1)+(bd-bd1)+(be-be1)+(bf-bf1)+(bg-bg1)+(bh1))
Trend33 = max(min(min(min(bc2,bd2),min(be2,bf2)),bg2),bh2)
AverageTrend=sma(Trend1,1000)
StdDev=Multiplier*stdev(Trend1,1000)
TopBand=AverageTrend+StdDev
BotBand=AverageTrend-StdDev
ap=open
n1=10
n2=21
esa1 = jma(ap, n1)
d1 = jma(abs(ap - esa1), n1)
x1 = trend3==Trend33
y1 = trend2==Trend11 
ci = (ap - esa1) / (0.015 * d1)
tci = jma(ci, n2)
wt1=tci
wt2=sma(wt1,4)
fast=jma(open,5)
slow=jma(open,13)
macd=fast-slow
signal=sma(macd,4)
WaveTrend1=wt1-wt2
JMACD1=macd-signal
rsi = (((rsi(open,6))-50)*3)
g1=rsi>Trend1 and WaveTrend1>Trend1 and JMACD1>Trend1
h1=g1?tci*c3a:nz(h[1])
strategy.entry("Long",true,when=x1)
strategy.close("Long",y1)
strategy.entry("Short",false,when=y1)
strategy.close("Short",x1)

더 많은