트리플 스토캐스틱 모멘텀 전략


생성 날짜: 2024-01-26 12:15:20 마지막으로 수정됨: 2024-01-26 12:15:20
복사: 2 클릭수: 768
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

트리플 스토캐스틱 모멘텀 전략

개요

삼중 무작위 동력 전략은 전형적인 단선 거래 전략이다. 그것은 세 개의 다른 파라미터 세트의 무작위 동력 지표를 계산하여 다중으로 중복하여 거래 신호를 형성한다. 세 개의 무작위 동력 지표가 동시에 과매 또는 과매 신호를 표시할 때, 구매 또는 판매를 한다. 이 전략은 다중 시간 주기의 분석의 장점을 결합하여 시장 소음을 효과적으로 필터링하여 신호 품질을 향상시킬 수 있다.

전략 원칙

이 전략의 핵심 지표는 무작위 운동 지표 ((SMI) ᆞ SMI 지표의 계산 공식은 다음과 같다:

SMI = 100 * EMA(EMA(收盘价-最高价和最低价的中点,N1),N2) / 0.5 * EMA(EMA(最高价-最低价,N1),N2)

그 중, N1과 N2는 각각 변수 길이다. SMI 지표의 값값 범위는 100에서 100 사이이며, SMI가 0보다 높으면 종결 가격이 당일 가격 범위의 상반부에 있고, 0보다 낮으면 종결 가격이 가격 범위의 하반부에 있음을 나타낸다.

전통적인 스토치 지표와 비슷하게, SMI 지표가 기본 오버 바이 라인 (예: 40) 와 오버 세일 라인 (예: -40) 을 초과할 때, 반전 신호가 발생할 수 있음을 나타냅니다. SMI 지표 상의 이동 평균을 통과하면 구매 신호가 발생하고, SMI 지표 아래의 이동 평균을 통과하면 판매 신호가 발생한다.

이 전략은 세 개의 세트, 서로 다른 파라미터 설정을 가진 SMI 지표들을 중첩하여, 각각 다음과 같이 설정한다:

  • SMI1: %K 길이 10주기, %K 평형주기 3주기
  • SMI2: %K 길이 20주기, %K 평형주기 3주기
  • SMI3: %K 길이 5주기, %K 평형주기 3주기

세 개의 SMI 지표가 동시에 과매매 또는 과매매를 표시할 때 거래 신호를 발산한다. 이것은 가짜 신호를 효과적으로 필터링하여 신호 품질을 향상시킬 수 있다.

전략적 이점

  • 다중 시간 주기 분석, 종합 판단, 효율적인 소음 필터링
  • SMI 지표는 Stoch 지표의 사용성을 강화합니다.
  • 삼중 중첩을 사용하여 단일 지표보다 신뢰성이 높습니다.
  • 변수 설정은 유연하고 조정할 수 있습니다
  • 고주파 단선 거래에 적용

전략적 위험

  • 다중 지표의 중첩으로 인해 다소 뒤처진 상태입니다.
  • 단선 운영이 빈번하고 거래 비용이 높습니다.
  • 데이터 일치의 위험
  • 시장 구조 변화에 따른 변수 실패의 위험

위험 완화 조치:

  • 최적화 매개 변수, 저하 지연
  • 거래 비용을 줄이기 위해 보유 시간을 적절하게 조정하십시오.
  • 통계 검사를 늘리고 건강검진도 늘려야 합니다.
  • 동적 조정 변수

전략 최적화

  • 다양한 SMI 변수 조합을 테스트합니다.
  • 통계 지표의 증가, 변수 안정성의 평가
  • 다른 보조적인 지표들, 예를 들어, 교류량, 브린 띠 등과 함께
  • 시장 환경에 따라 동적 전환 변수
  • 손해 방지 전략의 최적화

요약하다

삼중 무작위 동력 전략은 세 개의 다른 파라미터 설치를 사용하는 SMI 지표를 사용하여 여러 시간 주기에 대한 통합 판단을 통해 고품질의 초매 거래 신호를 형성합니다. 단일 지표에 비해 이 전략은 더 많은 잡음을 필터링하여 안정성을 향상시킵니다. 다음 단계는 파라미터 최적화, 통계 검증, 보조 지표 등의 방법으로 개선 될 수 있으며 전략이 더 거칠 수 있습니다.

전략 소스 코드
/*backtest
start: 2023-12-26 00:00:00
end: 2024-01-25 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
strategy("Stochastic Momentum multi strategy", "Stochastic Momentum Index multi strategy", overlay=false)

q = input(10, title="%K Length")
r = input(3, title="%K Smoothing Length")
s = input(3, title="%K Double Smoothing Length")
nsig = input(10, title="Signal Length")
matype = input("ema", title="Signal MA Type")  // possible: ema, sma, wma, trima, hma, dema, tema, zlema
overbought = input(40, title="Overbought Level", type=float)
oversold = input(-40, title="Oversold Level", type=float)

trima(src, length) => sma(sma(src,length),length)
hma(src, length) => wma(2*wma(src, length/2)-wma(src, length), round(sqrt(length)))
dema(src, length) => 2*ema(src,length) - ema(ema(src,length),length)
tema(src, length) => (3*ema(src,length) - 3*ema(ema(src,length),length)) + ema(ema(ema(src,length),length),length)
zlema(src, length) => ema(src,length) + (ema(src,length) - ema(ema(src,length),length))

smi = 100 * ema(ema(close-0.5*(highest(q)+lowest(q)),r),s) / (0.5 * ema(ema(highest(q)-lowest(q),r),s))
sig = matype=="ema" ? ema(smi,nsig) : matype=="sma" ? sma(smi,nsig) : matype=="wma" ? wma(smi,nsig) : matype=="trima" ? trima(smi,nsig) : matype=="hma" ? hma(smi,nsig) : matype=="dema" ? dema(smi,nsig) : matype=="tema" ? tema(smi,nsig) : matype=="zlema" ? zlema(smi,nsig) : ema(smi,nsig)

p_smi = plot(smi, title="SMI", color=aqua)
p_sig = plot(sig, title="Signal", color=red)

// plotchar(crossover(smi, sig), title= "low", location=location.bottom, color=green, char="▲", size= size.tiny)
// plotchar(crossunder(smi, sig), title= "high", location=location.top, color=red, char="▼", size= size.tiny)

/////////////////////////////2
q2 = input(20, title="%K Length 2")
r2 = input(3, title="%K Smoothing Length 2")
s2 = input(3, title="%K Double Smoothing Length 2")
nsig2 = input(10, title="Signal Length 2")
matype2 = input("ema", title="Signal MA Type 2")  // possible: ema, sma, wma, trima, hma, dema, tema, zlema
overbought2 = input(40, title="Overbought Level 2", type=float)
oversold2 = input(-40, title="Oversold Level 2", type=float)

trima2(src2, length2) => sma(sma(src2,length2),length2)
hma2(src2, length2) => wma(2*wma(src2, length2/2)-wma(src2, length2), round(sqrt(length2)))
dema2(src2, length2) => 2*ema(src2,length2) - ema(ema(src2,length2),length2)
tema2(src2, length2) => (3*ema(src2,length2) - 3*ema(ema(src2,length2),length2)) + ema(ema(ema(src2,length2),length2),length2)
zlema2(src2, length2) => ema(src2,length2) + (ema(src2,length2) - ema(ema(src2,length2),length2))

smi2 = 100 * ema(ema(close-0.5*(highest(q2)+lowest(q2)),r2),s2) / (0.5 * ema(ema(highest(q2)-lowest(q2),r2),s2))
sig2 = matype2=="ema" ? ema(smi2,nsig2) : matype2=="sma 2" ? sma(smi2,nsig2) : matype2=="wma 2" ? wma(smi2,nsig2) : matype2=="trima 2" ? trima2(smi2,nsig2) : matype2=="hma 2" ? hma2(smi2,nsig2) : matype=="dema 2" ? dema2(smi2,nsig2) : matype2=="tema 2" ? tema2(smi2,nsig2) : matype2=="zlema 2" ? zlema2(smi2,nsig2) : ema(smi2,nsig2)

p_smi2 = plot(smi2, title="SMI 2", color=aqua)
p_sig2 = plot(sig2, title="Signal2", color=red)

// plotchar(crossover(smi2, sig2), title= "low2", location=location.bottom, color=green, char="▲", size= size.tiny)
// plotchar(crossunder(smi2, sig2), title= "high2", location=location.top, color=red, char="▼", size= size.tiny)

/////////////////////////////3
q3 = input(5, title="%K Length 3")
r3 = input(3, title="%K Smoothing Length 3")
s3 = input(3, title="%K Double Smoothing Length 3")
nsig3 = input(10, title="Signal Length 3")
matype3 = input("ema", title="Signal MA Type 3")  // possible: ema, sma, wma, trima, hma, dema, tema, zlema
overbought3 = input(40, title="Overbought Level 3", type=float)
oversold3 = input(-40, title="Oversold Level 3", type=float)

trima3(src3, length3) => sma(sma(src3,length3),length3)
hma3(src3, length3) => wma(2*wma(src3, length3/2)-wma(src3, length3), round(sqrt(length3)))
dema3(src3, length3) => 2*ema(src3,length3) - ema(ema(src3,length3),length3)
tema3(src3, length3) => (3*ema(src3,length3) - 3*ema(ema(src3,length3),length3)) + ema(ema(ema(src3,length3),length3),length3)
zlema3(src3, length3) => ema(src3,length3) + (ema(src3,length3) - ema(ema(src3,length3),length3))

smi3 = 100 * ema(ema(close-0.5*(highest(q3)+lowest(q3)),r3),s3) / (0.5 * ema(ema(highest(q3)-lowest(q3),r3),s3))
sig3 = matype3=="ema" ? ema(smi3,nsig3) : matype3=="sma 3" ? sma(smi3,nsig3) : matype3=="wma 3" ? wma(smi3,nsig3) : matype3=="trima 3" ? trima3(smi3,nsig3) : matype3=="hma 3" ? hma3(smi3,nsig3) : matype=="dema 3" ? dema3(smi3,nsig3) : matype3=="tema 3" ? tema3(smi3,nsig3) : matype3=="zlema 3" ? zlema3(smi3,nsig3) : ema(smi3,nsig3)

p_smi3 = plot(smi3, title="SMI 3", color=aqua)
p_sig3 = plot(sig3, title="Signal3", color=red)

// plotchar(crossover(smi3, sig3) and crossover(smi2, sig2) and crossover(smi, sig), title= "low3", location=location.bottom, color=green, char="▲", size= size.tiny)
// plotchar(crossunder(smi3, sig3) and crossunder(smi2, sig2) and crossunder(smi, sig), title= "high3", location=location.top, color=red, char="▼", size= size.tiny)
plotchar (((smi3 < sig3) and (smi2 < sig2) and (smi < sig)), title= "low3", location=location.bottom, color=green, char="▲", size= size.tiny)
plotchar (((smi3 > sig3) and (smi2 > sig2) and (smi > sig)), title= "high3", location=location.top, color=red, char="▼", size= size.tiny)

// === BACKTEST RANGE ===
FromMonth = input(defval = 8, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2018, title = "From Year", minval = 2014)
ToMonth   = input(defval = 12, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 31, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 2018, title = "To Year", minval = 2014)

longCondition = ((smi3 < sig3) and (smi2 < sig2) and (smi < sig))
shortCondition = ((smi3 > sig3) and (smi2 > sig2) and (smi > sig))

// buy = longCondition == 1 and longCondition[1] == 1 ? longCondition : na
buy = longCondition == 1 ? longCondition : na
sell = shortCondition == 1? shortCondition : na

// === ALERTS ===
strategy.entry("L", strategy.long, when=buy)

strategy.entry("S", strategy.short, when=sell)

alertcondition(((smi3 < sig3) and (smi2 < sig2) and (smi < sig)), title='Low Fib.', message='Low Fib. Buy')
alertcondition(((smi3 > sig3) and (smi2 > sig2) and (smi > sig)), title='High Fib.', message='High Fib. Low')