Chiến lược vector bình thường hóa quy mô với đảo ngược Karobein

Tác giả:ChaoZhang, Ngày: 2023-11-03 16:56:13
Tags:

img

Tổng quan

Chiến lược này dựa trên chỉ số Karobein Mean Reversion và đà tăng giá. Nó sử dụng các chỉ số phụ động lực giá để đánh giá xu hướng và kết hợp chỉ số Karobein Mean Reversion cho mục nhập cụ thể. Chiến lược này phù hợp với giao dịch trung và dài hạn.

Nguyên tắc chiến lược

Đầu tiên, chiến lược tính toán tỷ lệ thay đổi giá tại các giai đoạn khác nhau để có được chỉ số động lực giá. Khi chỉ số động lực giá vượt qua đường ngưỡng động, một tín hiệu dài được tạo ra. Khi vượt qua dưới, một tín hiệu ngắn được tạo ra.

Sau đó, nó kết hợp chỉ số Karobein Mean Reversion để xác định thời gian nhập cảnh cụ thể. Chỉ số Karobein Mean Reversion được tính dựa trên bản chất đảo ngược trung bình của giá, có thể phản ánh sự gia tốc và đường đi của biến động giá.

Khi chỉ số động lượng giá tạo ra một tín hiệu, nếu chỉ số Karobein Mean Reversion nằm trong khu vực hướng tương ứng, một tín hiệu nhập cảnh được tạo ra.

Ưu điểm

  1. Chiến lược xem xét toàn diện động lực giá và các yếu tố đảo ngược trung bình, với khả năng đánh giá xu hướng mạnh mẽ.

  2. Chỉ số Karobein Mean Reversion có thể xác định chính xác các điểm chuyển đổi giá và cải thiện độ chính xác thời gian đầu vào.

  3. Thời gian giữ có thể được kiểm soát tự do bằng cách điều chỉnh tham số, phù hợp với các khung thời gian khác nhau.

  4. Mức ngưỡng động có thể được điều chỉnh trong thời gian thực để đáp ứng thích nghi với những thay đổi trên thị trường.

Rủi ro

  1. Là một xu hướng theo chiến lược, nó dễ bị mắc kẹt trong các xu hướng giới hạn phạm vi.

  2. Chỉ số Karobein Mean Reversion có một sự chậm trễ nhất định, có thể bỏ lỡ các điểm chuyển đổi giá.

  3. Các tham số thời gian nắm giữ nên được theo dõi để tránh mở rộng tổn thất từ thời gian nắm giữ quá nhiều.

  4. Mức ngưỡng năng động nên được thiết lập phù hợp và không quá rộng, nếu không các cơ hội nhập cảnh có thể bị bỏ lỡ.

Phương pháp quản lý rủi ro tương ứng:

  1. Các chỉ số đánh giá xu hướng có thể được sử dụng để dự đoán các thị trường dao động và các vị trí thoát trong thời gian.

  2. Chọn thời gian trễ hợp lý cho chỉ số Karobein Mean Reversal để giảm thời gian trễ.

  3. Kiểm tra các thông số thời gian giữ khác nhau và chọn các thông số phù hợp.

  4. Điều chỉnh phạm vi ngưỡng động để tránh mất các mục.

Hướng dẫn cải thiện

  1. Kiểm tra các khoảng thời gian khác nhau để tính toán động lực giá để tối ưu hóa các thông số.

  2. Thêm các chỉ số biến động để phát hiện các thị trường dao động và thiết lập stop loss.

  3. Tối ưu hóa các thông số của chỉ số Karobein Mean Reversation để làm cho nó nhạy cảm hơn.

  4. Thêm các bộ lọc bổ sung như âm lượng để cải thiện chất lượng tín hiệu.

  5. Sử dụng các thuật toán học máy để tối ưu hóa các tham số một cách năng động.

Kết luận

Chiến lược này sử dụng toàn diện động lực giá và các yếu tố đảo ngược trung bình, với khả năng mạnh mẽ trong đánh giá xu hướng và tạo tín hiệu. Nó có thể thích nghi với các môi trường thị trường khác nhau thông qua điều chỉnh tham số. Có thể tối ưu hóa thêm về thời gian vào và dừng lỗ để làm cho chiến lược mạnh mẽ hơn. Chiến lược này xứng đáng nghiên cứu và áp dụng thêm.


/*backtest
start: 2022-10-27 00:00:00
end: 2023-11-02 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// author: capissimo
strategy("Normalized Vector Strategy, ver.3 (sc)", precision=2, overlay=false)
// This is a scaled Normalized Vector Strategy with a Karobein Oscillator
// original: Drkhodakarami (https://www.tradingview.com/script/Fxv2xFWe-Normalized-Vector-Strategy-By-Drkhodakarami-Opensource/)

// Repainting: in general there two types of repainting:
// * when the last candle is constantly being redrawn
// * when the indicator draws a different configuration after it has been deactivated/reactivated, i.e. refreshed

// The former is a natural behaviour, which presents a constant source of frustration, 
// when a signal directly depends on the current market situation and can be overcome 
// with various indirect techniques like divergence.

// The latter suggests a flaw in the indicator design.
// Unfortunately, the Normalized Vector Strategy is repainting in the latter sense, although being
// really promising. Would be nice if our community suggests a solution to this problem ))

// This strat consistently performs with high accuracy, showing up to 96% scores
// Here are some of the best parameters:
// TF     Lookback   Performance (ca.)
// 1m     13         92%
// 3m     34         92%
// 5m     85         92%
// 15m    210        90%
// 30m    360        89%
// 1H     1440,720   94%, 87%

// The Karobein Oscillator has an intrinsic sinusoidal behaviour that helps in determining direction and timing.
// It does not repaint.
// original: alexgrover (https://www.tradingview.com/script/JiNi0f62-Karobein-Oscillator/)

scaleMinimax(X, p, min, max) => 
    hi = highest(X, p), lo = lowest(X, p)
    (max - min) * (X - lo)/(hi - lo) + min

price    = input(close,  "Price Data")
tf       = input(34,     "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])
showVol  = input(false,  "Volume")
useold   = input(true,   "Use Old System")

lime  = color.new(color.lime, 10), fuchsia = color.new(color.fuchsia, 10), 
black = color.new(color.black, 100), gray = color.new(color.gray, 50)

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
    
getdiff(prc, tf) =>
    prev  = useold ? security(syminfo.tickerid, tostring(tf), prc[1], barmerge.gaps_off, barmerge.lookahead_on) :
                     security(syminfo.tickerid, tostring(tf), prc[1])
    curr  = useold ? security(syminfo.tickerid, tostring(tf), prc, barmerge.gaps_off, barmerge.lookahead_on) : 
                     security(syminfo.tickerid, tostring(tf), prc)
    (curr/prev) - 1
    
p  = getdiff(prix, tf)
up = thresh/div, dn = -thresh/div
longCondition  = crossover(p, up)
shortCondition = crossunder(p, dn)

bg = longCondition ? lime : shortCondition ? fuchsia : black
cl = p > up ? color.green : p < dn ? color.red : color.silver

bgcolor(bg, editable=false)
plot(scaleMinimax(up, 2500, -1, 1), color=lime, editable=false, transp=0)
hline(0, linestyle=hline.style_dotted, title="base line", color=gray, editable=false)
plot(scaleMinimax(dn, 2500, -1, 1), color=fuchsia, editable=false, transp=0)
plot(scaleMinimax(p, 2500, -1, 1), color=cl, style=plot.style_histogram, transp=70, editable=false)
plot(scaleMinimax(p, 2500, -1, 1), color=cl, style=plot.style_linebr, title="prediction", transp=0, editable=false)

strategy.entry("L", true, 1, when=longCondition)
strategy.entry("S", false, 1, when=shortCondition)

alertcondition(longCondition, title='Long', message='Long Signal!')
alertcondition(shortCondition, 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, 2500, -1, 1), color=color.orange, transp=0)


Thêm nữa