
이 전략의 주요 아이디어는 Ehlers 슈퍼스모더 필터를 사용하여 무작위 상대적으로 약한 지수 Stochastic RSI 지수를 가공하여 많은 가짜 신호를 필터링하여 더 신뢰할 수있는 거래 신호를 얻습니다. 기본 원칙은 먼저 무작위 상대적으로 강한 약 지수를 계산하고, 그 다음 Ehlers 슈퍼스모더 필터를 사용하여 평형 처리하고, 마지막으로 자신의 이동 평균과 교차하여 다공개합니다.
이 전략은 일기 종결 가격의 RSI 지표를 먼저 계산하고, RSI 지표를 기반으로 Stochastic 지표를 계산합니다. 이것은 전형적인 상대적으로 강한 지수 지표입니다. 가짜 신호를 필터링하기 위해, 엘스 초 평평한 필터를 사용하여 Stochastic RSI를 가공하고, 마지막으로 Stochastic RSI 라인은 자신의 이동 평균과 금색으로 교차하고, 교차하지 않습니다.
이 전략의 가장 큰 장점은 에어스 초소박한 필터를 사용하여 많은 가짜 신호를 효과적으로 필터링하여 거래 신호를 더 신뢰할 수 있다는 것입니다. 또한, 스토카스틱 RSI 지표는 자체적으로 훌륭한 돌파구와 트렌드 추적 능력을 가지고 있습니다. 따라서이 전략은 트렌드를 올바르게 식별하고 적절한 때에 포지션을 만들고 적절한 때에 포지션을 평형 할 수 있습니다.
이 전략의 주요 위험은 시장이 크게 흔들릴 때 잘못된 신호가 발생하기 쉽다는 것입니다. 가격이 좁은 범위에서 크게 변동할 때, 스토카스틱 RSI 지표는 상하의 많은 가짜 신호를 생성합니다. 이 때 엘스 초소형 필터의 효과도 할인됩니다. 또한, 일부 극심한 상황에서 지표의 후퇴도 약간의 위험을 초래할 수 있습니다.
이러한 위험을 줄이기 위해 Stochastic 지표 주기를 확대하고, 부드러움을 줄이는 등과 같은 파라미터를 적절히 조정하여 가짜 신호를 더욱 필터링 할 수 있습니다. 또한, 다른 지표 또는 형태와 조합하여 여러 가지 필터링 조건을 형성하여 잘못된 신호의 위험을 피할 수 있습니다.
이 전략은 다음의 몇 가지 측면에서 최적화될 수 있습니다.
최적화 파라미터 설정. Stochastic RSI 지표의 길이, 부드러운 상수와 같은 파라미터에 대한 세심한 테스트를 통해 최적의 파라미터 조합을 찾을 수 있습니다.
손실을 증가시키는 메커니즘. 수익을 잠금하고 철수를 줄이기 위해 이동 중지 또는 단 단 단 중지 설정을 할 수 있습니다.
다른 지표 또는 형태와 결합 . 변동률 지표, 이동 평균 등과 결합하는 것이 고려될 수 있으며, 복수의 필터링 조건을 형성하여 위험을 더욱 줄일 수 있습니다.
대주기 분석 결과에 따라 포지션을 조정한다. 더 높은 시간 주기 추세 분석 결과에 따라, 거래 당 포지션 규모를 동적으로 조정할 수 있다.
이 전략은 우선 Stochastic RSI 지표를 계산한 다음, 엘스 초소형 필터를 사용하여 가공한 다음, 자신의 이동 평균과 거래 신호를 형성하여 트렌드를 올바르게 판단합니다. 전략의 장점은 지표와 필터의 조합을 사용하는 데 있습니다. 가짜 신호를 효과적으로 필터링하여 높은 확률의 거래 기회를 얻을 수 있습니다. 위험은 주로 잘못된 매개 변수 설정과 상쇄 장치의 부재입니다. 매개 변수 최적화, 상쇄 손해 추가 및 포지션 최적화 등의 방법을 통해 전략의 안정성과 수익 수준을 더욱 높일 수 있습니다.
/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=3
strategy("ES Stoch RSI Strategy [krypt]", overlay=true, calc_on_order_fills=true, calc_on_every_tick=true, initial_capital=10000, currency='USD')
//Backtest Range
FromMonth = input(defval = 06, title = "From Month", minval = 1)
FromDay = input(defval = 1, title = "From Day", minval = 1)
FromYear = input(defval = 2018, title = "From Year", minval = 2014)
ToMonth = input(defval = 7, title = "To Month", minval = 1)
ToDay = input(defval = 30, title = "To Day", minval = 1)
ToYear = input(defval = 2018, title = "To Year", minval = 2014)
PI = 3.14159265359
drop1st(src) =>
x = na
x := na(src[1]) ? na : src
xlowest(src, len) =>
x = src
for i = 1 to len - 1
v = src[i]
if (na(v))
break
x := min(x, v)
x
xhighest(src, len) =>
x = src
for i = 1 to len - 1
v = src[i]
if (na(v))
break
x := max(x, v)
x
xstoch(c, h, l, len) =>
xlow = xlowest(l, len)
xhigh = xhighest(h, len)
100 * (c - xlow) / (xhigh - xlow)
Stochastic(c, h, l, length) =>
rawsig = xstoch(c, h, l, length)
min(max(rawsig, 0.0), 100.0)
xrma(src, len) =>
sum = na
sum := (src + (len - 1) * nz(sum[1], src)) / len
xrsi(src, len) =>
msig = nz(change(src, 1), 0.0)
up = xrma(max(msig, 0.0), len)
dn = xrma(max(-msig, 0.0), len)
rs = up / dn
100.0 - 100.0 / (1.0 + rs)
EhlersSuperSmoother(src, lower) =>
a1 = exp(-PI * sqrt(2) / lower)
coeff2 = 2 * a1 * cos(sqrt(2) * PI / lower)
coeff3 = -pow(a1, 2)
coeff1 = (1 - coeff2 - coeff3) / 2
filt = na
filt := nz(coeff1 * (src + nz(src[1], src)) + coeff2 * filt[1] + coeff3 * filt[2], src)
smoothK = input(7, minval=1, title="K")
smoothD = input(2, minval=1, title="D")
lengthRSI = input(10, minval=1, title="RSI Length")
lengthStoch = input(3, minval=1, title="Stochastic Length")
showsignals = input(true, title="Buy/Sell Signals")
src = input(close, title="Source")
ob = 80
os = 20
midpoint = 50
price = log(drop1st(src))
rsi1 = xrsi(price, lengthRSI)
rawsig = Stochastic(rsi1, rsi1, rsi1, lengthStoch)
sig = EhlersSuperSmoother(rawsig, smoothK)
ma = sma(sig, smoothD)
plot(sig, color=#0094ff, title="K", transp=0)
plot(ma, color=#ff6a00, title="D", transp=0)
lineOB = hline(ob, title="Upper Band", color=#c0c0c0)
lineOS = hline(os, title="Lower Band", color=#c0c0c0)
fill(lineOB, lineOS, color=purple, title="Background")
// Buy/Sell Signals
// use curvature information to filter out some false positives
mm1 = change(change(ma, 1), 1)
mm2 = change(change(ma, 2), 2)
ms1 = change(change(sig, 1), 1)
ms2 = change(change(sig, 2), 2)
sellsignals = showsignals and (mm1 + ms1 < 0 and mm2 + ms2 < 0) and crossunder(sig, ma) and sig[1] > ob
buysignals = showsignals and (mm1 + ms1 > 0 and mm2 + ms2 > 0) and crossover(sig, ma) and sig[1] < os
ploff = 4
plot(buysignals ? sig[1] - ploff : na, style=circles, color=#008fff, linewidth=3, title="Buy Signal", transp=0)
plot(sellsignals ? sig[1] + ploff : na, style=circles, color=#ff0000, linewidth=3, title="Sell Signal", transp=0)
longCondition = buysignals
if (longCondition)
strategy.entry("L", strategy.long, comment="Long", when=(buysignals))
shortCondition = sellsignals
if (shortCondition)
strategy.entry("S", strategy.short, comment="Short", when=(sellsignals))