Les ressources ont été chargées... Je charge...

Théorie de la négociation dynamique: stratégie de croisement de période de moyenne mobile exponentielle et de volume cumulé

Auteur:ChaoZhang est là., Date: 2025-01-06 11:45:38 Je suis désolé
Les étiquettes:Le taux d'intérêtLe CVPPPAVTemps d'exécution

img

Résumé

Cette stratégie est un système de trading qui combine une moyenne mobile exponentielle (EMA) et une période de volume cumulatif (CVP). Elle capture les points d'inversion de la tendance du marché en analysant le croisement entre l'EMA des prix et le prix pondéré par volume cumulé.

Principe de stratégie

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

  1. Calculer le prix moyen (AVWP): Multipliez la moyenne arithmétique des prix élevés, bas et rapprochés par le volume.
  2. Calculer la valeur cumulée du volume de la période: additionner les prix pondérés par volume au cours de la période définie et le diviser par le volume cumulé.
  3. Le montant de la valeur ajoutée de la valeur ajoutée de la valeur ajoutée de la valeur ajoutée de la valeur ajoutée de la valeur ajoutée.
  4. Générer des signaux longs lorsque l'EMA du prix dépasse l'EMA du CVP; générer des signaux courts lorsque l'EMA du prix dépasse l'EMA du CVP.
  5. Les signaux de sortie peuvent être soit des signaux de croisement inverse, soit des signaux basés sur des périodes CVP personnalisées.

Les avantages de la stratégie

  1. Système de signal robuste: Combine les tendances des prix et les informations sur le volume pour un jugement plus précis de la direction du marché.
  2. Haute adaptabilité: peut s'adapter à différents environnements de marché en ajustant les périodes EMA et CVP.
  3. Gestion complète des risques: un filtre temporel intégré empêche la négociation pendant des périodes inappropriées.
  4. Mécanisme de sortie flexible: offre deux méthodes de sortie différentes à choisir en fonction des caractéristiques du marché.
  5. Une bonne visualisation: la stratégie fournit une interface graphique claire, y compris des marqueurs de signaux et le remplissage de la zone de tendance.

Risques stratégiques

  1. Risque de décalage: l'EMA présente un décalage inhérent, qui peut entraîner de légers retards dans les délais d'entrée et de sortie.
  2. Risque d'oscillation: peut générer de faux signaux sur les marchés latéraux.
  3. Sensibilité des paramètres: différentes combinaisons de paramètres peuvent entraîner des variations significatives des performances.
  4. Risque de liquidité: les calculs du CVP peuvent être inexacts sur les marchés à faible liquidité.
  5. Dépendance du fuseau horaire: La stratégie utilise l'heure de New York pour le filtrage de l'heure, ce qui nécessite une attention aux différentes heures de négociation du marché.

Directions d'optimisation de la stratégie

  1. Introduire un filtre de volatilité: ajuster les paramètres de stratégie en fonction de la volatilité du marché afin d'améliorer l'adaptabilité.
  2. Optimiser le filtre temporel: ajouter plusieurs fenêtres temporelles pour un contrôle plus précis de la session de négociation.
  3. Ajouter une évaluation de la qualité du volume: introduire des indicateurs d'analyse du volume pour filtrer les signaux 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. Ajouter des indicateurs de sentiment du marché: combiner avec d'autres indicateurs techniques pour confirmer les signaux de négociation.

Résumé

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, il crée un système de trading qui peut à la fois capturer les tendances et se concentrer sur le contrôle des risques.


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


Relationnée

Plus de