이것은 drkhodakarami의 확장 표준 벡터 전략의 개선이며, 주로 전략의 성능을 향상시키기 위해 활성화 기능을 추가합니다. 전략은 시간 프레임 차이에 따라 시장의 변화율을 계산하고, 임계값에 따라 길고 짧은 신호를 결정합니다. 한편, 스윙, ReLU 및 단계 활성화 기능은 미분 순서를 매끄럽게하고 신호 판단의 정확성을 향상시키기 위해 도입됩니다.
해결책:
이 전략은 drkhodakarami의 작업을 기반으로 성능을 향상시키기 위해 활성화 기능을 도입합니다. 확장된 매개 변수 사용자 정의는 시장 변화에 더 잘 적응합니다. 한편, 우수한 시각화는 직관적으로 거래 기회를 제시합니다. 다음 단계는 활성화 기능과 임계 설정을 더 최적화하고, 스톱 로스 논리와 더 많은 신호 필터링을 통합하여 더 나은 전략 효과를 달성하는 것입니다.
/*backtest start: 2023-01-15 00:00:00 end: 2024-01-21 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 // author: capissimo strategy("Scaled Normalized Vector Strategy, ver.4", precision=2, overlay=false) // This is a modification of my Scaled Normalized Vector Strategy // original: Drkhodakarami (https://www.tradingview.com/script/Fxv2xFWe-Normalized-Vector-Strategy-By-Drkhodakarami-Opensource/) price = input(close, "Price Data") tf = input(18, "Timeframe", minval=1, maxval=1440) thresh = input(14., "Threshold", minval=.1, step=.1) div = input(1000000,"Divisor", options=[1,10,100,1000,10000,100000,1000000,10000000,100000000]) mmx = input(233, "Minimax Lookback", options=[1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584]) showVol = input(false, "Volume") useold = input(true, "Use Old System") method = input("Swish", "Activation", options=["Step", "LReLU", "Swish", "None"]) scaleMinimax(X, p, min, max) => hi = highest(X, p), lo = lowest(X, p) (max - min) * (X - lo)/(hi - lo) + min getdiff(prc, tf) => prev = scaleMinimax((useold ? security(syminfo.tickerid, tostring(tf), prc[1], barmerge.gaps_off, barmerge.lookahead_on) : security(syminfo.tickerid, tostring(tf), prc[1])), tf, 0, 1) curr = scaleMinimax((useold ? security(syminfo.tickerid, tostring(tf), hlc3, barmerge.gaps_off, barmerge.lookahead_on) : security(syminfo.tickerid, tostring(tf), hlc3)), tf, 0, 1) (curr/prev) - 1 relu(x) => max(x, 0) lrelu(x, alpha) => relu(x) - alpha * relu(-x) step(x) => x >= 0 ? 1 : -1 log2(x) => log(x) / log(2) sigmoid(x) => 1 / (1 + exp(-x)) swish(x) => x * sigmoid(x) f(m) => method==m vol = useold ? security(syminfo.tickerid, tostring(tf), volume, barmerge.gaps_off, barmerge.lookahead_on) : security(syminfo.tickerid, tostring(tf), volume) obv = cum(change(price) > 0 ? vol : change(price) < 0 ? -vol : 0*vol) prix = showVol ? obv : price x = getdiff(prix, tf) p = f("Swish") ? swish(x) : f("Step") ? step(x) : f("LReLU") ? lrelu(x, .8) : x th = thresh/div long = crossover(p, th) short= crossunder(p, -th) lime = color.new(color.lime, 10), fuchsia = color.new(color.fuchsia, 10), black = color.new(color.black, 100), gray = color.new(color.gray, 50) bg = long ? lime : short ? fuchsia : black cl = p > th ? color.green : p < -th ? color.red : color.silver bgcolor(bg, editable=false) plot(scaleMinimax(th, mmx, -1, 1), color=lime, editable=false, transp=0) hline(0, linestyle=hline.style_dotted, title="base line", color=gray, editable=false) plot(scaleMinimax(-th, mmx, -1, 1), color=fuchsia, editable=false, transp=0) plot(scaleMinimax(p, mmx, -1, 1), color=cl, style=plot.style_histogram, transp=70, editable=false) plot(scaleMinimax(p, mmx, -1, 1), color=cl, style=plot.style_linebr, title="prediction", transp=0, editable=false) strategy.entry("L", true, 1, when=long) strategy.entry("S", false, 1, when=short) alertcondition(long, title='Long', message='Long Signal!') alertcondition(short, title='Short', message='Short Signal!') //*** Karobein Oscillator per = input(8, "Karobein Osc Lookback") prix2 = ema(price, per) a = ema(prix2 < prix2[1] ? prix2/prix2[1] : 0, per) b = ema(prix2 > prix2[1] ? prix2/prix2[1] : 0, per) c = (prix2/prix2[1])/(prix2/prix2[1] + b) d = 2*((prix2/prix2[1])/(prix2/prix2[1] + c*a)) - 1 plot(scaleMinimax(d, mmx, -1, 1), color=color.orange, transp=0)