Chiến lược vector bình thường hóa có quy mô với chức năng kích hoạt, ver.4

Tác giả:ChaoZhang, Ngày: 2024-01-22 09:02:30
Tags:

img

Tổng quan

Đây là một cải tiến của chiến lược vector bình thường hóa quy mô của drkhodakarami, chủ yếu thêm các chức năng kích hoạt để tăng hiệu suất của chiến lược. Chiến lược tính toán tỷ lệ thay đổi trên thị trường dựa trên sự khác biệt khung thời gian và xác định tín hiệu dài và ngắn dựa trên các giá trị ngưỡng. Trong khi đó, các chức năng kích hoạt swish, ReLU và bước được giới thiệu để làm mịn chuỗi chênh lệch và cải thiện độ chính xác của đánh giá tín hiệu.

Chiến lược logic

  1. Tính toán tỷ lệ thay đổi giá phần trăm x của đóng trên khung thời gian đặt
  2. Chuyển x sang chức năng kích hoạt để có được chuỗi p được xử lý
  3. Đặt ngưỡng dương và âm th, đi dài khi p vượt qua trên th, và đi ngắn khi vượt qua dưới -th
  4. Tắt việc sơn lại để tránh tín hiệu giả

Phân tích lợi thế

  1. Chức năng kích hoạt giúp lọc tiếng ồn và cải thiện đánh giá tín hiệu
  2. Nhập cảnh mới và logic gần cho phép giao dịch tự động
  3. Tùy chỉnh tham số nhiều hơn thích nghi với nhiều thị trường hơn
  4. Hiển thị xuất sắc trực quan trình bày tín hiệu thương mại

Phân tích rủi ro

  1. Việc thiết lập ngưỡng không chính xác có thể làm mất cơ hội giao dịch
  2. Các chức năng kích hoạt không phù hợp có thể lọc quá nhiều thông tin thị trường
  3. Sự biến dạng tín hiệu do sơn lại cần được kiểm tra

Giải pháp:

  1. Điều chỉnh các thông số ngưỡng để tìm tối ưu
  2. Thử các chức năng kích hoạt khác nhau để tìm phù hợp nhất
  3. Thêm logic phát hiện tái sơn để xác nhận tín hiệu hợp lệ

Hướng dẫn tối ưu hóa

  1. Thêm cài đặt ngưỡng thích nghi
  2. Tối ưu hóa các tham số chức năng kích hoạt
  3. Tích hợp stop loss tự động
  4. Bộ lọc tín hiệu với nhiều yếu tố hơn

Kết luận

Dựa trên công việc của drkhodakarami, chiến lược này giới thiệu các chức năng kích hoạt để tăng hiệu suất. Việc tùy biến tham số mở rộng thích nghi tốt hơn với những thay đổi của thị trường. Trong khi đó, hình ảnh tuyệt vời trực quan giới thiệu cơ hội giao dịch.


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


Thêm nữa