O recurso está a ser carregado... Carregamento...

Teoria de negociação dinâmica: média móvel exponencial e estratégia de cruzamento de período de volume acumulado

Autora:ChaoZhang, Data: 2025-01-06 11:45:38
Tags:EMACVPAVWPDATOS

img

Resumo

Esta estratégia é um sistema de negociação que combina a média móvel exponencial (EMA) e o período de volume acumulado (CVP). Captura os pontos de reversão da tendência do mercado analisando o cruzamento entre a EMA de preço e o preço ponderado por volume acumulado. A estratégia inclui um filtro de tempo incorporado para limitar as sessões de negociação e suporta o fechamento automático de posições no final dos períodos de negociação.

Princípio da estratégia

A lógica central da estratégia baseia-se nos seguintes cálculos fundamentais:

  1. Calcule o preço médio (AVWP): Multiplique a média aritmética dos preços altos, baixos e próximos com o volume.
  2. Calcular o valor acumulado do volume durante o período: somar os preços ponderados pelo volume durante o período definido e dividir por volume acumulado.
  3. Calcular a EMA do preço de fechamento e a EMA do CVP separadamente.
  4. Gerar sinais longos quando a EMA do preço cruza acima da EMA do CVP; gerar sinais curtos quando a EMA do preço cruza abaixo da EMA do CVP.
  5. Os sinais de saída podem ser sinais de cruzamento inverso ou sinais baseados em períodos CVP personalizados.

Vantagens da estratégia

  1. Sistema de sinalização robusto: combina tendência de preços e informações de volume para um julgamento mais preciso da direção do mercado.
  2. Alta adaptabilidade: pode adaptar-se a diferentes ambientes de mercado ajustando os períodos EMA e CVP.
  3. Gestão completa do risco: o filtro de tempo integrado impede a negociação durante períodos inadequados.
  4. Mecanismo de saída flexível: fornece dois métodos de saída diferentes para escolher com base nas características do mercado.
  5. Boa visualização: A estratégia fornece uma interface gráfica clara, incluindo marcadores de sinal e preenchimento da área de tendência.

Riscos estratégicos

  1. Risco de atraso: A EMA tem um atraso inerente, o que pode causar ligeiros atrasos no momento da entrada e da saída.
  2. Risco de oscilação: pode gerar falsos sinais em mercados laterais.
  3. Sensibilidade dos parâmetros: diferentes combinações de parâmetros podem provocar variações significativas no desempenho.
  4. Risco de liquidez: os cálculos do CVP podem ser imprecisos em mercados de baixa liquidez.
  5. Dependência do Fuso Horário: A estratégia usa o tempo de Nova York para filtragem de tempo, exigindo atenção para diferentes horas de negociação do mercado.

Orientações para a otimização da estratégia

  1. Introduzir um filtro de volatilidade: ajustar os parâmetros da estratégia com base na volatilidade do mercado para melhorar a adaptabilidade.
  2. Otimize Time Filter: Adicione várias janelas de tempo para controle de sessão de negociação mais preciso.
  3. Adicionar Avaliação da Qualidade do Volume: Introduzir indicadores de análise de volume para filtrar sinais de volume de baixa qualidade.
  4. Ajuste dinâmico de parâmetros: Desenvolver um sistema de parâmetros adaptativos para ajustar automaticamente os períodos EMA e CVP com base nas condições do mercado.
  5. Adicionar indicadores de sentimento de mercado: combinar com outros indicadores técnicos para confirmar os sinais de negociação.

Resumo

Esta é uma estratégia de negociação quantitativa com estrutura completa e lógica clara. Combinando as vantagens da EMA e CVP, cria um sistema de negociação que pode capturar tendências e se concentrar no controle de riscos. A estratégia é altamente personalizável e adequada para uso em diferentes ambientes de mercado. Através da implementação de sugestões de otimização, há espaço para melhoria de desempenho.


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


Relacionados

Mais.