
A estratégia de crossover de média móvel é uma estratégia de negociação quantitativa baseada em médias móveis simples. A estratégia gera sinais de compra e venda ao calcular médias móveis simples de diferentes períodos quando elas se cruzam.
Especificamente, a estratégia calcula uma média móvel simples entre a linha de 9 e a linha de 45 dias. Quando o preço atravessa a linha de 9 e a linha de 45 dias, gera um sinal de compra; quando o preço atravessa a linha de 9 e a linha de 45 dias, gera um sinal de venda.
A lógica central da estratégia baseia-se no princípio da forquilha de ouro das médias móveis. As médias móveis são capazes de filtrar efetivamente o ruído do mercado, indicando mudanças na tendência geral. Quando a média de curto prazo atravessa a média de longo prazo, indica que o preço começa a entrar em uma tendência ascendente; Quando a média de curto prazo atravessa a média de longo prazo, indica que o preço começa a entrar em uma tendência descendente.
Especificamente, a estratégia usa uma média móvel simples entre a linha 9 e a linha 45. A linha 9 representa a tendência de curto prazo e a linha 45 representa a tendência de longo prazo. Quando o preço atravessa a linha 9 e a linha 45 acima, o preço da ação está em um canal ascendente no curto e no longo prazo, gerando assim um sinal de compra. Quando o preço atravessa a linha 9 e a linha 45 abaixo, o aumento do preço da ação diminui gradualmente, gerando assim um sinal de venda.
Do ponto de vista da lógica do código, a estratégia primeiro calcula as médias móveis simples da linha 9 e da linha 45, e depois julga a forca de ouro e a forca de morte da linha igual através das funções ta.crossover e ta.crossunder. Ao gerar os sinais de compra e venda, a função plotshape é usada para traçar um gráfico de sinal triangular e triangular invertido no mapa K.
Além disso, a estratégia também estabelece a lógica de parada de perda para posições longas e curtas. Concretamente, após a abertura da posição, o preço mais alto e o preço mais baixo da linha K anterior são extraídos como preço de parada. Isso permite bloquear o lucro e evitar grandes perdas.
Resposta:
A estratégia ainda tem espaço para ser melhorada:
O uso de médias móveis adaptativas ou médias móveis indexadas permite capturar melhor as mudanças de tendência.
Aumentar os sinais de filtragem, como os indicadores de taxa de flutuação, para evitar sinais errados em situações de tremores.
Otimizar os parâmetros para encontrar a melhor combinação de parâmetros
A adição de um mecanismo de acompanhamento de tendências na lógica de stop loss permite que a linha de stop loss acompanhe os preços de forma flexível.
Aumentar o julgamento sobre a resistência de suporte em grandes níveis, evitando sinais errados em áreas de preços-chave.
A combinação de modelos de aprendizagem de máquina permite uma filtragem adicional da qualidade do sinal.
A estratégia de equilíbrio é uma estratégia de acompanhamento de tendências simples e práticas. Ela é capaz de filtrar eficazmente o ruído e capturar as mudanças na tendência de preços a médio e longo prazo.
/*backtest
start: 2022-12-15 00:00:00
end: 2023-12-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("SMA Crossover Strategy", overlay=true)
// Input parameters
fast_length = input(9, title="Fast SMA Length")
slow_length = input(45, title="Slow SMA Length")
// Calculate moving averages
fast_sma = ta.sma(close, fast_length)
slow_sma = ta.sma(close, slow_length)
// Buy condition
buy_condition = ta.crossover(close, fast_sma) and ta.crossover(close, slow_sma)
// Sell condition
sell_condition = ta.crossunder(close, fast_sma) and ta.crossunder(close, slow_sma)
// Calculate stop loss levels
prev_low = request.security(syminfo.tickerid, "1D", low[1], lookahead=barmerge.lookahead_on)
prev_high = request.security(syminfo.tickerid, "1D", high[1], lookahead=barmerge.lookahead_on)
// Plot signals on the chart
plotshape(buy_condition, style=shape.triangleup, location=location.belowbar, color=color.green, size=size.small)
plotshape(sell_condition, style=shape.triangledown, location=location.abovebar, color=color.red, size=size.small)
// Strategy exit conditions
long_stop_loss = sell_condition ? prev_low : na
short_stop_loss = buy_condition ? prev_high : na
strategy.exit("Long Exit", from_entry="Long", when=sell_condition, stop=long_stop_loss)
strategy.exit("Short Exit", from_entry="Short", when=buy_condition, stop=short_stop_loss)
strategy.entry("Long", strategy.long, when=buy_condition)
strategy.entry("Short", strategy.short, when=sell_condition)