Estratégia de cruzamento da média móvel de impulso

Autora:ChaoZhang, Data: 2023-09-21 21:29:22
Tags:

Resumo

Esta estratégia utiliza os princípios de cruzamento entre médias móveis rápidas e lentas para determinar as direções da tendência do mercado e gerar sinais de compra e venda.

Estratégia lógica

A estratégia emprega duas médias móveis, uma linha rápida e uma linha lenta. A linha rápida usa a EMA de 3 dias e a linha lenta usa a EMA de 15 dias. Quando a linha rápida cruza acima da linha lenta de baixo, ela indica uma tendência de alta e dá um sinal de compra. Pelo contrário, quando a linha rápida cruza abaixo da linha lenta de cima, ela sinaliza uma tendência de baixa e dá um sinal de venda.

A estratégia também define uma EMA de 3 dias mais rápida como a linha de saída rápida. Quando o preço quebra abaixo desta linha de saída rápida, ele julga que a tendência se inverteu e deve sair da posição longa existente. Da mesma forma, quando o preço quebra acima da linha de saída, ele indica uma tendência de alta renovada e dá um sinal para voltar a entrar em longo.

Os sinais de funcionamento específicos são definidos como:

  1. Linha rápida cruza acima linha lenta de baixo, vai longo

  2. Linha rápida cruza abaixo linha lenta de cima, vai curto

  3. Preço abaixo da linha de saída rápida, fechar posição longa

  4. O preço retorna acima da linha de saída rápida, reentrada longa

Vantagens

  • Simples de usar, apenas precisa configurar dois parâmetros de média móvel, fácil de implementar

  • Dados de backtesting suficientes, utilizando indicadores comuns para avaliar a viabilidade

  • Muitos parâmetros configuráveis para otimização

  • Adota a linha de saída rápida como stop loss para melhor controlar o risco

  • Lógica estratégica clara, sinais explícitos de compra e venda

  • Frequência de operação adequada, evitar excesso de negociação

Riscos

  • São propensos a mais sinais falsos quando a tendência não é clara como a tendência segue a estratégia

  • As médias móveis têm natureza atrasada, podem perder pontos de viragem

  • Parâmetros fixos não podem adaptar-se às alterações do mercado, necessitam de otimização

  • Stop loss pode ser demasiado fraco, incapaz de parar a perda a tempo

  • Os sinais frequentes podem conduzir a custos de negociação mais elevados

  • Os sinais podem divergir e necessitam de confirmação com outros indicadores

Os riscos podem ser geridos pela otimização de parâmetros, adição de filtros, relaxamento de stop loss, atualização de parâmetros em tempo útil, etc.

Reforço

  • Teste e otimização dos parâmetros para melhor adaptá-los às condições de mercado

  • Introduzir mais indicadores para formar um sistema robusto

  • Construir configurações de parâmetros adaptáveis com base no mercado em tempo real

  • Aplicar modelos de aprendizagem de máquina para otimização mais inteligente

  • Definição de paralisação dinâmica ou de paralisação para melhor controlo do risco

  • Combinar indicadores de volume para evitar divergências

Conclusão

Esta é uma estratégia de cruzamento de média móvel dupla relativamente simples. Determina a tendência do mercado e os sinais de negociação com base na interação entre médias móveis rápidas e lentas. A estratégia é fácil de implementar e pode ser adaptada por meio de otimização. Mas também tem alguns riscos. Mais filtros são necessários para confirmar sinais e gerenciar riscos. Quando adequadamente otimizado e aplicado à negociação de médio prazo, pode se tornar um sistema de negociação quantitativa muito prático.


/*backtest
start: 2023-01-01 00:00:00
end: 2023-02-03 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © ehaarjee, ECHKAY, JackBauer007

//@version=4
//study(title="Tale_indicators", overlay=true)
strategy("Tale Indicators Strategy", overlay=true, precision=8, max_bars_back=200, pyramiding=0, initial_capital=20000, commission_type="percent", commission_value=0.1)

len_fast = input(3, minval=1, title="FAST EMA")
src_fast = input(close, title="Source for Fast")
fastMA = ema(src_fast, len_fast)
plot(fastMA, title="Slow EMA", color=color.orange)

len_slow = input(15, minval=1, title="SLOW EMA")
src_slow = input(close, title="Source for Slow")
slowMA = ema(src_slow, len_slow)
plot(slowMA, title="Fast EMA", color=color.blue)

len_fast_exit = input(3, minval=1, title="FAST EMA Exit")
src_fast_exit = input(close, title="Source for Fast Exit")
fastMAE = ema(src_fast_exit, len_fast_exit)
plot(fastMAE, title="Fast EMA Ex", color=color.red)


src_slow_enter_short = input(low, title="Source for Short Entry")
slowMASEn = ema(src_slow_enter_short, len_slow)

src_slow_enter_long = input(high, title="Source for Long Entry")
slowMALEn = ema(src_slow_enter_long, len_slow)

src_slow_exit_short = input(low, title="Source for Short Exit")
slowMASEx = ema(src_slow_enter_short, len_slow)

src_slow_exit_long = input(high, title="Source for Long Exit")
slowMALEx = ema(src_slow_enter_long, len_slow)

enter_long = crossover(fastMA, slowMALEn)
enter_short = crossunder(fastMA, slowMASEn)
exit_long = crossunder(fastMAE, slowMALEx)
exit_short = crossover(fastMAE, slowMALEx)

out_enter = iff(enter_long == true, 1, iff(enter_short == true, -1, 0))
plotarrow(out_enter, "Plot Enter Points", colorup=color.green, colordown=color.red, maxheight = 30)

bull = fastMA > slowMALEn
bear = fastMA < slowMASEn

c = bull ? color.green : bear ? color.red  : color.white
bgcolor(c)

exit_tuner = input(0.005, title="Exit Tuner to touch slowEMA")

bull_exit = (bull and (low>(fastMAE*(1+exit_tuner)))) or exit_long or (not(bear) and (fastMAE>high))
bear_exit = (bear and ((fastMAE*(1-exit_tuner))>high)) or exit_short or (not(bull) and (low>fastMAE))

bull_r = (bull and ((bull_exit[1]) or (bull_exit[2] and bull_exit[1])) and (low<=fastMAE))
bear_r = (bear and ((bear_exit[1]) or (bull_exit[2] and bull_exit[1])) and (fastMAE<=high))

bull_re = (bull and (low<slowMALEn)) and not(enter_long)
bear_re = (bear and (high>slowMASEn)) and not(enter_short)

bull_ree = (bull and ((low<slowMALEn) and not(bull_re[1] or enter_long[1]))) 
bear_ree = (bear and ((high>slowMASEn) and not(bear_re[1] or enter_short[1])))

bull_reenter =  (bull_r) and not(enter_long)
bear_reenter =  (bear_r) and not(enter_short)

plotshape(bull_exit, "Plot Bull Exit", style = shape.arrowdown, color=color.green, size=size.small, text="ExL", location=location.abovebar)
plotshape(bear_exit, "Plot Bear Exit", style = shape.arrowup, color=color.red, size=size.small, text="ExS", location=location.belowbar)

plotshape(bull_reenter, "Plot Bull ReEnter", style = shape.arrowup, color=color.green, size=size.small, text="ReL", location=location.belowbar)
plotshape(bear_reenter, "Plot Bear ReEnter", style = shape.arrowdown, color=color.red, size=size.small, text="ReS", location=location.abovebar)

run_strategy = input(true, title="Run Strategy")
// === INPUT BACKTEST RANGE ===
fromMonth = input(defval = 1,    title = "From Month",      type = input.integer, minval = 1, maxval = 12)
fromDay   = input(defval = 1,    title = "From Day",        type = input.integer, minval = 1, maxval = 31)
fromYear  = input(defval = 2020, title = "From Year",       type = input.integer, minval = 2000)
thruMonth = input(defval = 1,    title = "Thru Month",      type = input.integer, minval = 1, maxval = 12)
thruDay   = input(defval = 1,    title = "Thru Day",        type = input.integer, minval = 1, maxval = 31)
thruYear  = input(defval = 2100, title = "Thru Year",       type = input.integer, minval = 2000)

// === INPUT SHOW PLOT ===
showDate  = input(defval = true, title = "Show Date Range", type = input.bool)
// === FUNCTION EXAMPLE ===
start     = timestamp(fromYear, fromMonth, fromDay, 00, 00)        // backtest start window
finish    = timestamp(thruYear, thruMonth, thruDay, 23, 59)        // backtest finish window
window()  => true       // create function "within window of time"

var long_position_open = false
var short_position_open = false


if (enter_long and not(bull_exit) and not(long_position_open))
//    strategy.entry("LO", strategy.long, qty=4)
    long_position_open := true
    if (short_position_open)
//        strategy.close("SO")
        short_position_open := false

if (bull_reenter and not(long_position_open))  
//    strategy.entry("LO", strategy.long, qty=1)
    long_position_open := true

if (bull_exit and long_position_open)
//  strategy.close("LO")
    long_position_open := false
    
if (enter_short and not(bear_exit) and not(short_position_open))
//    strategy.entry("SO", strategy.short, qty=4)
    short_position_open := true
    if(long_position_open)
//        strategy.close("LO")
        long_position_open := false

if (bear_reenter and not(short_position_open))  
//    strategy.entry("SO", strategy.long, qty=1)
    long_position_open := true

if (bear_exit and short_position_open)
//    strategy.close("SO")
    short_position_open := false

if(run_strategy)
    strategy.entry("LO", strategy.long, when=(window() and enter_long), qty=4)
    strategy.entry("LO", strategy.long, when=(window() and bull_reenter and not(long_position_open)), qty=1)
    strategy.close("LO", when=(window() and bull_exit and long_position_open))
    strategy.entry("SO", strategy.short, when=(window() and enter_short), qty=4)
    strategy.entry("SO", strategy.short, when=(window() and bear_reenter and not(short_position_open)), qty=1)
    strategy.close("SO", when=(window() and bear_exit and short_position_open))


Mais.