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.
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.
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.
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.
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.
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.
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.
Stop loss cố định kiểm soát rủi ro và tạo điều kiện quản lý rủi ro.
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.
Đ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.
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ể.
Stop loss cố định có thể quá rộng hoặc quá hẹp.
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.
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.
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.
Tối ưu hóa tính toán VFI bằng cách điều chỉnh các thông số.
Đ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.
Sử dụng stop loss động thay vì cố định.
Thêm các chỉ báo khác vào các tín hiệu lọc.
Tối ưu hóa các tham số riêng biệt dựa trên khung thời gian.
Kiểm tra độ bền trên các sản phẩm khác nhau.
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)