Tren Mengikuti Strategi Berdasarkan Indikator Aliran Volume

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

Gambaran umum

Strategi ini mengimplementasikan tren setelah perdagangan berdasarkan Volume Flow Indicator (VFI).

Prinsip Strategi

  1. Menghitung indikator VFI: Menghitung nilai VFI berdasarkan perubahan harga dan volume logaritma, dan meratakan osilasi melalui teknik meratakan.

  2. Tentukan arah tren: Pelanggaran VFI di atas 0 adalah sinyal bullish, sedangkan pelaksanaan di bawah 0 adalah sinyal bearish.

  3. Sinyal perdagangan: Pergi panjang ketika EMA cepat melintasi EMA lambat dan VFI melintasi di atas garis beli; posisi dekat ketika VFI melintasi di bawah garis jual.

  4. Stop loss: Tetapkan persentase stop loss tetap.

Strategi ini terutama mengandalkan VFI untuk menentukan arah tren, dikombinasikan dengan moving average untuk menghasilkan sinyal perdagangan. VFI mencerminkan sentimen pasar melalui volatilitas harga dan perubahan volume, menjadikannya indikator trend berikut. Dibandingkan dengan indikator harga tunggal, VFI memberikan penilaian yang lebih komprehensif dan mengidentifikasi titik pembalikan tren dengan lebih baik, menyaring konsolidasi.

Keuntungan

  1. VFI menentukan tren lebih baik daripada indikator harga tunggal, secara efektif menyaring konsolidasi dan pecah palsu.

  2. Rata-rata bergerak memberikan penilaian tambahan, menghindari sinyal yang salah dari VFI di pasar yang bervariasi.

  3. Stop loss tetap mengendalikan risiko dan memfasilitasi manajemen risiko.

  4. Trend mode berikut menghasilkan hasil yang berlebihan tanpa memprediksi pembalikan.

  5. Penyesuaian parameter yang fleksibel beradaptasi dengan periode dan produk yang berbeda.

Risiko

  1. VFI dapat menghasilkan sinyal yang salah selama fluktuasi yang signifikan.

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

  3. Pengaturan masuk dan keluar yang tidak benar mengarah pada perdagangan yang berlebihan atau hilang.

  4. Mengikuti tren gagal menangkap pembalikan dan membutuhkan stop loss yang tepat waktu.

  5. Parameter yang tidak tepat menyebabkan awal atau penundaan masuk.

Peningkatan

  1. Mengoptimalkan perhitungan VFI dengan menyesuaikan parameter.

  2. Perhitungan rata-rata bergerak untuk waktu sinyal yang lebih baik.

  3. Gunakan stop loss dinamis alih-alih stop loss tetap.

  4. Tambahkan indikator lain ke sinyal filter.

  5. Optimalkan parameter secara terpisah berdasarkan jangka waktu.

  6. Uji ketahanan pada produk yang berbeda.

Kesimpulan

Strategi ini menentukan arah tren dengan VFI dan menggunakan moving averages untuk menyaring sinyal yang salah. Strategi ini mewujudkan pembelian rendah / penjualan tinggi melalui tren mengikuti tanpa memprediksi pembalikan. Keuntungannya terletak pada deteksi tren yang unggul dibandingkan indikator harga tunggal dan kemampuan untuk menyaring konsolidasi. Risiko utama adalah menghasilkan sinyal yang salah selama fluktuasi. Mengoptimalkan parameter, menambahkan indikator tambahan dan teknik stop loss dapat meningkatkan stabilitasnya. Secara keseluruhan, dengan penyesuaian parameter dan pengoptimalan stop loss, strategi VFI ini dapat menjadi sistem trend berikut yang dapat diandalkan.


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