
동적 흔들림 전략은 무작위 동적 지표와 상대적으로 강한 지표를 결합한 양적 거래 전략이다. 이 전략은 무작위 동적 지표를 사용하여 시장의 과매매 지역을 판단하고, 빠른 RSI 지표 필터링 신호와 함께, 실물 필터링을 통해 더 신뢰할 수있는 거래 신호 선택을 실현한다.
무작위 동력 지수 (SMI) 는 양적 거래에서 흔히 사용되는 기술 지표로, 동력 지수와 진동 지수의 장점을 결합한다.
구체적으로, SMI의 계산 공식은 다음과 같습니다.
SMI = (Close - (HH + LL)/2)/(0.5*(HH - LL)) * 100
그 중,HH는 지난 N일 동안의 최고 가격이고,LL는 지난 N일 동안의 최저 가격이다.
따라서, SMI는 동력의 추세 판단과 흔들림의 역전 판단을 결합한다. SMI가 80보다 높으면 과매매, 20보다 낮으면 과매매이다. 전략은 과매매 과매매 지역에서 거래 신호를 발산한다.
상대적으로 강한 강도 (RSI) 는 흔히 쓰이는 오버 바이 오버 소드 지표이다. 이 전략은 7주기의 빠른 RSI를 사용하여 단기간에 오버 바이 오버 소드 상태를 판단한다.
빠른 RSI가 20보다 낮으면 과매매, 80보다 높으면 과매매입니다. 전략은 과매매 과매매 영역에서 거래 신호를 냅니다.
이 전략은 또한 엔티티 필터를 추가하여 K-선 엔티티의 크기를 계산하여 부분 신호를 필터링한다. K-선 엔티티가 특정 임계치를 초과했을 때만 거래 신호를 발산한다.
이것은 가짜 신호를 필터링하여 신호의 신뢰도를 높일 수 있습니다.
이 전략은 무작위 운동 지표, 빠른 RSI 지표 및 실체 필터 세 부분을 결합한다. 여러 지표가 결합되어 신호 정확도를 높이고 전략의 안정성을 강화 할 수 있습니다.
무작위 동력 지표와 빠른 RSI 지표는 시장의 과매매 상태를 정확하게 판단할 수 있으며, 전략은 과매매 과매매 영역에서 포지션을 열고, 낮은 지점을 구입하고 높은 지점을 판매하는 거래 원칙을 따른다.
전략은 다중 및 공허 쌍방향 거래를 수행하여 시장에서 거래 기회를 최대한 잡을 수 있습니다.
물리적 필터를 추가하여 대부분의 소음을 필터링하여 진동 시에 막히는 것을 방지한다.
전략적으로 양방향으로 거래하고, 빈번하게 전환하는 것은 잠재적인 위험점이다. 적절히 최적화된 포지션 개설 논리는 이 위험을 줄일 수 있다.
지표가 신호를 줄 때, 짧은 시간에 많은 수의 후발 거래자가 모일 수 있으며, 시장의 역전 위험이 발생할 수 있다. 지표 매개 변수를 최적화함으로써 이 위험을 줄일 수 있다.
극단적인 상황에서는 모든 모델이 실패할 수 있습니다. 이 위험은 합리적인 스톱더 설정으로 제어해야 합니다.
SMI 주기, RSI 주기, 실물 필터 값 등과 같은 다양한 변수 조합을 테스트하여 전략 수익률을 높이기 위해 최적의 변수를 찾을 수 있습니다.
ATR 또는 변동성에 기반한 다이내믹 스톱드 메커니즘을 구축하면 개별 주식과 전체의 위험을 더 잘 제어할 수 있다.
기계 학습 알고리즘을 도입하여 모델로 지표값의 미래 흐름을 예측할 수 있다. 이는 지표의 전환점을 미리 판단하여 전략의 전향성을 강화할 수 있다.
요약하자면, 이 전략은 무작위 운동 지표, 빠른 RSI 지표 및 실물 필터를 통합하여 비교적 완전한 과매매 판단 시스템을 구현합니다. 다중 지표 조합은 신호 정확도를 향상시키고, 양방향 거래 및 위험 제어 장치 또한 전략을 더 균형있게 만듭니다. 매개 변수 및 모델을 지속적으로 최적화함으로써이 전략은 더 나은 수익률을 얻을 수 있습니다.
/*backtest
start: 2023-12-22 00:00:00
end: 2024-01-21 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//Noro
//2018
//@version=2
strategy(title = "Noro's Stochastic Strategy v1.1", shorttitle = "Stochastic str 1.1", 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")
usemar = input(false, defval = false, title = "Use Martingale")
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %")
usesmi = input(true, defval = true, title = "Use SMI Strategy")
usersi = input(true, defval = true, title = "Use RSI Strategy")
usebod = input(true, defval = true, title = "Use Body-Filter")
a = input(5, "SMI Percent K Length")
b = input(3, "SMI Percent D Length")
limit = input(50, defval = 50, minval = 1, maxval = 100, title = "SMI Limit")
fromyear = input(2017, defval = 2017, 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")
//Fast RSI
fastup = rma(max(change(close), 0), 7)
fastdown = rma(-min(change(close), 0), 7)
fastrsi = fastdown == 0 ? 100 : fastup == 0 ? 0 : 100 - (100 / (1 + fastup / fastdown))
//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 Filter
nbody = abs(close - open)
abody = sma(nbody, 10)
body = nbody > abody / 3 or usebod == false
//Signals
up1 = SMIsignal < -1 * limit and close < open and body and usesmi
dn1 = SMIsignal > limit and close > open and body and usesmi
up2 = fastrsi < 20 and close < open and body and usersi
dn2 = fastrsi > 80 and close > open and body and usersi
exit = ((strategy.position_size > 0 and close > open) or (strategy.position_size < 0 and close < open)) and body
//Trading
profit = exit ? ((strategy.position_size > 0 and close > strategy.position_avg_price) or (strategy.position_size < 0 and close < strategy.position_avg_price)) ? 1 : -1 : profit[1]
mult = usemar ? exit ? profit == -1 ? mult[1] * 2 : 1 : mult[1] : 1
lot = strategy.position_size == 0 ? strategy.equity / close * capital / 100 * mult : lot[1]
if up1 or up2
if strategy.position_size < 0
strategy.close_all()
strategy.entry("long", strategy.long, needlong == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
if dn1 or dn2
if strategy.position_size > 0
strategy.close_all()
strategy.entry("Short", strategy.short, needshort == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
if time > timestamp(toyear, tomonth, today, 23, 59) or exit
strategy.close_all()