Estratégia de Crossover de Média Móvel Dupla


Data de criação: 2023-11-16 17:50:52 última modificação: 2023-11-16 17:50:52
cópia: 0 Cliques: 688
1
focar em
1617
Seguidores

Estratégia de Crossover de Média Móvel Dupla

Visão geral

A estratégia de cruzamento de duplas médias móveis, através da computação de médias móveis de diferentes períodos, para determinar a direção da tendência dos preços, permite o acompanhamento da tendência. Quando a média de curto período atravessa a média de longo período, faz mais, quando a média de curto período atravessa a média de longo período, faz o espaço, pertence à típica estratégia de acompanhamento da tendência.

Princípio da estratégia

A estratégia baseia-se na média móvel do índice (EMA) de 9 ciclos, 21 ciclos e 50 ciclos. Destes, 9 ciclos de EMA representam a tendência de curto prazo, 21 ciclos de EMA representam a tendência de médio prazo e 50 ciclos de EMA representam a tendência de longo prazo.

Quando o 9 ciclo EMA atravessa o 21 ciclo EMA, indica que a tendência de curto prazo se transforma em alta, fazendo mais; quando o 9 ciclo EMA atravessa o 21 ciclo EMA, indica que a tendência de curto prazo se transforma em baixa, fazendo vazio. Aqui usa-se a função de cruzamento crossover () para determinar o cruzamento da linha média.

O código define a lógica de abertura, parada e parada de perdas de posições longas e vazias. As condições de abertura são uniformemente lineares ou desconexas. A parada de cabeça múltipla é o preço de entrada × ((1 + a proporção de parada de entrada), a parada de cabeça vazia é o preço de entrada × ((1- a proporção de parada de entrada)); a parada de cabeça múltipla é a proporção de parada de entrada × 1- ((), a parada de cabeça vazia é o preço de entrada × ((1 + a proporção de parada de entrada)).

Além disso, o código também adicionou algumas condições de filtragem, como filtragem de tendência, que exige que a linha K não possa ser abalada antes de atravessar a linha média, e filtragem de taxa de utilização de capital, que exige que a estratégia de juros não seja inferior a N dias de linha média, para evitar perdas excessivas. Essas condições de filtragem podem, até certo ponto, evitar falsos sinais.

Em geral, a estratégia usa o cruzamento de duas EMAs para determinar a direção da tendência dos preços, e uma lógica de stop-loss razoável para capturar a tendência da linha média e longa. Mas, como uma estratégia de um fator, seu sinal pode não ser estável o suficiente para ser otimizado ainda mais.

Análise de vantagens

  • A direção da tendência é determinada pela interseção de duas linhas equilíneas móveis. O princípio é simples e fácil de entender.
  • A utilização de EMAs de diferentes períodos permite avaliar tendências de curto e longo prazo.
  • A configuração do Stop Loss Logic permite bloquear o lucro e controlar o risco.
  • A adição de condições de filtragem permite filtrar os sinais falsos até certo ponto.
  • Pode definir os parâmetros livremente, otimizar a combinação de ciclos e adaptar-se a diferentes ambientes de mercado.

Análise de Riscos

  • Como uma estratégia de um fator, os sinais de negociação podem não ser suficientemente estáveis. Quando os preços oscilam, podem ocorrer várias transações sem sentido.
  • Quando a EMA cruza, o preço pode ter corrido uma certa distância e existe o risco de uma corrida de alta e baixa.
  • O lucro em tempo real pode ser reduzido sem considerar os custos de transação.
  • Não foi criado um stop loss e não foi possível controlar as perdas em situações extremas.

Como reagir:

  1. Optimizar os parâmetros do ciclo MA para tornar o sinal mais estável.
  2. Em combinação com outros indicadores, os sinais de filtragem
  3. Aumentar o número de transações e reduzir os custos.
  4. Estabeleça um ponto de parada para limitar a perda máxima.

Direção de otimização

A estratégia pode ser otimizada em:

  1. Otimizar os parâmetros de ciclo da média móvel para encontrar a combinação de ciclos ideal. Pode ser introduzida uma técnica de otimização adaptativa, o ciclo de escolha dinâmica.

  2. Adicionar outros indicadores técnicos para filtrar sinais, como MACD, KD, etc., para melhorar a qualidade do sinal. Ou introduzir aprendizado de máquina para classificar os sinais e filtrar automaticamente os falsos sinais.

  3. Combinado com a análise de volume de transação. Quando a linha média é ultrapassada, mas o volume de transação é insuficiente, não recebe o sinal.

  4. Ao ocorrer uma ruptura, examinar oscilações anteriores, como a ruptura na zona de choque, pode ser uma falsa ruptura.

  5. Estabelecer mecanismos de parada dinâmica, como parada de tipo de rastreamento, saída de Chandelier, etc., para reduzir a distância de parada, mas garantir que a parada seja eficaz.

  6. Optimizar a gestão de posições, como posições fixas, posições dinâmicas, posições de alavancagem, etc., para que a taxa de ganhos e perdas seja mais razoável.

  7. Considerando os custos de transação e os efeitos de deslizamento. Otimizando a proporção de stop loss e stop loss para garantir que a estratégia permaneça lucrativa no mercado real.

Resumir

A estrutura geral da estratégia é razoável, o princípio é simples, a direção da tendência é julgada através do cruzamento de duas EMAs, e a lógica de parada e parada de perda é configurada para capturar a tendência. Mas, como estratégia de um único fator, a configuração de parâmetros e filtragem de sinais pode ser otimizada ainda mais, tornando a estratégia mais estável.

Código-fonte da estratégia
/*backtest
start: 2023-10-16 00:00:00
end: 2023-11-15 00:00:00
period: 1h
basePeriod: 15m
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/
// © TradingMentalist

//@version=4
strategy("Initial template",initial_capital=1000, overlay=true, pyramiding=0, commission_type=strategy.commission.percent, commission_value=0.04, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, currency = currency.USD)

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////inputs
//turn on/off longs/shorts / extraneous conditions
longinc=input(true, title="include longs?")
lConSw2=input(true, title="condition two?")
lConSw3=input(true, title="condition three?")
shotinc=input(true, title="include shorts?")
sConSw2=input(true, title="condition two?")
sConSw3=input(true, title="condition three?")

//turn on/off / adjust trade filters (average range/average equity)
sidein2     = input(200, step=10, title='lookback for average range (bars)')
sidein      = input(1, title='filter trades if range is less than (%)')/100
equityIn    = input(40, title='filter trades if equity is below ema()')
sidewayssw  = input(true, title='sideways filter?')
equitysw    = input(true, title='equity filter?')
longtpin    = input(1,step=0.1, title='long TP %')/100
longslin    = input(0.4,step=0.1, title='long SL %')/100
shorttpin   = input(1,step=0.1, title='short TP %')/100
shortslin   = input(0.4,step=0.1, title='short SL %')/100

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////filters
//(leave as is)
side1       = (close[1] + close[sidein2]) / 2
side2       = close[1] - close[sidein2] 
side3       = side2 / side1
notsideways = side3 > sidein
equityMa    = equitysw ? ema(strategy.equity, equityIn) : 0
equityCon   = strategy.equity >= equityMa

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////indicators
ma1 = ema(close, 9)
ma2 = ema(close, 21)
ma3 = ema(close, 50)

plot(ma1, color=color.new(#E8B6B0,50))
plot(ma2, color=color.new(#B0E8BE,50))
plot(ma3, color=color.new(#00EEFF,50))

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////conditions
//adjust conditions
//-------------------------------------------
longCondition1  = crossover(ma2,ma3)
longCondition2  = close[5] > close[10]
longCondition3  = close[1] > close[2]

shortCondition1 = crossover(ma3,ma2)
shortCondition2 = close[5] < close[10]
shortCondition3 = close[1] < close[2]

closelong       = shortCondition1
closeshort      = longCondition1
//-------------------------------------------

//(leave as is)
longCondition1in  = longCondition1
longCondition2in  = lConSw2 ? longCondition2 : true
longCondition3in  = lConSw3 ? longCondition3 : true
shortCondition1in = shortCondition1
shortCondition2in = sConSw2 ? shortCondition2: true
shortCondition3in = sConSw3 ? shortCondition3: true
longConditions    = longCondition1in and longCondition2in and longCondition3in
shortConditions   = shortCondition1in and shortCondition2in and shortCondition3in

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////execution
//(leave as is)
long            = sidewayssw ? notsideways and equityCon and longConditions : equityCon and longConditions
short           = sidewayssw ? notsideways and equityCon and shortConditions : equityCon and shortConditions

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////risk
//(leave as is)
longtplevel     = strategy.position_avg_price * (1 + longtpin)
longsllevel     = strategy.position_avg_price * (1 - longslin)
shorttplevel    = strategy.position_avg_price * (1 - shorttpin)
shortsllevel    = strategy.position_avg_price * (1 + shortslin)

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////timeframe
//adjust timeframe
//-------------------------------------------
startyear   = 2000
startmonth  = 1
startday    = 1

stopyear    = 9999
stopmonth   = 12
stopday     = 31
//-------------------------------------------

//(leave as is)
startperiod = timestamp(startyear,startmonth,startday,0,0)
periodstop  = timestamp(stopyear,stopmonth,stopday,0,0)
timeframe()    =>
    time >= startperiod and time <= periodstop ? true : false

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////orders
//comments are empty characters for clear chart
if timeframe()
    if longinc
        if strategy.position_size == 0 or strategy.position_size > 0 
            strategy.entry(id="long", long=true, when=long, comment=" ")
            strategy.exit("stop","long", limit=longtplevel, stop=longsllevel,comment=" ")
            strategy.close(id="long", when=closelong, comment = " ")
    if shotinc
        if strategy.position_size == 0 or strategy.position_size < 0 
            strategy.entry(id="short", long=false, when=short, comment = " ")
            strategy.exit("stop","short", limit=shorttplevel, stop=shortsllevel,comment = " ")
            strategy.close(id="short", when=closeshort, comment = " ")