Skalakan Strategi Vektor Normal dengan Fungsi Aktivasi, ver.4

Penulis:ChaoZhang, Tarikh: 2024-01-22 09:02:30
Tag:

img

Ringkasan

Ini adalah penambahbaikan kepada strategi drkhodakarami's Scaled Normalized Vector, terutamanya menambah fungsi pengaktifan untuk meningkatkan prestasi strategi. Strategi ini mengira kadar perubahan di pasaran berdasarkan perbezaan bingkai masa, dan menentukan isyarat panjang dan pendek berdasarkan nilai ambang. Sementara itu, swish, ReLU dan fungsi pengaktifan langkah diperkenalkan untuk meluruskan urutan pembezaan dan meningkatkan ketepatan penilaian isyarat.

Logika Strategi

  1. Mengira perubahan harga peratusan x penutupan pada jangka masa yang ditetapkan
  2. Loloskan x ke fungsi pengaktifan untuk mendapatkan urutan p yang diproses
  3. Tetapkan ambang positif dan negatif th, pergi panjang apabila p melintasi di atas th, dan pergi pendek apabila melintasi di bawah -th
  4. Menonaktifkan lukisan semula untuk mengelakkan isyarat palsu

Analisis Kelebihan

  1. Fungsi pengaktifan membantu menapis bunyi bising dan meningkatkan penilaian isyarat
  2. Penempatan baru dan logik yang rapat membolehkan perdagangan automatik
  3. Lebih banyak parameter penyesuaian menyesuaikan diri dengan lebih banyak pasaran
  4. Visualisasi yang sangat baik secara intuitif menunjukkan isyarat perdagangan

Analisis Risiko

  1. Tetapan ambang yang tidak betul boleh kehilangan peluang perdagangan
  2. Fungsi pengaktifan yang tidak sesuai boleh terlalu menapis maklumat pasaran
  3. Penyimpangan isyarat yang disebabkan oleh lukisan semula perlu diuji

Penyelesaian:

  1. Sesuaikan parameter ambang untuk mencari optimum
  2. Cuba fungsi pengaktifan yang berbeza untuk mencari perlawanan terbaik
  3. Tambah semula logik pengesanan untuk mengesahkan isyarat yang sah

Arahan pengoptimuman

  1. Tambah tetapan ambang penyesuaian
  2. Mengoptimumkan parameter fungsi pengaktifan
  3. Masukkan Stop Loss automatik
  4. Menapis isyarat dengan lebih banyak faktor

Kesimpulan

Berdasarkan kerja drkhodakarami, strategi ini memperkenalkan fungsi pengaktifan untuk meningkatkan prestasi. penyesuaian parameter yang diperluaskan lebih sesuai dengan perubahan pasaran. Sementara itu, visualisasi yang sangat baik secara intuitif membentangkan peluang perdagangan. Langkah seterusnya adalah untuk mengoptimumkan fungsi pengaktifan dan tetapan ambang, menggabungkan logik kehilangan berhenti dan penapisan isyarat yang lebih untuk mencapai keberkesanan strategi yang lebih baik.


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


Lebih lanjut