Chiến lược giao dịch trung bình chuyển động kênh giá biến động

Tác giả:ChaoZhang, Ngày: 2023-12-12 11:44:15
Tags:

img

Tổng quan

Chiến lược này dựa trên chỉ số siêu xu hướng và chỉ số kênh giá, kết hợp với các tín hiệu trung bình động để giao dịch. Ý tưởng cốt lõi của nó là sử dụng kênh giá để đánh giá liệu giá hiện tại có ở trạng thái bất thường hay không, Super Trend để xác định hướng xu hướng hiện tại và tạo ra các tín hiệu giao dịch kết hợp với các tín hiệu trung bình động.

Chiến lược logic

  1. Tính toán chỉ số siêu xu hướng. Các đường ray trên và dưới là giá hiện tại cộng/từ N lần chỉ số ATR tương ứng. Khi giá cao hơn đường ray trên, nó tăng. Khi giá thấp hơn đường ray dưới, nó giảm.

  2. Tính toán chỉ số kênh giá. Đường kênh giá là M lần độ lệch chuẩn N ngày của giá. Giá cao hơn / thấp hơn đường kênh được coi là trạng thái bất thường.

  3. Tính toán các đường trung bình động.

  4. Tạo tín hiệu giao dịch:

    • Tín hiệu mua: Giá đóng vượt trên đường Super Trend và cao hơn mức trung bình động của giá mở.

    • Tín hiệu bán: Giá đóng vượt dưới đường siêu xu hướng và thấp hơn mức trung bình động của giá mở.

  5. Thiết lập dừng lỗ và lấy lợi nhuận kênh giá.

Phân tích lợi thế

  1. Kết hợp nhiều chỉ số tránh các tín hiệu sai.

  2. Sử dụng kênh giá để đánh giá trạng thái giá bất thường có thể lọc ra một số điểm nhập khẩu không mong muốn.

  3. Mức trung bình động kết hợp với đánh giá hướng xu hướng tránh giao dịch chống lại xu hướng.

  4. Thiết lập stop loss và take profit range kiểm soát rủi ro.

Phân tích rủi ro

  1. Cài đặt tham số là quá chủ quan và cần tối ưu hóa.

  2. Phạm vi dừng lỗ và lấy lợi nhuận có thể được đặt quá rộng hoặc quá hẹp.

  3. Các thông số kênh giá có thể không phù hợp với tất cả các sản phẩm, cần thử nghiệm riêng biệt.

  4. Mất đáng kể có thể xảy ra trong những thay đổi xu hướng mạnh mẽ.

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

  1. Kiểm tra và tối ưu hóa các thông số để tìm kết hợp tối ưu.

  2. Kiểm tra các đường trung bình động với các khoảng thời gian khác nhau để chọn các thông số tối ưu.

  3. Backtest trên nhiều sản phẩm và chọn các thông số theo hiệu suất tương ứng.

  4. Tối ưu hóa chiến lược dừng lỗ để tránh lỗ đơn quá lớn.

Kết luận

Chiến lược này kết hợp nhiều chỉ số để đánh giá sự bất thường của giá và hướng xu hướng, về mặt lý thuyết có thể lọc ra một số tín hiệu sai. Tuy nhiên, cài đặt tham số vẫn tương đối chủ quan với chỗ cho tối ưu hóa. Ngoài ra, chi phí giao dịch như hoa hồng và trượt nên được xem xét trong giao dịch thực tế. Nhìn chung, chiến lược này phù hợp hơn như một chiến lược theo xu hướng, nhưng các tham số cần được tối ưu hóa và điều chỉnh cho các sản phẩm khác nhau.


/*backtest
start: 2023-12-10 00:00:00
end: 2023-12-11 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="Vol ST VM", overlay=true)

source = close
hilow = ((high - low)*100)
openclose = ((close - open)*100)
vol = (volume / hilow)
spreadvol = (openclose * vol)
VPT = spreadvol + cum(spreadvol)
window_len = 28

v_len = 14
price_spread = stdev(high-low, window_len)

v =  spreadvol + cum(spreadvol)
smooth = sma(v, v_len)
v_spread = stdev(v - smooth, window_len)
shadow = (v - smooth) / v_spread * price_spread

out = shadow > 0 ? high + shadow : low + shadow
//
src = out
src1=open
src2=low
src3=high
tf =input(720)
len = timeframe.isintraday and timeframe.multiplier >= 1 ? 
   tf / timeframe.multiplier * 7 : 
   timeframe.isintraday and timeframe.multiplier < 60 ? 
   60 / timeframe.multiplier * 24 * 7 : 7

c = ema(src, len)
plot(c,color=color.red)
o = ema(src1,len)
plot(o,color=color.blue)
//h = ema(src3,len)
//l=ema(src2,len)
//
col=c > o? color.lime : color.orange
vis = true
vl = c
ll = o
m1 = plot(vl, color=col, linewidth=1, transp=60)
m2 = plot(vis ? ll : na,  color=col, linewidth=2, transp=80)

fill(m1, m2,  color=col, transp=70)
//

vpt=ema(out,len)

// INPUTS //
st_mult   = input(1,   title = 'SuperTrend Multiplier', minval = 0, maxval = 100, step = 0.01)
st_period = input(10, title = 'SuperTrend Period',     minval = 1)

// CALCULATIONS //
up_lev = vpt - (st_mult * atr(st_period))
dn_lev = vpt + (st_mult * atr(st_period))

up_trend   = 0.0
up_trend   := close[1] > up_trend[1]   ? max(up_lev, up_trend[1])   : up_lev

down_trend = 0.0
down_trend := close[1] < down_trend[1] ? min(dn_lev, down_trend[1]) : dn_lev

// Calculate trend var
trend = 0
trend := close > down_trend[1] ? 1: close < up_trend[1] ? -1 : nz(trend[1], 1)

// Calculate SuperTrend Line
st_line = trend ==1 ? up_trend : down_trend

// Plotting
plot(st_line[1], color = trend == 1 ? color.green : color.red , style = plot.style_cross, linewidth = 2, title = "SuperTrend")
buy=crossover( close, st_line) and close>o
sell=crossunder(close, st_line) and close<o
//plotshape(crossover( close, st_line), location = location.belowbar, color = color.green,size=size.tiny)
//plotshape(crossunder(close, st_line), location = location.abovebar, color = color.red,size=size.tiny)
plotshape(buy, title="buy", color=color.green, style=shape.arrowup, location=location.belowbar, size=size.normal, textcolor=color.white, transp=0)  //plot for buy icon
plotshape(sell, title="sell", color=color.red, style=shape.arrowdown, location=location.abovebar, size=size.normal, textcolor=color.white, transp=0)  //plot for sell icon


//
multiplier = input(title="TP", type=input.float, defval=2, minval=1)
src5 = close
len5 = input(title="TP length", defval=150, minval=1)
offset = 0

calcSlope(src5, len5) =>
    sumX = 0.0
    sumY = 0.0
    sumXSqr = 0.0
    sumXY = 0.0
    for i = 1 to len5
        val = src5[len5-i]
        per = i + 1.0
        sumX := sumX + per
        sumY := sumY + val
        sumXSqr := sumXSqr + per * per
        sumXY := sumXY + val * per
        
        
    slope = (len5 * sumXY - sumX * sumY) / (len5 * sumXSqr - sumX * sumX)
    average = sumY / len5
    intercept = average - slope * sumX / len5 + slope
    [slope, average, intercept]

var float tmp = na
[s, a, i] = calcSlope(src5, len5)

vwap1=(i + s * (len5 - offset))
sdev = stdev(close, len5)
dev = multiplier * sdev
top=vwap1+dev
bott=vwap1-dev

//
z1 = vwap1 + dev
x1 = vwap1 - dev

low1 = crossover(close, x1)  
high1 = crossunder(close, z1) 

plotshape(low1, title="low", text="TP", color=color.red, style=shape.labelup, location=location.belowbar, size=size.small, textcolor=color.white, transp=0)  //plot for buy icon
plotshape(high1, title="high", text="TP", color=color.green, style=shape.labeldown, location=location.abovebar, size=size.small, textcolor=color.white, transp=0)  //plot for sell icon



strategy.entry(id="Enter Long MA", long=true, comment="Buy", when=high1)
strategy.entry(id="Short Entry MA", long=false, comment="Sell", when=low1)

/////// Alerts /////
alertcondition(buy,title="buy")
alertcondition(sell,title="sell")
alertcondition(low1,title="sell tp")
alertcondition(high1,title="buy tp")

Thêm nữa