Skalierte normalisierte Vektorstrategie mit Aktivierungsfunktionen, Version 4

Schriftsteller:ChaoZhang, Datum: 2024-01-22 09:02:30
Tags:

img

Übersicht

Dies ist eine Verbesserung der Skalierten Normalisierten Vektorstrategie von drkhodakarami, die hauptsächlich Aktivierungsfunktionen hinzufügt, um die Leistung der Strategie zu verbessern.

Strategie Logik

  1. Berechnen Sie die prozentuale Preisänderung x des Schließens im festgelegten Zeitrahmen
  2. Pass x an die Aktivierungsfunktion, um die verarbeitete Sequenz p zu erhalten
  3. Stellen Sie positive und negative Schwellenwerte th, gehen lange, wenn p über th, und gehen kurz, wenn sie unter -th.
  4. Deaktivieren Sie das Neuberichten, um falsche Signale zu vermeiden

Analyse der Vorteile

  1. Aktivierungsfunktionen helfen, Lärm zu filtern und das Signalbeurteilen zu verbessern
  2. Neuer Einstieg und enge Logik ermöglichen den automatisierten Handel
  3. Mehr Parameter-Anpassung an mehr Märkte
  4. Ausgezeichnete Visualisierung präsentiert intuitiv Handelssignale

Risikoanalyse

  1. Falsche Schwellenwerte können Handelschancen verpassen
  2. Nicht geeignete Aktivierungsfunktionen können Marktinformationen überfiltern
  3. Die durch Neubemalung verursachten Signalverzerrungen müssen getestet werden

Lösungen:

  1. Einstellen Sie die Schwellenparameter, um das optimale zu finden
  2. Versuchen Sie verschiedene Aktivierungsfunktionen, um die beste Übereinstimmung zu finden
  3. Hinzufügen der Logik zur Wiederholung der Aufzeichnung, um gültige Signale zu bestätigen

Optimierungsrichtlinien

  1. Hinzufügen einer anpassungsfähigen Schwellenwerteinstellung
  2. Optimierung der Aktivierungsfunktionsparameter
  3. Einbeziehung eines automatischen Stop-Loss
  4. Filtersignale mit mehr Faktoren

Schlussfolgerung

Auf der Grundlage der Arbeit von drkhodakarami führt diese Strategie Aktivierungsfunktionen ein, um die Leistung zu verbessern. Die erweiterte Parameteranpassung passt sich besser an die Marktveränderungen an. In der Zwischenzeit präsentiert die ausgezeichnete Visualisierung intuitiv Handelsmöglichkeiten. Die nächsten Schritte sind die weitere Optimierung von Aktivierungsfunktionen und Schwellenwerteinstellungen, die Einbeziehung von Stop-Loss-Logik und mehr Signalfilterung, um eine noch bessere Strategieneffizienz zu erzielen.


/*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)


Mehr