Estratégia de cruzamento da média móvel de rastreamento de tendências

Autora:ChaoZhang, Data: 2024-01-29 16:52:46
Tags:

img

Resumo

Esta é uma estratégia simples baseada em média móvel que funciona bem com diferentes pares de moedas. Ela traça o preço de abertura e preço de fechamento da média móvel e decide entrar em uma posição longa ou sair dela com base em se as duas linhas se cruzaram. A ideia é que ela entra em uma posição quando o preço médio de fechamento está aumentando, o que pode indicar um impulso ascendente nos preços.

Estratégia lógica

Esta estratégia seleciona primeiro o tipo de média móvel, incluindo EMA, SMA, RMA, WMA e VWMA. Em seguida, define o período de retorno para a média móvel, geralmente entre 10 e 250 bares.

A lógica específica de negociação é a seguinte:

  1. Calcular a média móvel do preço de abertura e do preço de fechamento;
  2. Comparar os valores médios móveis entre o preço de fechamento e o preço de abertura;
  3. Introduzir uma posição longa se a média móvel do preço de fechamento ultrapassar a média móvel do preço de abertura;
  4. Fechar a posição longa se a média móvel do preço de fechamento ultrapassar a média móvel do preço de abertura.

A entrada na posição considera-a um sinal de movimento de preços ascendentes, enquanto a saída considera o movimento de preços descendentes.

Análise das vantagens

As principais vantagens desta estratégia são:

  1. Configurações de parâmetros flexíveis que podem ser otimizadas para diferentes pares de moedas para uma melhor especificidade;
  2. Uma lógica simples que seja fácil de compreender e implementar;
  3. Retorno muito elevado alcançável para alguns pares de moedas, em geral boa estabilidade;
  4. Alta personalização na exibição de diferentes indicadores.

Análise de riscos

Há também alguns riscos com esta estratégia:

  1. Para alguns pares de moedas e parâmetros, os retornos e a estabilidade podem ser baixos;
  2. Não pode responder bem às flutuações de preços a curto prazo, desempenho fraco para moedas altamente voláteis;
  3. Escolha do período de observação média móvel não suficientemente científica, um pouco subjetiva.

Soluções e otimização:

  1. Usar prazos mais longos como 12H, 1D para reduzir os negócios desnecessários e melhorar a estabilidade;
  2. Adicionar funções de otimização de parâmetros para testar automaticamente diferentes combinações de parâmetros para obter os melhores parâmetros;
  3. Adicionar seleção adaptativa do período de observação da média móvel para permitir que o sistema decida automaticamente o período ideal.

Conclusão

Em resumo, esta é uma estratégia simples que usa indicadores de média móvel para determinar a tendência de preços e pontos de inflexão. Pode alcançar resultados muito bons ajustando parâmetros e é uma estratégia eficaz de rastreamento de tendências que vale a pena melhorar e aplicar.


/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
//Author @divonn1994

initial_balance = 100
strategy(title='Close v Open Moving Averages Strategy', shorttitle = 'Close v Open', overlay=true, pyramiding=0, default_qty_value=100, default_qty_type=strategy.percent_of_equity, precision=7, currency=currency.USD, commission_value=0.1, commission_type=strategy.commission.percent, initial_capital=initial_balance)

//Input for number of bars for moving average, Switch to choose moving average type, Display Options and Time Frame of trading----------------------------------------------------------------

bars = input.int(66, "Moving average length (number of bars)", minval=1, group='Strategy') //66 bars and VWMA for BTCUSD on 12 Hours.. 35 bars and VWMA for BTCUSD on 1 Day
strategy = input.string("VWMA", "Moving Average type", options = ["EMA", "SMA", "RMA", "WMA", "VWMA"], group='Strategy')

redOn = input.string("On", "Red Background Color On/Off", options = ["On", "Off"], group='Display')
greenOn = input.string("On", "Green Background Color On/Off", options = ["On", "Off"], group='Display')
maOn = input.string("On", "Moving Average Plot On/Off", options = ["On", "Off"], group='Display')

startMonth = input.int(title='Start Month 1-12 (set any start time to 0 for furthest date)', defval=1, minval=0, maxval=12, group='Beginning of Strategy')
startDate = input.int(title='Start Date 1-31 (set any start time to 0 for furthest date)', defval=1, minval=0, maxval=31, group='Beginning of Strategy')
startYear = input.int(title='Start Year 2000-2100 (set any start time to 0 for furthest date)', defval=2011, minval=2000, maxval=2100, group='Beginning of Strategy')

endMonth = input.int(title='End Month 1-12 (set any end time to 0 for today\'s date)', defval=0, minval=0, maxval=12, group='End of Strategy')
endDate = input.int(title='End Date 1-31 (set any end time to 0 for today\'s date)', defval=0, minval=0, maxval=31, group='End of Strategy')
endYear = input.int(title='End Year 2000-2100 (set any end time to 0 for today\'s date)', defval=0, minval=0, maxval=2100, group='End of Strategy')

//Strategy Calculations-----------------------------------------------------------------------------------------------------------------------------------------------------------------------

inDateRange = true

maMomentum = switch strategy
    "EMA" => (ta.ema(close, bars) > ta.ema(open, bars)) ? 1 : -1
    "SMA" => (ta.sma(close, bars) > ta.sma(open, bars)) ? 1 : -1
    "RMA" => (ta.rma(close, bars) > ta.rma(open, bars)) ? 1 : -1
    "WMA" => (ta.wma(close, bars) > ta.wma(open, bars)) ? 1 : -1
    "VWMA" => (ta.vwma(close, bars) > ta.vwma(open, bars)) ? 1 : -1
    =>
        runtime.error("No matching MA type found.")
        float(na)

openMA = switch strategy
    "EMA" => ta.ema(open, bars)
    "SMA" => ta.sma(open, bars)
    "RMA" => ta.rma(open, bars)
    "WMA" => ta.wma(open, bars)
    "VWMA" => ta.vwma(open, bars)
    =>
        runtime.error("No matching MA type found.")
        float(na)
        
closeMA = switch strategy
    "EMA" => ta.ema(close, bars)
    "SMA" => ta.sma(close, bars)
    "RMA" => ta.rma(close, bars)
    "WMA" => ta.wma(close, bars)
    "VWMA" => ta.vwma(close, bars)
    =>
        runtime.error("No matching MA type found.")
        float(na)

//Enter or Exit Positions--------------------------------------------------------------------------------------------------------------------------------------------------------------------

if ta.crossover(maMomentum, 0)
    if inDateRange
        strategy.entry('long', strategy.long, comment='long')
if ta.crossunder(maMomentum, 0)
    if inDateRange
        strategy.close('long')

//Plot Strategy Behavior---------------------------------------------------------------------------------------------------------------------------------------------------------------------

plot(series = maOn == "On" ? openMA : na, title = "Open moving Average", color = color.new(color.purple,0), linewidth=3, offset=1)
plot(series = maOn == "On" ? closeMA : na, title = "Close Moving Average", color = color.new(color.white,0), linewidth=2, offset=1)
bgcolor(color = inDateRange and (greenOn == "On") and maMomentum > 0 ? color.new(color.green,75) : inDateRange and (redOn == "On") and maMomentum <= 0 ? color.new(color.red,75) : na, offset=1)

Mais.