Chiến lược theo xu hướng dựa trên các chỉ số khối lượng


Ngày tạo: 2023-10-10 14:51:13 sửa đổi lần cuối: 2023-10-10 14:51:13
sao chép: 0 Số nhấp chuột: 1032
1
tập trung vào
1617
Người theo dõi

Tổng quan

Chiến lược này dựa trên chỉ số khối lượng giao dịch (VFI) để thực hiện giao dịch theo xu hướng. Chiến lược này bằng cách tính toán biến động giá cổ phiếu và thay đổi khối lượng giao dịch, đánh giá xu hướng thị trường, để thực hiện 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 biến động đối số của giá cổ phiếu và khối lượng giao dịch, loại bỏ xung đột bằng cách xử lý trơn tru.

  2. Xác định xu hướng xu hướng: Xác 0 trên chỉ số VFI là tín hiệu đi lên, xác 0 dưới là tín hiệu đi xuống.

  3. Tín hiệu giao dịch: EMA nhanh vượt qua EMA chậm, và VFI vượt qua đường mua; VFI dưới đường bán tháo.

  4. Phương pháp dừng lỗ: thiết lập tỷ lệ dừng lỗ cố định.

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

Lợi thế chiến lược

  1. Chỉ số VFI đánh giá xu hướng tốt hơn chỉ số giá đơn, có thể lọc hiệu quả thị trường chấn động và phá vỡ giả.

  2. Hệ thống thống định vị hỗ trợ phán đoán, tránh chỉ số VFI phát ra tín hiệu sai trong thị trường chấn động.

  3. Thiết lập điểm dừng cố định để kiểm soát rủi ro, có lợi cho quản lý rủi ro.

  4. Sử dụng mô hình theo dõi xu hướng, không cần phải đoán điểm biến đổi của thị trường, theo dõi xu hướng có thể mang lại lợi nhuận.

  5. Thiết lập tham số linh hoạt, có thể điều chỉnh tham số theo thị trường, thích ứng với các chu kỳ và giống khác nhau.

Rủi ro chiến lược

  1. Các chỉ số VFI có thể phát ra tín hiệu sai trong một thị trường có biến động lớn.

  2. Điểm dừng cố định có thể quá lớn hoặc quá nhỏ, dẫn đến dừng quá sớm hoặc quá muộn.

  3. Nếu các tham số mua và bán được đặt không đúng, có thể dẫn đến giao dịch thường xuyên hoặc bị bỏ phiếu.

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

  5. Các tham số không đúng có thể dẫn đến quá sớm hoặc quá muộn.

Tối ưu hóa chiến lược

  1. Điều chỉnh tham số VFI, tối ưu hóa tính toán chỉ số.

  2. Điều chỉnh chu kỳ đường trung bình, tối ưu hóa thời gian phát tín hiệu.

  3. Động thái điều chỉnh điểm dừng, tối ưu hóa phương thức dừng.

  4. Kết hợp với các chỉ số khác để làm tăng chất lượng tín hiệu.

  5. Cấu trúc tham số tối ưu hóa cho chu kỳ lớn và chu kỳ nhỏ.

  6. Kiểm tra sức khỏe tham số của các giống khác nhau, nâng cao khả năng thích ứng tham số.

Tóm tắt

Chiến lược này dựa trên chỉ số VFI để xác định hướng xu hướng, kết hợp với hệ thống đồng bằng để lọc tín hiệu sai lệch. Bằng cách theo dõi xu hướng, bạn có thể mua và bán thấp hơn, không cần dự đoán sự đảo ngược cụ thể. Ưu điểm của chiến lược là đánh giá xu hướng tốt hơn chỉ số giá đơn lẻ, có thể lọc hiệu quả sự dao động. Rủi ro chính là có thể phát ra tín hiệu sai trong thị trường rung động. Bằng cách điều chỉnh tham số và thêm các chỉ số khác để hỗ trợ, bạn có thể nâng cao sự ổn định của chiến lược. Nói chung, chiến lược này dựa trên chỉ số VFI, sau khi tham số và dừng lỗ được tối ưu hóa, có thể trở thành một chiến lược theo dõi xu hướng đáng tin cậy.

Mã nguồn chiến lược
/*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)