Relative Volumenprozentsatz Momentum-Handelsstrategie

RVPR ATR SL/TP MA EMA SMMA WMA JMA T3
Erstellungsdatum: 2025-07-04 11:27:18 zuletzt geändert: 2025-07-04 11:27:18
Kopie: 9 Klicks: 259
2
konzentrieren Sie sich auf
319
Anhänger

Relative Volumenprozentsatz Momentum-Handelsstrategie Relative Volumenprozentsatz Momentum-Handelsstrategie

Überblick

Die Strategie ist ein integriertes Handelssystem, das die Analyse der Transaktionsdynamik, die Filterung des Preisverhaltens, die Durchbruchdetektion und die dynamische Stop-Loss-Logik kombiniert. Im Mittelpunkt der Strategie steht die Identifizierung der Momente, in denen der Transaktionsvolumen expandiert oder schrumpft, durch die Berechnung eines Williams %R-ähnlichen Indikators für den relativen Transaktionsvolumen (RVPR) in Verbindung mit einem Doppel-Evenline-Filter (Fast- und Slow Moving Average). Die Strategie wird weiter durch einen konfigurierbaren Preisverhaltensfilter ausgewählt, um die Bedingungen des Spiels genau zu bestimmen, basierend auf verschiedenen Arten von Putsch-Grafiken.

Strategieprinzip

Das Kernprinzip dieser Strategie besteht darin, die Transaktionsmenge in Prozentbereiche umzuwandeln und die Beziehung zwischen der aktuellen Transaktionsmenge und ihrer historischen Reichweite mit einer Berechnungsmethode wie Williams %R zu analysieren. Die Strategie verwendet die folgenden Schlüsselkomponenten, um ein Transaktionssignal zu erzeugen:

  1. Relative Transaktionsrate%R-Oszillator: Vergleicht die aktuelle Transaktionsrate mit den Höchst- und Tiefstwerten der historischen Transaktionsrate und berechnet die relative Position. Dieser Indikator ähnelt dem Williams %R im Bereich der Preise, wird jedoch für Transaktionsdaten verwendet.

  2. Dual Moving Average Filter: Die Strategie verwendet zwei Umsatz Moving Averages (Fast und Slow), wobei verschiedene Smoothing-Algorithmen (SMA, EMA, JMA, T3, Super Smoother usw.) zur Auswahl stehen. Wenn der Umsatz größer ist als der schnelle Durchschnitt und der schnelle Durchschnitt größer ist als der langsame Durchschnitt, kann ein Mehrwertsignal verwendet werden, um einen Aufwärtstrend des Umsatzes anzuzeigen; umgekehrt.

  3. Filter für die Preisbewegung: Filtern Sie weitere Handelssignale nach verschiedenen Filterformaten:

    • Einfaches Modell: Grundsätzliche Anstieg/Abstieg
    • Filtermodus: Feststellung der Stärke auf Basis des Bereichs
    • Das Radikalmodell: Durchbrüche auf Basis von Dynamik
    • Innenmodus: Umkehrform
  4. Durchbrechen des Filters: Trades in der Nähe der Höhen/Tiefen der fünf Ecken können selektiv ausgeschlossen werden, um Geschäfte zu vermeiden, bei denen das Risiko im Vergleich zum Ertrag schlechter ist.

  5. Stopp- und Stopp-Systeme: Dynamische Stopp-/Stopp-Mechanismen basierend auf ATR (Average True Range) können mit einer Multiplikation konfiguriert werden, um die Stopp- und Stopp-Distanz anzupassen.

  6. Zeit des Ausstiegs: Es ist möglich, den Handel nach einer bestimmten Anzahl von Stichen zu beenden.

Mehrköpfige Einstiegsbedingungen sind: Transaktionsvolumen größer als der schnelle gleitende Durchschnitt, der schnelle gleitende Durchschnitt größer als der langsame gleitende Durchschnitt, relative Transaktionsvolumen% R größer als die Schwelle, der Preis durch den mehrköpfigen Richtungsfilter, und die Option unter dem jüngsten Breakout-Hochpunkt. Leerköpfige Einstiegsbedingungen sind umgekehrt und lösen eine Pause bei den festgelegten Ausstiegsbedingungen aus.

Strategische Vorteile

  1. Multidimensionelle Analyse: Die Strategie kombiniert die Handelsmenge, die Preisbewegung und die Stop/Stop-Dynamik und bietet einen umfassenden Rahmen für die Marktanalyse.

  2. Die Strategie bietet eine Vielzahl von Parametern an, die angepasst werden können, einschließlich der Kontrolle der Handelsrichtung, der Filtermodelle für verschiedene Preisverhaltensweisen und der Wahl des Types der Transaktionsvolumen-Moving-Average, die es dem Händler ermöglichen, nach seinem Stil und seinen Marktpräferenzen anzupassen.

  3. Intelligente Eintrittsfilterung: Durch die Kombination von Umsatzdynamik und Preisverhaltensmustern kann die Strategie Handelschancen mit höherer Wahrscheinlichkeit erkennen und damit minderwertige Handelssignale vermeiden.

  4. Flexible Ausstiegsmechanismen: Die Strategie bietet zeit- und preisbasierte Ausstiegsoptionen, einschließlich fester Bar-Ausstiegs und dynamischer Stop-Loss-Stopps auf Basis von ATR, was das Risikomanagement flexibler und effektiver macht.

  5. Anpassung an verschiedene Marktumgebungen: Die Strategie kann an verschiedene Marktbedingungen angepasst werden, einschließlich Trends und Intervallmärkte, durch verschiedene Modelle der Preisbewegung (einfache, filternde, aggressive, interne).

  6. Die Strategie integriert mehrere hochmoderne Moving Average-Typen, wie JMA, T3 und Super Smoother, die hervorragend funktionieren, um Geräusche zu reduzieren und echte Trends zu erfassen.

Strategisches Risiko

  1. Risiko der Parameteroptimierung: Da die Strategie mehrere einstellbare Parameter enthält, besteht das Risiko einer Überoptimierung, die zu einer guten historischen Rückmeldung führen kann, aber zu einer schlechten Wirksamkeit in der Praxis. Die Lösung besteht in der Verwendung von Forward-Testing und Robustheitsanalyse, um sicherzustellen, dass die Parameter unter verschiedenen Marktbedingungen stabil bleiben.

  2. Falsche Durchbruchrisiken: Ein Umsatzanstieg muss nicht immer mit einer nachhaltigen Preisentwicklung einhergehen. Die Strategie kann bei einem falschen Durchbruch ein falsches Signal erzeugen. Dieses Risiko kann durch das Hinzufügen zusätzlicher Bestätigungsindikatoren oder die Verzögerung des Eintritts verringert werden.

  3. Marktumfeld-Abhängigkeit: Die Strategie kann in verschiedenen Marktumgebungen (z. B. hohe Volatilität vs. niedrige Volatilität) nicht gleichmäßig funktionieren. Es wird empfohlen, die Strategie vor der Umsetzung unter verschiedenen Marktbedingungen zu testen.

  4. Stop-Trigger-Risiko: Ein Stop mit ATR-Basis kann bei plötzlicher Erweiterung der Volatilität ausgelöst werden. Es kann effektiver sein, einen Stop-Multiplikator mit einer Volatilitätsanpassung zu verwenden oder den Stop an wichtigen Unterstützungs-/Widerstandspunkten einzustellen.

  5. Der Zeitpunkt des Ausstiegs ist nicht flexibel: Ein Aussteigen mit einer festen Stange kann zu früh zu einem profitablen Handel führen oder zu spät zu einem verlustreichen Handel. Der Zeitpunkt des Ausstiegs kann in Kombination mit Trends oder Dynamikindikatoren dynamisch angepasst werden.

  6. Komplexität der Berechnung: Die Strategie verwendet eine Vielzahl von komplexen Moving-Average-Algorithmen und Konditionskombinationen, die die Rechenlast erhöhen und zu Verzögerungen bei der Ausführung führen können. In Echtzeit-Transaktionen können bestimmte rechenintensive Kennzahlen vereinfacht werden.

Richtung der Strategieoptimierung

  1. Dynamische Threshold-Anpassung: Die aktuelle Strategie verwendet einen festen, relativen Umsatz% R-Threshold (< 27), wobei eine automatische Anpassung der Threshold-Anpassung an die jüngste Umsatz-Volatilität in Betracht gezogen werden kann. Dies ermöglicht eine bessere Anpassung der Strategie an verschiedene Marktbedingungen und saisonale Veränderungen.

  2. Multi-Zeitrahmen-Bestätigung: Die Einführung von Bestätigungssignalen für höhere Zeitrahmen, die nur in Richtung des größeren Trends handeln, kann die Gewinnrate und die Risiko-Rendite der Strategie verbessern. Zum Beispiel wird das Multi-Head-Signal auf der Stundenlinie nur ausgeführt, wenn die Tageslinie aufwärts tritt.

  3. Qualitätsanalyse des Umsatzes: Zusätzlich zum relativen Umsatz kann ein Umsatzdifferenzierungsindikator oder eine Umsatzverteilungsanalyse verwendet werden, um die Qualität des Umsatzes zu bewerten und nicht nur die Quantität. Dies hilft, gesunde Trends zu unterscheiden, um den Umsatz zu bestätigen und potenziell erschöpfte Signale zu erkennen.

  4. Intelligente Stop/Stopps: Die derzeitige ATR-basierte Stop/Stopp kann zu intelligenten Systemen umgebaut werden, beispielsweise auf Basis von wichtigen Support-/Resistenzpositionen oder mit variablen Anpassungen, die den Stop bei niedrigen Schwankungen schärfen und den Stop bei hohen Schwankungen lockern.

  5. Integration von Marktstrukturen: Die Integration von Analyse von Preisstrukturen (z. B. Unterstützung/Widerstand, Trendlinien, Preiskanäle) in die Strategie kann die Qualität von Einstiegs- und Ausstiegspunkten verbessern.

  6. Erhöhung des Risikomanagements: Dynamische Positionsanpassungen basierend auf der aktuellen Marktvolatilität und der jüngsten Strategieergebnisse, Erhöhung der Positionen in einem Umfeld mit hoher Gewinnrate und Verringerung der Positionen in unsicheren Zeiten.

  7. Machine Learning Integration: Die Verwendung von Machine Learning-Algorithmen zur dynamischen Optimierung von Strategieparametern oder zur Vorhersage, welche Filter für das Preisverhalten unter den aktuellen Marktbedingungen am effektivsten sind, kann die Strategieleistung weiter verbessern.

Zusammenfassen

Die Relative Volume Percentage Dynamic Trading Strategy ist ein umfassendes und flexibles Handelssystem, das durch die Kombination von Volumenanalyse, mehreren Preisverhaltensfiltern und dynamischen Risikomanagementtechnologien einen Händler mit einem leistungsstarken Werkzeug zur Identifizierung potenzieller Marktchancen versorgt. Die Kernvorteile der Strategie liegen in ihrer Anpassungsfähigkeit und Anpassbarkeit, die es dem Händler ermöglicht, sich an individuelle Vorlieben und Marktbedingungen anzupassen.

Die Strategie eignet sich insbesondere für Trader, die auf der Suche nach Signalen für eine Umkehrung oder Fortsetzung des Trends sind, die auf der Bestätigung des Handelsvolumens basieren. Durch die Verwendung eines relativen Handelsvolumensindikators im Williams% R-Stil ist es möglich, Handelsvolumensprünge zu identifizieren, die häufig wichtige Veränderungen oder Trendbeschleunigungen in der Marktmotivation darstellen. Darüber hinaus ermöglichen mehrere Preisverhaltensfilteroptionen den Händlern die Auswahl von konservativeren oder aggressiveren Eingangsbedingungen, die auf ihre Risikopräferenzen und ihren Handelsstilen basieren.

Obwohl diese Strategie viele Vorteile bietet, sollten Händler auf potenzielle Überoptimierungsrisiken und Marktumfeldabhängigkeiten achten. Durch kontinuierliche Tests und Anpassungen in Kombination mit der empfohlenen Optimierungsrichtung können Händler die Stabilität und langfristige Profitabilität dieser Strategie weiter verbessern. Schließlich liegt der Schlüssel zum Erfolg, wie bei allen Handelsstrategien, in einem tiefen Verständnis ihrer Prinzipien, einem klugen Risikomanagement und einer kontinuierlichen Bewertung ihrer Leistung unter verschiedenen Marktbedingungen.

Strategiequellcode
/*backtest
start: 2024-07-04 00:00:00
end: 2025-07-02 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/

// This Pine Script® code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © GabrielAmadeusLau

//@version=6
strategy("Relative Volume Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)

// === Input: Trade Direction === //
tradeDirection = input.string("Long Only", title="Trade Direction", options=["Long Only", "Short Only", "Both"], group="Strategy Settings")
dirBarModeL     = input.string("Simple", title="Long Directional Bar Mode", options=["Simple", "Filtered", "Aggressive", "Inside", "Filtered & Aggressive", "Filtered & Aggressive & Inside", "Without"], group="Strategy Settings")
dirBarModeS     = input.string("Inside", title="Short Directional Bar Mode", options=["Simple", "Filtered", "Aggressive", "Inside", "Filtered & Aggressive", "Filtered & Aggressive & Inside", "Without"], group="Strategy Settings")
useBreakout  = input.bool(true, "Use Breakout Filter", group="Strategy Settings")
useSLTP = input.bool(false, "Use Stop Loss & Take Profit", group="Strategy Settings")
atrSLMult = input.float(1, "ATR SL Multiplier", step = 0.05, group="Strategy Settings")
atrTPMult = input.float(1.75, "ATR TP Multiplier", step = 0.05, group="Strategy Settings")


// === Input: MA Function Selector === //
// — T3 Moving Average Function —
// src    = input source (e.g. rsi1, close, etc.)
// length = smoothing length (period)
// a      = T3 alpha (commonly between 0.7 and 0.9)
t3(src, length, a) =>
    e1 = ta.ema(src, length)
    e2 = ta.ema(e1, length)
    e3 = ta.ema(e2, length)
    e4 = ta.ema(e3, length)
    e5 = ta.ema(e4, length)
    e6 = ta.ema(e5, length)
    c1 = -a * a * a
    c2 = 3 * a * a + 3 * a * a * a
    c3 = -6 * a * a - 3 * a - 3 * a * a * a
    c4 = 1 + 3 * a + a * a * a + 3 * a * a
    c1 * e6 + c2 * e5 + c3 * e4 + c4 * e3

// == Jurik MA == //
jma(float src, int length, float power, float phase) => 
    phaseRatio = phase < -100 ? 0.5 : phase > 100 ? 2.5 : phase / 100 + 1.5
    beta = 0.45 * (length - 1) / (0.45 * (length - 1) + 2)
    alpha = math.pow(beta, power)
    JMA = 0.0
    e0 = 0.0
    e0 := (1 - alpha) * src + alpha * nz(e0[1])
    e1 = 0.0
    e1 := (src - e0) * (1 - beta) + beta * nz(e1[1])
    e2 = 0.0
    e2 := (e0 + phaseRatio * e1 - nz(JMA[1])) * math.pow(1 - alpha, 2) + math.pow(alpha, 2) * nz(e2[1])
    JMA := e2 + nz(JMA[1])

//===== 2 Pole Super Smoother Filter =====//
superSmoother(float Series, float Period) =>
    var float ALPHA =  math.pi * math.sqrt(2.0) / Period
    var float BETA  =  math.exp(-ALPHA )
    var float COEF2 = -math.pow(BETA, 2)
    var float COEF1 =  math.cos( ALPHA ) * 2.0 * BETA
    var float COEF0 =  1.0 - COEF1 - COEF2
    float sma2   = math.avg(Series, nz(Series[1], Series))
    float smooth = na, smooth := COEF0 *      sma2      +
                                 COEF1 *  nz(smooth[1]) +
                                 COEF2 *  nz(smooth[2])

// === MA Selector === //
ma(source, length, type) =>
    type == "SMA"       ? ta.sma(source, length) :
     type == "EMA"       ? ta.ema(source, length) :
     type == "SMMA (RMA)"? ta.rma(source, length) :
     type == "WMA"       ? ta.wma(source, length) :
     type == "VWMA"      ? ta.vwma(source, length) :
     type == "HMA"       ? ta.hma(source, length) : 
     type == "ALMA"      ? ta.alma(source, length, 0.85, 6) :
     type == "LSMA"      ? ta.linreg(source, length, 0) :
     type == "Optimal MA"? math.avg(ta.alma(source, length, 0.85, 6), ta.rma(source, length), ta.sma(source, length)) :
     type == "JMA"       ? jma(source, length, 2, 50) :        
     type == "Super Smoother" ? superSmoother(source, length) :
     type == "T3"        ? t3(source, length, 0.7) :
                          na

// === Input Parameters === //
rvolRLength       = input.int(112, title="Relative Volume %R Length", minval=1, group="Relative Volume", tooltip="%R used for scaling from 0 to 100, I prefer 73 or 112.")
rvolmaTypeInput   = input.string("Optimal MA" , "Type", options = ["None", "SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA", "HMA", "ALMA", "LSMA", "Optimal MA", "JMA", "Super Smoother", "T3"], group = "Relative Volume")
rvolFastLength    = input.int(7, title="Relative Volume Fast MA", minval=1, group="Relative Volume")
rvolSlowLength    = input.int(161, title="Relative Volume Slow MA", minval=1, group="Relative Volume")
exitBars          = input.int(18, title="Bars Until Exit", group="Strategy Settings", tooltip="Exit trade after N bars")
rvolThreshold = input.int(27, "Minimum Relative Volume %R Threshold", group="Relative Volume")

// === Williams %R for Volume === //
wpr(src, length) =>
    max_ = ta.highest(src, length)
    min_ = ta.lowest(src, length)
    (100 * (src - max_) / (max_ - min_)) * -1

// === Volume MAs === //
rvol      = wpr(volume, rvolRLength)
rvolFast  = ma(volume, rvolFastLength, rvolmaTypeInput)
rvolSlow  = ma(volume, rvolSlowLength, rvolmaTypeInput)

// === Price Action Filters === //
up            = close > open
upRange       = low > low[1] and close > high[1]
upRange_Aggr  = close > close[1] and close > open[1]
insideDayUp   = close < close[1] and close[1] < close[2] and close[2] < close[3] and close[3] < close[4] and close[4] < close[5] //and not (close > close[1])
down          = close < open
downRange     = high < high[1] and close < low[1]
downRange_Aggr= close < close[1] and close < open[1]
insideDayDown = close > close[1] and close[1] > close[2] and close[2] > close[3] and close[3] > close[4] and close[4] > close[5] //and not (close < close[1])
breakoutHigh = ta.highest(high, 5)
breakoutLow  = ta.lowest(low, 5)

// === Mode-Based Filter Logic === //
longBarOK =
     dirBarModeL == "Simple" ? up :
     dirBarModeL == "Filtered"  ? upRange :
     dirBarModeL == "Aggressive"? upRange_Aggr :
     dirBarModeL == "Inside"? insideDayUp : 
     dirBarModeL == "Filtered & Aggressive" ? upRange or upRange_Aggr :
     dirBarModeL == "Filtered & Aggressive & Inside" ? upRange or upRange_Aggr or insideDayUp :
     dirBarModeL == "Without"   ? true : false

shortBarOK =
     dirBarModeS == "Simple" ? down :
     dirBarModeS == "Filtered"  ? downRange :
     dirBarModeS == "Aggressive"? downRange_Aggr :
     dirBarModeS == "Inside"? insideDayDown :
     dirBarModeS == "Filtered & Aggressive"? downRange or downRange_Aggr or insideDayDown :
     dirBarModeS == "Filtered & Aggressive & Inside"? upRange_Aggr or insideDayDown :
     dirBarModeS == "Without"   ? true : false

// === Entry & Exit Logic === //
longCondition  = volume > rvolFast and rvolFast > rvolSlow and longBarOK  and rvol > rvolThreshold and (not useBreakout or close < breakoutHigh)
shortCondition = volume < rvolFast and rvolFast < rvolSlow and shortBarOK and rvol < (100 - rvolThreshold) and (not useBreakout or close > breakoutLow)

exitLongCondition  = strategy.opentrades > 0 and strategy.opentrades.entry_bar_index(0) + exitBars <= bar_index and strategy.opentrades.entry_id(0) == "Long"
exitShortCondition = strategy.opentrades > 0 and strategy.opentrades.entry_bar_index(0) + exitBars <= bar_index and strategy.opentrades.entry_id(0) == "Short"

atr = ta.atr(math.round(math.avg(rvolFastLength, rvolSlowLength)))
longSL = useSLTP ? close - atrSLMult * atr : na
longTP = useSLTP ? close + atrTPMult * atr : na
shortSL = useSLTP ? close + atrSLMult * atr : na
shortTP = useSLTP ? close - atrTPMult * atr : na

// === Strategy Execution === //
if (tradeDirection == "Long Only" or tradeDirection == "Both")
    if (longCondition)
        strategy.entry("Long", strategy.long, stop=longSL, limit=longTP)

if (tradeDirection == "Short Only" or tradeDirection == "Both")
    if (shortCondition)
        strategy.entry("Short", strategy.short, stop=shortSL, limit=shortTP)

if (exitLongCondition)
    strategy.close("Long")

if (exitShortCondition)
    strategy.close("Short")

// === Plotting === //
plot(rvol, title="Relative Volume %R", color=color.orange, style = plot.style_columns, format = format.price)
plot(rvolFast, title="Fast Volume MA", color=color.green, format = format.volume)
plot(rvolSlow, title="Slow Volume MA", color=color.red, format = format.volume)