Trend Mengikut Strategi Berdasarkan Penunjuk Aliran Volume

Penulis:ChaoZhang, Tarikh: 2023-10-10 14:51:13
Tag:

Ringkasan

Strategi ini melaksanakan trend selepas perdagangan berdasarkan Volume Flow Indicator (VFI). Ia menilai arah trend pasaran dengan mengira turun naik harga dan perubahan jumlah, dan merealisasikan pembelian rendah dan penjualan tinggi.

Prinsip Strategi

  1. Mengira penunjuk VFI: Mengira nilai VFI berdasarkan perubahan harga dan jumlah logaritma, dan meluruskan turun naik melalui teknik peluruskan.

  2. Menentukan arah trend: Pelanggaran VFI di atas 0 adalah isyarat kenaikan, manakala melintasi di bawah 0 adalah isyarat penurunan.

  3. Isyarat perdagangan: Pergi panjang apabila EMA cepat melintasi EMA perlahan dan VFI melintasi di atas garis beli; kedudukan dekat apabila VFI melintasi di bawah garis jual.

  4. Stop loss: Tetapkan peratusan stop loss tetap.

Strategi ini terutamanya bergantung kepada VFI untuk menentukan arah trend, digabungkan dengan purata bergerak untuk menjana isyarat perdagangan. VFI mencerminkan sentimen pasaran melalui turun naik harga dan perubahan jumlah, menjadikannya indikator trend berikut. Berbanding dengan penunjuk harga tunggal, VFI memberikan penilaian yang lebih komprehensif dan mengenal pasti titik pembalikan trend dengan lebih baik, menapis penyatuan.

Kelebihan

  1. VFI menentukan trend lebih baik daripada penunjuk harga tunggal, dengan berkesan menapis penyatuan dan pecah palsu.

  2. Purata bergerak memberikan penilaian tambahan, mengelakkan isyarat yang salah dari VFI di pasaran yang berbeza.

  3. Stop loss tetap mengawal risiko dan memudahkan pengurusan risiko.

  4. Trend mengikuti mod menjana pulangan yang berlebihan tanpa meramalkan pembalikan.

  5. Penyesuaian parameter yang fleksibel menyesuaikan diri dengan tempoh dan produk yang berbeza.

Risiko

  1. VFI boleh menghasilkan isyarat yang salah semasa turun naik yang ketara.

  2. Stop loss tetap boleh terlalu luas atau terlalu sempit.

  3. Tetapan kemasukan dan keluar yang tidak disusun dengan baik membawa kepada perdagangan yang berlebihan atau hilang.

  4. Mengikuti trend gagal menangkap pembalikan dan memerlukan stop loss yang tepat pada masanya.

  5. Parameter yang tidak betul menyebabkan kemasukan awal atau tertunda.

Peningkatan

  1. Mengoptimumkan pengiraan VFI dengan menyesuaikan parameter.

  2. Sempurnakan tempoh purata bergerak untuk masa isyarat yang lebih baik.

  3. Gunakan stop loss dinamik dan bukannya stop loss tetap.

  4. Tambah penunjuk lain untuk menapis isyarat.

  5. Mengoptimumkan parameter secara berasingan berdasarkan jangka masa.

  6. Uji ketahanan pada produk yang berbeza.

Kesimpulan

Strategi ini menentukan arah trend dengan VFI dan menggunakan purata bergerak untuk menapis isyarat yang salah. Ia merealisasikan pembelian rendah / penjualan tinggi melalui trend yang mengikuti tanpa meramalkan pembalikan. Kelebihannya terletak pada pengesanan trend yang unggul berbanding penunjuk harga tunggal dan keupayaan untuk menapis penyatuan. Risiko utama adalah menghasilkan isyarat yang salah semasa turun naik. Mengoptimumkan parameter, menambahkan penunjuk tambahan dan teknik stop loss dapat meningkatkan kestabihannya. Secara keseluruhan, dengan penyesuaian parameter dan pengoptimuman stop loss, strategi VFI ini boleh menjadi sistem trend yang boleh dipercayai.


/*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)




Lebih lanjut