Exponentieller gleitender Durchschnitt und kumulative Volumenzyklus-Crossover-Strategie der dynamischen Handelstheorie

EMA CVP AVWP TOD
Erstellungsdatum: 2025-01-06 11:45:38 zuletzt geändert: 2025-01-06 11:45:38
Kopie: 1 Klicks: 346
1
konzentrieren Sie sich auf
1617
Anhänger

Exponentieller gleitender Durchschnitt und kumulative Volumenzyklus-Crossover-Strategie der dynamischen Handelstheorie

Überblick

Bei dieser Strategie handelt es sich um ein Handelssystem, das den Exponential Moving Average (EMA) und den Cumulative Volume Period (CVP) kombiniert. Es erfasst Wendepunkte in Markttrends durch die Analyse der Kreuzungspunkte des exponentiellen gleitenden Durchschnittspreises und des kumulierten volumengewichteten Preises. Die Strategie verfügt über integrierte Zeitfilter, die die Handelszeiten begrenzen und das automatische Schließen von Positionen am Ende des Handelszeitraums unterstützen können. Die Strategie bietet zwei verschiedene Ausstiegsmethoden: Reverse Cross Exit und Custom CVP Exit, was sie flexibler und anpassungsfähiger macht.

Strategieprinzip

Die Kernlogik der Strategie basiert auf den folgenden Schlüsselberechnungen:

  1. Berechnen Sie den Durchschnittspreis (AVWP): Multiplizieren Sie das arithmetische Mittel aus Höchst-, Tiefst- und Schlusskurs mit dem Volumen.
  2. Berechnen Sie den kumulierten Volumenzeitraumwert: Addieren Sie den volumengewichteten Preis über den festgelegten Zeitraum und dividieren Sie ihn durch das kumulierte Volumen.
  3. Berechnen Sie den EMA des Schlusskurses und den EMA von CVP separat.
  4. Ein Long-Signal wird generiert, wenn der Preis-EMA den CVP-EMA nach oben kreuzt; ein Short-Signal wird generiert, wenn der Preis-EMA den CVP-EMA nach unten kreuzt.
  5. Das Austrittssignal kann ein umgekehrtes Crossover-Signal oder ein Crossover-Signal basierend auf einem benutzerdefinierten CVP-Zyklus sein.

Strategische Vorteile

  1. Das Signalsystem ist robust: Es kombiniert Preistrends und Informationen zum Handelsvolumen, um Markttrends genauer zu bestimmen.
  2. Starke Anpassungsfähigkeit: Der EMA-Zeitraum und der CVP-Zeitraum können angepasst werden, um sich an unterschiedliche Marktumgebungen anzupassen.
  3. Perfektes Risikomanagement: Integrierte Zeitfilter können Operationen in Zeiträumen vermeiden, die für den Handel nicht geeignet sind.
  4. Flexibler Ausstiegsmechanismus: Es stehen zwei verschiedene Ausstiegsmethoden zur Verfügung und Sie können je nach Markteigenschaften die geeignete Ausstiegsmethode auswählen.
  5. Gute Visualisierung: Die Strategie bietet eine übersichtliche grafische Oberfläche, inklusive Signalmarkierungen und Trendbereichsfüllung.

Strategisches Risiko

  1. Hystereserisiko: EMA selbst hat eine gewisse Hysterese, die zu leichten Verzögerungen beim Ein- und Ausstiegszeitpunkt führen kann.
  2. Risiko eines volatilen Marktes: In einem seitwärts gerichteten und volatilen Markt können falsche Signale generiert werden.
  3. Parametersensitivität: Unterschiedliche Parameterkombinationen können zu großen Unterschieden in der Strategieleistung führen.
  4. Liquiditätsrisiko: In Märkten mit geringer Liquidität sind CVP-Berechnungen möglicherweise nicht genau genug.
  5. Zeitzonenabhängigkeit: Die Strategie verwendet die New Yorker Zeit als Zeitfilter und muss die Unterschiede der Handelszeiten in verschiedenen Märkten berücksichtigen.

Richtung der Strategieoptimierung

  1. Einführung von Volatilitätsfiltern: Strategieparameter können entsprechend der Marktvolatilität angepasst werden, um die Anpassungsfähigkeit der Strategie zu verbessern.
  2. Optimierter Zeitfilter: Um die Handelszeiten genauer zu steuern, können mehrere Zeitfenster hinzugefügt werden.
  3. Verbessern Sie die Beurteilung der Lautstärkequalität: Führen Sie Lautstärkeanalyseindikatoren ein, um Lautstärkesignale von geringer Qualität herauszufiltern.
  4. Dynamische Parameteranpassung: Entwickeln Sie ein adaptives Parametersystem, um EMA- und CVP-Perioden automatisch an die Marktbedingungen anzupassen.
  5. Marktstimmungsindikatoren hinzufügen: Kombinieren Sie sie mit anderen technischen Indikatoren, um Handelssignale zu bestätigen.

Zusammenfassen

Dies ist eine quantitative Handelsstrategie mit einer vollständigen Struktur und klarer Logik. Durch die Kombination der Vorteile von EMA und CVP entsteht ein Handelssystem, das Trends erfassen kann und gleichzeitig den Schwerpunkt auf die Risikokontrolle legt. Die Strategie ist in hohem Maße anpassbar und für den Einsatz in verschiedenen Marktumgebungen geeignet. Durch die Umsetzung von Optimierungsvorschlägen besteht Spielraum für eine weitere Verbesserung der Performance der Strategie.

Strategiequellcode
/*backtest
start: 2019-12-23 08:00:00
end: 2025-01-04 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
// © sapphire_edge 

// # ========================================================================= #
// #                  
// #        _____                   __    _              ______    __         
// #      / ___/____ _____  ____  / /_  (_)_______     / ____/___/ /___ ____ 
// #      \__ \/ __ `/ __ \/ __ \/ __ \/ / ___/ _ \   / __/ / __  / __ `/ _ \
// #     ___/ / /_/ / /_/ / /_/ / / / / / /  /  __/  / /___/ /_/ / /_/ /  __/
// #    /____/\__,_/ .___/ .___/_/ /_/_/_/   \___/  /_____/\__,_/\__, /\___/ 
// #              /_/   /_/                                     /____/       
// #                                      
// # ========================================================================= #

strategy(shorttitle="⟡Sapphire⟡ EMA/CVP", title="[Sapphire] EMA/CVP Strategy", initial_capital= 50000, currency= currency.USD,default_qty_value = 1,commission_type= strategy.commission.cash_per_contract,overlay= true )

// # ========================================================================= #
// #                       // Settings Menu //
// # ========================================================================= #

// --------------------    Main Settings    -------------------- //
groupEMACVP = "EMA / Cumulative Volume Period"
tradeDirection = input.string(title='Trade Direction', defval='LONG', options=['LONG', 'SHORT'], group=groupEMACVP)
emaLength = input.int(25, title='EMA Length', minval=1, maxval=200, group=groupEMACVP)
cumulativePeriod = input.int(100, title='Cumulative Volume Period', minval=1, maxval=200, step=5, group=groupEMACVP)
exitType = input.string(title="Exit Type", defval="Crossover", options=["Crossover", "Custom CVP" ], group=groupEMACVP)
cumulativePeriodForClose = input.int(50, title='Cumulative Period for Close Signal', minval=1, maxval=200, step=5, group=groupEMACVP)
showSignals = input.bool(true, title="Show Signals", group=groupEMACVP)
signalOffset = input.int(5, title="Signal Vertical Offset", group=groupEMACVP)

// --------------------    Time Filter Inputs    -------------------- //
groupTimeOfDayFilter = "Time of Day Filter"
useTimeFilter1  = input.bool(false, title="Enable Time Filter 1", group=groupTimeOfDayFilter)
startHour1      = input.int(0, title="Start Hour (24-hour format)", minval=0, maxval=23, group=groupTimeOfDayFilter)
startMinute1    = input.int(0, title="Start Minute", minval=0, maxval=59, group=groupTimeOfDayFilter)
endHour1        = input.int(23, title="End Hour (24-hour format)", minval=0, maxval=23, group=groupTimeOfDayFilter)
endMinute1      = input.int(45, title="End Minute", minval=0, maxval=59, group=groupTimeOfDayFilter)
closeAtEndTimeWindow = input.bool(false, title="Close Trades at End of Time Window", group=groupTimeOfDayFilter)

// --------------------    Trading Window    -------------------- //
isWithinTradingWindow(startHour, startMinute, endHour, endMinute) =>
    nyTime            = timestamp("America/New_York", year, month, dayofmonth, hour, minute)
    nyHour            = hour(nyTime)
    nyMinute          = minute(nyTime)
    timeInMinutes     = nyHour * 60 + nyMinute
    startInMinutes    = startHour * 60 + startMinute
    endInMinutes      = endHour * 60 + endMinute
    timeInMinutes    >= startInMinutes and timeInMinutes <= endInMinutes

timeCondition =  (useTimeFilter1 ? isWithinTradingWindow(startHour1, startMinute1, endHour1, endMinute1) : true)

// Check if the current bar is the last one within the specified time window
isEndOfTimeWindow() =>
    nyTime            = timestamp("America/New_York", year, month, dayofmonth, hour, minute)
    nyHour            = hour(nyTime)
    nyMinute          = minute(nyTime)
    timeInMinutes     = nyHour * 60 + nyMinute
    endInMinutes      = endHour1 * 60 + endMinute1
    timeInMinutes == endInMinutes

// Logic to close trades if the time window ends
if timeCondition and closeAtEndTimeWindow and isEndOfTimeWindow()
    strategy.close_all(comment="Closing trades at end of time window")

// # ========================================================================= #
// #                       // Calculations //
// # ========================================================================= #

avgPrice = (high + low + close) / 3
avgPriceVolume = avgPrice * volume

cumulPriceVolume = math.sum(avgPriceVolume, cumulativePeriod)
cumulVolume = math.sum(volume, cumulativePeriod)
cumValue = cumulPriceVolume / cumulVolume

cumulPriceVolumeClose = math.sum(avgPriceVolume, cumulativePeriodForClose)
cumulVolumeClose = math.sum(volume, cumulativePeriodForClose)
cumValueClose = cumulPriceVolumeClose / cumulVolumeClose

emaVal = ta.ema(close, emaLength)
emaCumValue = ta.ema(cumValue, emaLength)

// # ========================================================================= #
// #                       // Signal Logic //
// # ========================================================================= #

// Strategy Entry Conditions
longEntryCondition = ta.crossover(emaVal, emaCumValue) and tradeDirection == 'LONG'
shortEntryCondition = ta.crossunder(emaVal, emaCumValue) and tradeDirection == 'SHORT'

// User-Defined Exit Conditions
longExitCondition = false
shortExitCondition = false

if exitType == "Crossover"
    longExitCondition := ta.crossunder(emaVal, emaCumValue)
    shortExitCondition := ta.crossover(emaVal, emaCumValue)

if exitType == "Custom CVP"
    emaCumValueClose = ta.ema(cumValueClose, emaLength)
    longExitCondition := ta.crossunder(emaVal, emaCumValueClose)
    shortExitCondition := ta.crossover(emaVal, emaCumValueClose)

// # ========================================================================= #
// #                       // Strategy Management //
// # ========================================================================= #

// Strategy Execution
if longEntryCondition and timeCondition
    strategy.entry('Long', strategy.long)
    label.new(bar_index, high - signalOffset, "◭", style=label.style_label_up, color = color.rgb(119, 0, 255, 20), textcolor=color.white)

if shortEntryCondition and timeCondition
    strategy.entry('Short', strategy.short)
    label.new(bar_index, low + signalOffset, "⧩", style=label.style_label_down, color = color.rgb(255, 85, 0, 20), textcolor=color.white)

if strategy.position_size > 0 and longExitCondition
    strategy.close('Long')

if strategy.position_size < 0 and shortExitCondition
    strategy.close('Short')

// # ========================================================================= #
// #                         // Plots and Charts //
// # ========================================================================= #

plot(emaVal, title='EMA', color=color.new(color.green, 25))
plot(emaCumValue, title='Cumulative EMA', color=color.new(color.purple, 35))
fill(plot(emaVal), plot(emaCumValue), color=emaVal > emaCumValue ? #008ee6 : #d436a285, title='EMA and Cumulative Area', transp=70)