Strategi mengikut arah aliran berdasarkan penunjuk volum


Tarikh penciptaan: 2023-10-10 14:51:13 Akhirnya diubah suai: 2023-10-10 14:51:13
Salin: 0 Bilangan klik: 1032
1
fokus pada
1617
Pengikut

Gambaran keseluruhan

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.

Prinsip Strategi

  1. Mengira Indeks VFI: Mengira nilai VFI berdasarkan perubahan logaritma harga saham dan jumlah urus niaga, menghapuskan gegaran dengan pemprosesan yang lancar.

  2. Menentukan arah trend: penembusan 0 pada penunjuk VFI sebagai isyarat bullish, penembusan 0 di bawah isyarat bearish.

  3. 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

  4. 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.

Kelebihan Strategik

  1. Indeks VFI menilai trend lebih baik daripada satu-satunya indikator harga, yang dapat menyaring pasaran goyah dan penembusan palsu.

  2. Sistem garis rata membantu penghakiman, mengelakkan petunjuk VFI menghantar isyarat yang salah di bandar yang bergolak.

  3. Menetapkan risiko kawalan titik berhenti tetap, yang membantu pengurusan risiko.

  4. Menggunakan model trend-following, anda boleh mendapatkan keuntungan tambahan dengan mengikuti trend tanpa perlu meneka titik perubahan pasaran.

  5. Tetapan parameter fleksibel, parameter boleh disesuaikan mengikut pasaran, menyesuaikan diri dengan pelbagai kitaran dan varieti.

Risiko Strategik

  1. Dalam pasaran yang bergolak, VFI mungkin memberi isyarat yang salah.

  2. Titik hentian tetap mungkin terlalu besar atau terlalu kecil, menyebabkan hentian terlalu awal atau terlalu lewat.

  3. Jika parameter pembelian dan penjualan tidak ditetapkan dengan betul, ia boleh menyebabkan transaksi yang kerap atau hilang.

  4. Strategi trend-following tidak dapat menangkap pembalikan dan memerlukan penangguhan tepat pada masanya.

  5. Parameter yang tidak betul boleh menyebabkan kemasukan terlalu awal atau terlambat.

Pengoptimuman Strategi

  1. Menyesuaikan parameter VFI, mengoptimumkan pengiraan indikator.

  2. Menyesuaikan kitaran garis rata-rata, mengoptimumkan masa isyarat.

  3. Mengubah titik henti secara dinamik, mengoptimumkan cara henti.

  4. Berpadu dengan penapis indikator lain, meningkatkan kualiti isyarat.

  5. Kombinasi parameter yang dioptimumkan untuk kitaran besar dan kecil.

  6. Uji kecergasan parameter pelbagai jenis untuk meningkatkan kebolehan adaptasi parameter.

ringkaskan

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.

Kod sumber strategi
/*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)