Este artigo discute uma estratégia de negociação baseada em uma média móvel simples. A estratégia compara o preço de fechamento com uma média móvel de 17 períodos, indo longo quando o preço de fechamento cruza acima da média móvel e indo curto quando cruza abaixo.
A estratégia utiliza os seguintes parâmetros para calcular a média móvel:
Com base nestes parâmetros, a função getMAType() é chamada para calcular a SMA de 17 períodos dos preços de fechamento.
Em seguida, compare a relação entre o preço de fechamento e a média móvel:
Quando o preço de fechamento cruza acima da média móvel de baixo, é gerado um sinal longo.
Durante o período de backtest, abrir posições longas quando aparecerem sinais longos e abrir posições curtas quando aparecerem sinais curtos.
A maior vantagem desta estratégia é que a lógica é muito simples e clara. Com apenas um indicador, ele julga a reversão da tendência com base na mudança de direção do indicador. A estratégia é fácil de entender e implementar, adequada para iniciantes aprenderem.
Além disso, as médias móveis pertencem a indicadores de tendência, que podem efetivamente acompanhar as alterações da tendência e evitar interferências do ruído do mercado a curto prazo.
Ao ajustar os parâmetros, pode adaptar-se a diferentes ciclos e a diferentes produtos.
Em primeiro lugar, esta estratégia baseia-se apenas num único indicador, pelo que os critérios de avaliação são relativamente únicos, o que pode gerar mais sinais falsos.
Além disso, como sistema de tendência, não funciona bem nos mercados de gama e lateral.
Além disso, sem stop loss ou take profit, existe o risco de expansão das perdas.
As soluções são incorporar outros indicadores, otimizar combinações de parâmetros para reduzir sinais falsos, adicionar stop loss e take profit para controlar riscos e otimizar drawdowns.
Aqui estão algumas ideias para otimizar a estratégia:
Ajustar os parâmetros da média móvel, otimizar os números dos períodos, por exemplo, mudar para 30 ou 50 períodos.
Tente diferentes tipos de médias móveis, como EMA, VIDYA etc. Eles têm sensibilidade variável às mudanças de preço.
Adicionar outros indicadores em combinação, por exemplo, MACD para avaliar a força; RSI para reduzir falsos sinais.
Adicionar mecanismos de stop loss: definir percentagem fixa ou stop loss de trailing baseado em ATR para controlar o montante da perda de uma única negociação.
Adicionar mecanismos de lucro, definir percentagem de lucro para maximizar os lucros.
Estas otimizações podem tornar o desempenho da estratégia mais estável e evitar atrasos excessivos.
Este artigo analisa uma estratégia de negociação simples baseada em uma média móvel de 17 períodos. A estratégia tem fontes de sinal simples, fáceis de entender e implementar, pertencente a um sistema típico de tendência. Através de uma interpretação aprofundada da estratégia, seus prós e contras são analisados e múltiplas dimensões de ideias de otimização são propostas. Acredita-se que, através de otimização e enriquecimento contínuos, esta estratégia possa evoluir gradualmente e alcançar retornos estáveis também na negociação ao vivo.
/*backtest start: 2023-12-05 00:00:00 end: 2024-01-04 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("Simple 17 BF 🚀", overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.0) /////////////// Time Frame /////////////// testStartYear = input(2012, "Backtest Start Year") testStartMonth = input(1, "Backtest Start Month") testStartDay = input(1, "Backtest Start Day") testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0) testStopYear = input(2019, "Backtest Stop Year") testStopMonth = input(12, "Backtest Stop Month") testStopDay = input(31, "Backtest Stop Day") testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0) testPeriod() => true ///////////// Moving Average ///////////// source = input(title="MA Source", defval=ohlc4) maType = input(title="MA Type", defval="sma", options=["sma", "ema", "swma", "wma", "vwma", "rma"]) length = input(title="MA Length", defval=17) ///////////// Get MA Function ///////////// getMAType(maType, sourceType, maLen) => res = sma(close, 1) if maType == "ema" res := ema(sourceType, maLen) if maType == "sma" res := sma(sourceType, maLen) if maType == "swma" res := swma(sourceType) if maType == "wma" res := wma(sourceType, maLen) if maType == "vwma" res := vwma(sourceType, maLen) if maType == "rma" res := rma(sourceType, maLen) res MA = getMAType(maType, source, length) /////////////// Strategy /////////////// long = close > MA short = close < MA last_long = 0.0 last_short = 0.0 last_long := long ? time : nz(last_long[1]) last_short := short ? time : nz(last_short[1]) long_signal = crossover(last_long, last_short) short_signal = crossover(last_short, last_long) /////////////// Execution /////////////// if testPeriod() strategy.entry("L", strategy.long, when=long_signal) strategy.entry("S", strategy.short, when=short_signal) /////////////// Plotting /////////////// p1 = plot(MA, color = long ? color.lime : color.red, linewidth=2) p2 = plot(close, linewidth=2) fill(p1, p2, color=strategy.position_size > 0 ? color.lime : strategy.position_size < 0 ? color.red : color.white, transp=80)