Trend nach Strategie auf Basis des Volumenflussindikators

Schriftsteller:ChaoZhang, Datum: 2023-10-10 14:51:13
Tags:

Übersicht

Diese Strategie implementiert den Trend nach dem Handel auf der Grundlage des Volume Flow Indicators (VFI). Sie beurteilt die Markttrendrichtung durch Berechnung von Preisschwankungen und Volumenänderungen und realisiert niedrige Käufe und hohe Verkäufe.

Strategieprinzip

  1. Berechnung des VFI-Indikators: Berechnung des VFI-Wertes auf der Grundlage logarithmischer Preisänderungen und Volumen und Glättung von Schwankungen durch Glättungstechniken.

  2. Bestimmung der Trendrichtung: Ein Überschreiten von VFI über 0 ist ein Aufwärtssignal, ein Überschreiten unter 0 ist ein Bärensignal.

  3. Handelssignale: Gehen Sie lang, wenn die schnelle EMA über die langsame EMA und die VFI über die Kauflinie kreuzen; schließen Sie, wenn die VFI unter die Verkaufslinie geht.

  4. Stop-Loss: Festlegen eines festen Stop-Loss-Prozentsatzes.

Diese Strategie stützt sich hauptsächlich auf VFI, um die Trendrichtung zu bestimmen, kombiniert mit gleitenden Durchschnitten, um Handelssignale zu generieren. VFI spiegelt die Marktstimmung durch Preisvolatilität und Volumenänderungen wider und ist somit ein Trend-nachfolgender Indikator. Verglichen mit einzelnen Preisindikatoren liefert VFI umfassendere Urteile und identifiziert Trendumkehrpunkte besser und filtert Konsolidierungen aus.

Vorteile

  1. Die VFI ermitteln Trends besser als einzelne Preisindikatoren und filtern Konsolidierungen und falsche Ausbrüche effektiv aus.

  2. Gleitende Durchschnitte liefern ergänzende Beurteilungen und verhindern falsche Signale von FFI in unterschiedlichen Märkten.

  3. Festgelegte Stop-Loss-Verfahren kontrollieren das Risiko und erleichtern das Risikomanagement.

  4. Der Trend folgende Modus erzeugt übermäßige Renditen, ohne Umkehrungen vorherzusagen.

  5. Flexible Parameteranpassung an verschiedene Zeiträume und Produkte.

Risiken

  1. VFI kann bei erheblichen Schwankungen falsche Signale erzeugen.

  2. Der festgelegte Stop-Loss kann zu breit oder zu eng sein.

  3. Fehlkonfigurierte Ein- und Ausstiegseinstellungen führen zu Über- oder fehlenden Transaktionen.

  4. Der Trend folgt nicht, um Umkehrungen zu erfassen und benötigt rechtzeitige Stop-Loss.

  5. Falsche Parameter verursachen einen vorzeitigen oder verzögerten Einstieg.

Verbesserungen

  1. Optimierung der VFI-Berechnung durch Anpassung der Parameter.

  2. Feinabstimmungszeiträume des gleitenden Durchschnitts für bessere Signalzeit.

  3. Verwenden Sie dynamischen Stop-Loss anstelle eines festen.

  4. Hinzufügen anderer Indikatoren zu Filtersignalen.

  5. Optimieren Sie die Parameter je nach Zeitrahmen.

  6. Die Robustheit von verschiedenen Produkten wird getestet.

Schlussfolgerung

Diese Strategie bestimmt die Trendrichtung mit VFI und verwendet gleitende Durchschnitte, um falsche Signale auszufiltern. Sie realisiert niedrige Käufe / hohe Verkäufe durch Trendverfolgung, ohne Umkehrungen vorherzusagen. Der Vorteil liegt in ihrer überlegenen Trenddetektion gegenüber einzelnen Preisindikatoren und der Fähigkeit, Konsolidierungen auszufiltern. Das Hauptrisiko ist die Erzeugung falscher Signale während der Schwankungen. Die Optimierung von Parametern, das Hinzufügen zusätzlicher Indikatoren und Stop-Loss-Techniken kann ihre Stabilität verbessern. Insgesamt kann diese VFI-basierte Strategie mit Parameter-Tuning und Stop-Loss-Optimierungen zu einem zuverlässigen Trendverfolgungssystem werden.


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




Mehr