Tendance à la suite d'une stratégie basée sur l'indicateur de flux de volume

Auteur:ChaoZhang est là., Date: 2023-10-10 14:51:13
Les étiquettes:

Résumé

Cette stratégie met en œuvre la tendance après la négociation basée sur l'indicateur de flux de volume (VFI).

Principe de stratégie

  1. Calcul de l'indicateur VFI: calculer la valeur VFI sur la base de la variation logarithmique des prix et du volume, et lisser les oscillations par des techniques d'affiner.

  2. Déterminez la direction de la tendance: un VFI dépassant 0 est un signal haussier, tandis qu'un VFI dépassant 0 est un signal baissier.

  3. Signal de négociation: passez à long lorsque la EMA rapide dépasse la EMA lente et que les VFI dépassent la ligne d'achat; position close lorsque les VFI dépassent la ligne de vente.

  4. Stop-loss: pourcentage fixe de stop-loss.

Cette stratégie repose principalement sur le VFI pour déterminer la direction de la tendance, combiné avec des moyennes mobiles pour générer des signaux de trading.

Les avantages

  1. Le VFI détermine mieux les tendances que les indicateurs de prix uniques, filtrant efficacement les consolidations et les fausses écarts.

  2. Les moyennes mobiles fournissent des jugements complémentaires, évitant ainsi les signaux erronés émis par les FPI sur les marchés en évolution.

  3. Le stop loss fixe permet de contrôler le risque et de faciliter la gestion du risque.

  4. Le mode suivant la tendance génère des rendements excessifs sans prévoir des renversements.

  5. Le réglage des paramètres est flexible et s'adapte à différentes périodes et produits.

Les risques

  1. Le VFI peut générer des signaux incorrects lors de fluctuations importantes.

  2. Le stop loss fixe peut être trop large ou trop étroit.

  3. Les paramètres d'entrée et de sortie mal configurés entraînent une survente ou une absence de transactions.

  4. Le suivi de la tendance ne permet pas de capter les renversements et nécessite un arrêt-perte rapide.

  5. Des paramètres incorrects provoquent une entrée prématurée ou retardée.

Améliorations

  1. Optimiser le calcul des VFI en ajustant les paramètres.

  2. Périodes de moyenne mobile afin d'améliorer le timing du signal.

  3. Utilisez un stop loss dynamique au lieu d'un stop loss fixe.

  4. Ajouter d'autres indicateurs aux signaux filtrés.

  5. Optimiser les paramètres séparément en fonction du délai.

  6. Tester la robustesse sur différents produits.

Conclusion

Cette stratégie détermine la direction de la tendance avec VFI et utilise des moyennes mobiles pour filtrer les mauvais signaux. Elle réalise des achats faibles / des ventes élevées en suivant la tendance sans prédire des renversements. L'avantage réside dans sa détection de tendance supérieure aux indicateurs de prix uniques et sa capacité à filtrer les consolidations. Le principal risque est de générer des signaux incorrects pendant les fluctuations. L'optimisation des paramètres, l'ajout d'indicateurs supplémentaires et des techniques de stop loss peuvent améliorer sa stabilité.


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




Plus de