Estratégia de negociação quantitativa baseada no duplo crossover da EMA

Autora:ChaoZhang, Data: 2023-11-21 11:41:40
Tags:

img

Resumo

Esta estratégia gera sinais de negociação através do cálculo do cruzamento entre duas linhas EMA de períodos diferentes para determinar as tendências do mercado. Abrirá posições longas quando a EMA de período mais curto cruzar a EMA de período mais longo, indicando uma tendência de alta, e fechará posições quando a EMA de período mais curto cruzar abaixo da EMA de período mais longo, indicando uma tendência de queda.

Princípios

A estratégia aplica principalmente a teoria da cruz de ouro e da cruz da morte de linhas de EMA dupla. As linhas de EMA dupla consistem em uma EMA longa e uma EMA curta. O parâmetro EMA curto é definido em 10 dias e o parâmetro EMA longo é definido em 21 dias.

Quando a EMA curta cruza a EMA longa, um sinal de compra é gerado. Quando a EMA curta cruza abaixo da EMA longa, um sinal de venda é gerado. A estratégia também define limiares de taxa de crescimento, abrindo posições longas apenas quando o crescimento excede um limiar positivo e fechando posições apenas quando o declínio excede um limiar negativo.

Especificamente, a condição de compra é quando a EMA curta é superior à EMA longa e a taxa de crescimento das ações excede o limiar positivo.

Vantagens

  • Utiliza a teoria da cruz de ouro e da cruz da morte de linhas EMA duplas para simplicidade e confiabilidade
  • Adiciona limiares de taxa de crescimento para evitar operações errôneas durante um crescimento fraco
  • Pode controlar estritamente a taxa de perda máxima
  • Os parâmetros dos períodos da EMA podem ser ajustados de forma flexível para diferentes ciclos

Análise de riscos

  • As linhas da EMA têm efeitos de atraso, possivelmente faltando pontos de inversão de preços
  • Os cruzamentos de linhas têm algum atraso, possivelmente faltando os melhores pontos de entrada
  • Depende da otimização de parâmetros, configurações inadequadas podem causar excesso de negociação ou sinais insuficientes

Orientações de otimização

  • Combinar com outros indicadores como MACD, KD etc. para melhorar a precisão do sinal
  • Adicione estratégias de stop loss como trailing stop loss para maximizar os lucros
  • Otimizar os parâmetros do período EMA para melhores configurações em diferentes produtos
  • Incorporar dados em tempo real e métodos de aprendizagem automática para ajuste e otimização de parâmetros dinâmicos

Resumo

A estratégia geral é relativamente simples e confiável, usando crossovers duplos da EMA para determinar as tendências de preços e definir limiares de taxa de crescimento para gerar sinais de negociação. Em comparação com crossovers de linha única, ele pode filtrar alguns sinais falsos. Mas as próprias linhas da EMA têm problemas de atraso. Combinar outros indicadores ou ajuste dinâmico de parâmetros pode melhorar ainda mais o desempenho da estratégia.


/*backtest
start: 2022-11-14 00:00:00
end: 2023-11-20 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy(title="ema(ema10-21)", overlay=true, pyramiding = 0, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, initial_capital = 15000, commission_type = strategy.commission.percent, commission_value = 0.2)

useTimeLimit    = input(defval = false, title = "Use Start Time Limiter?")
startYear       = input(defval = 2016, title = "Start From Year",  minval = 0, step = 1)
startMonth      = input(defval = 05, title = "Start From Month",  minval = 0,step = 1)
startDay        = input(defval = 01, title = "Start From Day",  minval = 0,step = 1)
startHour       = input(defval = 00, title = "Start From Hour",  minval = 0,step = 1)
startMinute     = input(defval = 00, title = "Start From Minute",  minval = 0,step = 1)

startTimeOk() => true

lenght0 = input(10)
lenght1 = input(21)

source = close

EmaShort = ema(ema(source, lenght0), lenght0)
EmaLong = ema(ema(source, lenght1),lenght1)
plot(EmaShort, color=red)
plot(EmaLong, color=purple)

growth = ((EmaShort-EmaLong)*100)/((EmaShort+EmaLong)/2)
thresholdUp = input(defval=0.05, title="Threshold Up", type=float, step=0.01)
thresholdDown = input(defval=-0.165, title="Threshold Down", type=float, step=0.001)

if( startTimeOk() )
    buy_condition = EmaShort > EmaLong and growth > thresholdUp
    buy_exit_condition = EmaShort < EmaLong and growth < thresholdDown
    strategy.entry("buy", strategy.long, comment="buy", when=buy_condition)
    strategy.close(id='buy', when=buy_exit_condition)

Mais.