Xu hướng theo chiến lược dựa trên chỉ số lưu lượng khối lượng

Tác giả:ChaoZhang, Ngày: 2023-10-10 14:51:13
Tags:

Tổng quan

Chiến lược này thực hiện xu hướng sau khi giao dịch dựa trên Chỉ số lưu lượng khối lượng (VFI). Nó đánh giá hướng xu hướng thị trường bằng cách tính biến động giá và thay đổi khối lượng, và nhận ra mua thấp và bán cao.

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

  1. Tính toán chỉ số VFI: Tính toán giá trị VFI dựa trên thay đổi giá và khối lượng logarithmic và làm mịn các dao động thông qua các kỹ thuật làm mịn.

  2. Xác định hướng xu hướng: VFI vượt trên 0 là tín hiệu tăng, trong khi vượt dưới 0 là tín hiệu giảm.

  3. Các tín hiệu giao dịch: Đi dài khi EMA nhanh vượt qua EMA chậm và VFI vượt qua đường mua; đóng vị trí khi VFI vượt qua đường bán.

  4. Stop loss: Đặt tỷ lệ stop loss cố định.

Chiến lược này chủ yếu dựa vào VFI để xác định hướng xu hướng, kết hợp với các đường trung bình động để tạo ra tín hiệu giao dịch. VFI phản ánh tâm lý thị trường thông qua sự biến động giá và thay đổi khối lượng, làm cho nó trở thành chỉ số theo xu hướng.

Ưu điểm

  1. VFI xác định xu hướng tốt hơn các chỉ số giá duy nhất, lọc hiệu quả các sự hợp nhất và sự phá vỡ sai.

  2. Mức trung bình động cung cấp các phán đoán bổ sung, tránh các tín hiệu không chính xác từ VFI trong các thị trường dao động.

  3. Stop loss cố định kiểm soát rủi ro và tạo điều kiện quản lý rủi ro.

  4. Chế độ theo xu hướng tạo ra lợi nhuận dư thừa mà không dự đoán sự đảo ngược.

  5. Điều chỉnh tham số linh hoạt thích nghi với các giai đoạn và sản phẩm khác nhau.

Rủi ro

  1. VFI có thể tạo ra các tín hiệu không chính xác trong các biến động đáng kể.

  2. Stop loss cố định có thể quá rộng hoặc quá hẹp.

  3. Các thiết lập nhập và xuất không được cấu hình đúng dẫn đến giao dịch quá mức hoặc thiếu giao dịch.

  4. Theo xu hướng không thể nắm bắt sự đảo ngược và cần dừng lỗ kịp thời.

  5. Các thông số không chính xác gây ra sự nhập cảnh sớm hoặc muộn.

Những cải tiến

  1. Tối ưu hóa tính toán VFI bằng cách điều chỉnh các thông số.

  2. Điều chỉnh các khoảng thời gian trung bình di chuyển tốt hơn cho thời gian tín hiệu.

  3. Sử dụng stop loss động thay vì cố định.

  4. Thêm các chỉ báo khác vào các tín hiệu lọc.

  5. Tối ưu hóa các tham số riêng biệt dựa trên khung thời gian.

  6. Kiểm tra độ bền trên các sản phẩm khác nhau.

Kết luận

Chiến lược này xác định hướng xu hướng với VFI và sử dụng đường trung bình động để lọc ra các tín hiệu sai. Nó nhận ra mức mua thấp / bán cao thông qua theo xu hướng mà không dự đoán sự đảo ngược. Ưu điểm nằm trong việc phát hiện xu hướng vượt trội hơn các chỉ số giá duy nhất và khả năng lọc ra sự hợp nhất. Rủi ro chính là tạo ra các tín hiệu không chính xác trong thời gian biến động. Tối ưu hóa các tham số, thêm các chỉ số bổ sung và kỹ thuật dừng lỗ có thể cải thiện sự ổn định của nó. Nhìn chung, với điều chỉnh tham số và tối ưu hóa dừng lỗ, chiến lược dựa trên VFI này có thể trở thành một hệ thống theo xu hướng đáng tin cậy.


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

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © mohanee
//This strategy is based on VFI indicator published by  UTS.  
//more details of VFI indicator can be found at  [url=http://mkatsanos.com/VFI.html]http://mkatsanos.com/VFI.html[/url] 
// I have added buy line and sell line to the indicator  and tested  SPY stock/index on one hour chart

//@version=4
strategy(title="VFI  strategy [based on VFI indicator published by  UTS]", overlay=false,pyramiding=2, default_qty_type=strategy.fixed,    initial_capital=10000, currency=currency.USD)


// Const
kMaColor = color.aqua
kNeutralColor = color.gray
kBearColor = color.red
kBullColor = color.green

kAlma = "ALMA"
kEma = "EMA"
kSma = "SMA"
kWma = "WMA"


// Input

vfi_length = input(8, title="Length", minval=1)  //default 130
vfi_coef = input(0.2, title="Coef", minval=0.1)
vfi_volCutoff = input(2.5, title="Volume Cutoff", minval=0.1)
vfi_smoothLen = input(3, title="Smoothing Period", minval=1)
vfi_smoothType = input(kEma, title="Smoothing Type", options=[kAlma, kEma, kSma, kWma])

//These are adde by me for the strategy purpose  BEGIN
vfi_buyLine = input(-4, title="Buy Line", minval=-10)
vfi_sellLine = input(5, title="Sell Line", minval=-10)
stopLoss = input(title="Stop Loss%", defval=5, minval=1)
//These are adde by me for the strategy purpose  END

vfi_longEMA = input(200, title="Long EMA", minval=1)
vfi_shortEMA1 = input(50, title="short EMA1", minval=1)
vfi_shortEMA2 = input(9, title="short EM2A", minval=1)

vfi_showTrend = input(false, title="Visualize Trend")
vfi_showFill = input(true, title="Apply Filling")
vfi_showMa = input(true, title="Show Moving Average")
vfi_maType = input(kSma, title="Moving Average Type", options=[kAlma, kEma, kSma, kWma])
vfi_maLength = input(30, title="Moving Average Length", minval=1)
vfi_almaOffset = input(0.85, title="• ALMA - Offset (global setting)", minval=0.0, maxval=1.0, step=0.05) // more smoothness (closer to 1) vs. more responsiveness (closer to 0)
vfi_almaSigma = input(6.0, title="• ALMA - Sigma (global setting)", minval=0.0, step=0.05) // the larger sigma the smoother ALMA


// Functionality

isRising(sig) =>
    sig > sig[1]
    
isFlat(sig) =>
    sig == sig[1]

vfi_trendColor(sig) =>
    isFlat(sig) ? kNeutralColor : isRising(sig) ? kBullColor : kBearColor
    
vfi_color(sig) =>
    isFlat(sig) ? kNeutralColor : sig > 0 ? kBullColor : kBearColor
    
osc_color(sig) =>
    sig == 0 ? kNeutralColor : sig > 0 ? kBullColor : kBearColor

smooth(t, sig, len) =>
    ma = float(sig)         // None
    if t == kSma            // Simple
        ma := sma(sig, len)
    if t == kEma            // Exponential
        ma := ema(sig, len)
    if t == kWma            // Weighted
        ma := wma(sig, len)
    if t == kAlma           // Arnaud Legoux
        ma := alma(sig, len, vfi_almaOffset, vfi_almaSigma)
    ma

calc_vfi(fviPeriod, smoothType, smoothLen, coef, vCoef) =>
    avg = nz(hlc3)
    inter = log(avg) - log(avg[1])
    vInter = stdev(inter, 30)
    cutOff = coef * vInter * close
    vAve = smooth(kSma, volume[1], fviPeriod)
    vMax = vAve * vCoef
    vC = min(volume, vMax)
    mf = avg - avg[1]
    vCp = iff(mf > cutOff, vC, iff(mf < -cutOff, -vC, 0))
    sVfi = sum(vCp, fviPeriod) / vAve
    vfi = smooth(smoothType, sVfi, smoothLen)
    
value_vfi = calc_vfi(vfi_length, vfi_smoothType, vfi_smoothLen, vfi_coef, vfi_volCutoff)
value_ma = smooth(vfi_maType, value_vfi, vfi_maLength)

longEMAval= ema(close, vfi_longEMA)
shortEMAval1= ema(close, vfi_shortEMA1)
shortEMAval2= ema(close, vfi_shortEMA2)

color_vfi = vfi_showTrend ? vfi_trendColor(value_vfi) : vfi_color(value_vfi)
color_osc = vfi_showFill ? osc_color(value_vfi) : na
color_ma = vfi_showMa ? kMaColor : na


// Drawings

plot_vfi = plot(value_vfi, title="VFI", color=color_vfi, linewidth=1)
plot_fill = plot(0, color=color_vfi, editable=false)
fill(plot_vfi, plot_fill, title="Oscillator Fill", color=color_osc, transp=75) 
hline(vfi_buyLine, color=color.green, title="Buy Line", linewidth=2, linestyle=hline.style_dashed)
hline(vfi_sellLine, color=color.purple, title="Sell Line", linewidth=2, linestyle=hline.style_dashed)
plot(value_ma, title="MA", color=color_ma, linewidth=2)

strategy.entry(id="VFI LE", long=true,  when=crossover(value_vfi,vfi_buyLine)  and ( shortEMAval1 >= longEMAval  ))

//strategy.close(id="VFI LE", comment="Exit",   when=crossunder(value_vfi,vfi_sellLine))
strategy.close(id="VFI LE", comment="TP Exit",   when=crossunder(value_vfi,vfi_sellLine) and close>strategy.position_avg_price)
//strategy.close(id="VFI LE", comment="Exit",   when=  (shortEMAval1 > shortEMAval2 )  and crossunder(close, shortEMAval2))

//stoploss
stopLossVal =   strategy.position_avg_price -  (strategy.position_avg_price*stopLoss*0.01) 
strategy.close(id="VFI LE", comment="SL Exit",   when=crossunder(value_vfi,vfi_sellLine) and close < stopLossVal)




Thêm nữa