Strategi ini berdasarkan indikator jumlah transaksi (VFI) untuk mencapai perdagangan mengikut trend. Strategi ini menilai arah trend pasaran dengan mengira turun naik harga saham dan perubahan jumlah transaksi, untuk mencapai pembelian rendah dan penjualan tinggi.
Mengira Indeks VFI: Mengira nilai VFI berdasarkan perubahan logaritma harga saham dan jumlah urus niaga, menghapuskan gegaran dengan pemprosesan yang lancar.
Menentukan arah trend: penembusan 0 pada penunjuk VFI sebagai isyarat bullish, penembusan 0 di bawah isyarat bearish.
Isyarat dagangan: EMA cepat melalui EMA perlahan, dan VFI melakukan lebih banyak ketika memasuki garis beli; di bawah VFI, posisi rata ketika keluar dari garis jual
Kaedah Hentikan Kerosakan: Tetapkan nisbah Hentikan Kerosakan tetap.
Strategi ini bergantung kepada penunjuk VFI untuk menentukan arah trend, dan memberi isyarat perdagangan. Penunjuk VFI mencerminkan sentimen pasaran melalui turun naik harga saham dan perubahan jumlah perdagangan.
Indeks VFI menilai trend lebih baik daripada satu-satunya indikator harga, yang dapat menyaring pasaran goyah dan penembusan palsu.
Sistem garis rata membantu penghakiman, mengelakkan petunjuk VFI menghantar isyarat yang salah di bandar yang bergolak.
Menetapkan risiko kawalan titik berhenti tetap, yang membantu pengurusan risiko.
Menggunakan model trend-following, anda boleh mendapatkan keuntungan tambahan dengan mengikuti trend tanpa perlu meneka titik perubahan pasaran.
Tetapan parameter fleksibel, parameter boleh disesuaikan mengikut pasaran, menyesuaikan diri dengan pelbagai kitaran dan varieti.
Dalam pasaran yang bergolak, VFI mungkin memberi isyarat yang salah.
Titik hentian tetap mungkin terlalu besar atau terlalu kecil, menyebabkan hentian terlalu awal atau terlalu lewat.
Jika parameter pembelian dan penjualan tidak ditetapkan dengan betul, ia boleh menyebabkan transaksi yang kerap atau hilang.
Strategi trend-following tidak dapat menangkap pembalikan dan memerlukan penangguhan tepat pada masanya.
Parameter yang tidak betul boleh menyebabkan kemasukan terlalu awal atau terlambat.
Menyesuaikan parameter VFI, mengoptimumkan pengiraan indikator.
Menyesuaikan kitaran garis rata-rata, mengoptimumkan masa isyarat.
Mengubah titik henti secara dinamik, mengoptimumkan cara henti.
Berpadu dengan penapis indikator lain, meningkatkan kualiti isyarat.
Kombinasi parameter yang dioptimumkan untuk kitaran besar dan kecil.
Uji kecergasan parameter pelbagai jenis untuk meningkatkan kebolehan adaptasi parameter.
Strategi ini berdasarkan kepada petunjuk VFI untuk menentukan arah trend, dengan sistem perpaduan dengan isyarat kesilapan penapisan. Melalui pemantauan trend untuk mencapai harga rendah dan harga tinggi, tidak perlu meramalkan perubahan tertentu. Kelebihan strategi adalah menilai trend lebih baik daripada petunjuk harga tunggal, yang dapat menapis gegaran dengan berkesan. Risiko utama adalah bahawa isyarat yang salah mungkin dikeluarkan di pasaran yang bergolak.
/*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)