
이 전략은 쌍방향 역전량 지표 지표를 사용하여 거래하는 전략이다. 이 전략은 일정 기간 동안의 최고 가격, 최저 가격, 종결 가격을 계산하여 역전량 지수를 구성하고, 이동 평균을 계산하여 거래 신호를 구성한다. 지수가 오버 바이 영역에서 역전 하락하거나 오버 셀 영역에서 역전 상승했을 때 거래가 발생한다. 이 전략은 동시에 브레이크스트로스 메커니즘을 설정한다.
이 전략의 핵심 지표는 역동량 지수 (Stochastic Momentum Index, SMI) 이다. SMI의 계산 공식은 다음과 같다:
\[SMI = \frac{Close-(HH+LL)/2}{AVGDIFF/2}*100\]
그 중,HH는 지난 N일간의 최고값이며,LL는 지난 N일간의 최저값이며,N은 변수 a에 의해 결정된다.AVGDIFF는HH-LL의 M일간의 이동 평균이며,M은 변수 b에 의해 결정된다.
SMI 지수는 가격 반전의 특징을 나타낸다. 주식 가격이 최근 N 일간의 최고점에 가까워지면 SMI가 100에 가까워 주식이 과매매되는 것을 나타냅니다. 최근 N 일간의 최저점에 가까워지면 SMI가 100에 가까워 주식이 과매되는 것을 나타냅니다. SMI는 100 수준에서 반전 하락하거나 100 수준에서 반전 상승하면 구매/판매 신호를 냅니다.
이 전략은 SMI의 M일 이동 평균 SMA를 거래 신호 라인으로 사용합니다. SMI가 초과 구매 영역에서 아래로 회전하면 SMA를 넘어가는 경우 구매 신호가 발생하고, SMI가 초과 판매 영역에서 위로 회전하면 SMA를 넘어가는 경우 판매 신호가 발생합니다.
동시에, 전략은 K선 엔티티의 돌파를 판단하여 스톱 손실을 설정한다.
이 전략은 다음과 같은 장점을 가지고 있습니다.
가격 역전 원리를 활용하여 트렌드 역전 지점에서 거래 신호를 생성하여 역전 기회를 잡을 수 있습니다.
SMI 지수는 최고 가격, 최저 가격 및 종결 가격을 결합하여 과매매 상황을 종합적으로 판단하여 신호가 더 신뢰할 수 있습니다.
K선 엔티티의 돌파구와 결합하여 스톱로드를 설정하여, 적시에 스톱로드를 Exiting the position, 효과적으로 리스크를 제어할 수 있다.
정책의 매개 변수가 적고, 실행 및 최적화가 쉽다.
이 전략에는 몇 가지 위험도 있습니다.
역전 거래는 역전 성공 시점을 판단하기 어렵고, 여러 번의 손실이 발생했을 때만 트렌드 반전을 잡을 수 있다.
회전 시점 판단 오류로 인해 손실이 커질 수 있다.
엔티티의 침투 장애는 너무 민감할 수 있고, 감금될 확률이 높습니다.
대응방법:
SMI 파라미터를 최적화하고, 역전 거래 주파수를 조정한다.
다른 지표들과 함께 역전 시점을 판단한다.
엔티티 크기를 조정하여 너무 민감하지 않도록하십시오.
이 전략은 다음과 같은 방향으로 최적화될 수 있습니다.
SMI의 파라미터 a와 b를 최적화하여 역으로 잡히는 감도를 조정한다.
다른 지표 판단을 추가하여 주요 트렌드 방향을 놓치지 않도록하십시오. 예를 들어, 평균선, 변동률 지표와 결합하십시오.
손실을 막는 방법을 추가하여 손실이 너무 민감하거나 느려지지 않도록하십시오. 추적 손실, 곡선 손실 등을 고려 할 수 있습니다.
기계 학습 모델과 결합하여 역전 성공 확률을 판단하고, 역전 실패 거래를 피합니다.
이 전략은 전체적으로 반전 지수 SMI를 이용한 양방향 거래의 전략이다. 이점은 가격 반전 특성을 이용하여 반전 지점에서 거래 신호를 생성하여 더 많은 단선 거래 기회를 잡을 수 있다는 것이다. 그러나 또한 몇 가지 전형적인 반전 거래 위험이 존재하며, 손실을 막기 위해 변수 및 중지를 최적화해야 한다.
/*backtest
start: 2023-11-01 00:00:00
end: 2023-11-30 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//Noro
//2018
//@version=2
strategy(title = "Noro's Stochastic Strategy v1.0", shorttitle = "Stochastic str 1.0", overlay = false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0)
//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %")
a = input(5, "Percent K Length")
b = input(3, "Percent D Length")
limit = input(50, defval = 50, minval = 1, maxval = 100, title = "SMI Limit")
fromyear = input(2018, defval = 2018, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")
//Stochastic Momentum Index
ll = lowest (low, a)
hh = highest (high, a)
diff = hh - ll
rdiff = close - (hh+ll)/2
avgrel = ema(ema(rdiff,b),b)
avgdiff = ema(ema(diff,b),b)
SMI = avgdiff != 0 ? (avgrel/(avgdiff/2)*100) : 0
SMIsignal = ema(SMI,b)
//Lines
plot(SMI, color = blue, linewidth = 3, title = "Stochastic Momentum Index")
plot(SMIsignal, color = red, linewidth = 3, title = "SMI Signal Line")
plot(limit, color = black, title = "Over Bought")
plot(-1 * limit, color = black, title = "Over Sold")
plot(0, color = blue, title = "Zero Line")
//Body
body = abs(close - open)
abody = sma(body, 10)
//Signals
up = SMIsignal < -1 * limit and close < open
dn = SMIsignal > limit and close > open
exit = ((strategy.position_size > 0 and close > open) or (strategy.position_size < 0 and close < open)) and body > abody / 2
//Trading
lot = strategy.position_size == 0 ? strategy.equity / close * capital / 100 : lot[1]
if up
if strategy.position_size < 0
strategy.close_all()
strategy.entry("Bottom", strategy.long, needlong == false ? 0 : lot)
if dn
if strategy.position_size > 0
strategy.close_all()
strategy.entry("Top", strategy.short, needshort == false ? 0 : lot)
if exit
strategy.close_all()