Stratégie de croisement de cycles de volume cumulé et de moyenne mobile exponentielle de la théorie du trading dynamique

EMA CVP AVWP TOD
Date de création: 2025-01-06 11:45:38 Dernière modification: 2025-01-06 11:45:38
Copier: 1 Nombre de clics: 346
1
Suivre
1617
Abonnés

Stratégie de croisement de cycles de volume cumulé et de moyenne mobile exponentielle de la théorie du trading dynamique

Aperçu

Cette stratégie est un système de trading qui combine la moyenne mobile exponentielle (EMA) et la période de volume cumulé (CVP). Il capture les points de retournement des tendances du marché en analysant le croisement de la moyenne mobile exponentielle du prix et du prix pondéré en fonction du volume cumulé. La stratégie dispose de filtres temporels intégrés qui peuvent limiter les heures de trading et prendre en charge la fermeture automatique des positions à la fin de la période de trading. La stratégie propose deux méthodes de sortie différentes : la sortie croisée inversée et la sortie CVP personnalisée, ce qui la rend plus flexible et adaptable.

Principe de stratégie

La logique fondamentale de la stratégie repose sur les calculs clés suivants :

  1. Calculez le prix moyen (AVWP) : multipliez la moyenne arithmétique des prix les plus élevés, les plus bas et de clôture par le volume.
  2. Calculez la valeur du volume cumulé sur la période : ajoutez le prix pondéré par le volume sur la période définie et divisez par le volume cumulé.
  3. Calculez l’EMA du cours de clôture et l’EMA du CVP séparément.
  4. Un signal long est généré lorsque le prix EMA croise le CVP EMA vers le haut ; un signal court est généré lorsque le prix EMA croise le CVP EMA vers le bas.
  5. Le signal de sortie peut être un signal de croisement inversé ou un signal de croisement basé sur un cycle CVP personnalisé.

Avantages stratégiques

  1. Le système de signal est robuste : il combine les tendances des prix et les informations sur le volume des transactions pour déterminer plus précisément les tendances du marché.
  2. Forte adaptabilité : la période EMA et la période CVP peuvent être ajustées pour s’adapter à différents environnements de marché.
  3. Gestion parfaite des risques : les filtres temporels intégrés peuvent éviter les opérations pendant les périodes qui ne sont pas propices au trading.
  4. Mécanisme de sortie flexible : deux méthodes de sortie différentes sont fournies et vous pouvez choisir la méthode de sortie appropriée en fonction des caractéristiques du marché.
  5. Bonne visualisation : la stratégie fournit une interface graphique claire, comprenant des marqueurs de signal et un remplissage de zone de tendance.

Risque stratégique

  1. Risque d’hystérésis : l’EMA elle-même présente une certaine hystérésis, ce qui peut entraîner de légers retards dans les délais d’entrée et de sortie.
  2. Risque de marché volatil : De faux signaux peuvent être générés dans un marché latéral et volatil.
  3. Sensibilité des paramètres : différentes combinaisons de paramètres peuvent entraîner de grandes différences dans les performances de la stratégie.
  4. Risque de liquidité : sur les marchés à faible liquidité, les calculs de CVP peuvent ne pas être suffisamment précis.
  5. Dépendance du fuseau horaire : la stratégie utilise l’heure de New York comme filtre temporel et doit prêter attention aux différences d’heures de négociation sur les différents marchés.

Orientation de l’optimisation de la stratégie

  1. Présentation des filtres de volatilité : les paramètres de stratégie peuvent être ajustés en fonction de la volatilité du marché pour améliorer l’adaptabilité de la stratégie.
  2. Filtre temporel optimisé : plusieurs fenêtres temporelles peuvent être ajoutées pour contrôler plus finement les sessions de trading.
  3. Améliorer l’évaluation de la qualité du volume : introduire des indicateurs d’analyse du volume pour filtrer les signaux de volume de faible qualité.
  4. Ajustement dynamique des paramètres : Développer un système de paramètres adaptatif pour ajuster automatiquement les périodes EMA et CVP en fonction des conditions du marché.
  5. Ajoutez des indicateurs de sentiment du marché : combinez-les avec d’autres indicateurs techniques pour confirmer les signaux de trading.

Résumer

Il s’agit d’une stratégie de trading quantitative avec une structure complète et une logique claire. En combinant les avantages de l’EMA et du CVP, un système de trading est créé qui peut capturer les tendances tout en se concentrant sur le contrôle des risques. La stratégie est hautement personnalisable et adaptée à une utilisation dans différents environnements de marché. Grâce à la mise en œuvre de suggestions d’optimisation, il est possible d’améliorer encore les performances de la stratégie.

Code source de la stratégie
/*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)