Estratégia de negociação de média móvel dupla lenta e rápida

Autora:ChaoZhang, Data: 2023-10-27 16:41:24
Tags:

img

Resumo

A estratégia de negociação de média móvel dupla gera sinais de negociação calculando médias móveis rápidas e lentas e observando cruzes. Quando a média móvel rápida cruza acima da média móvel lenta, uma posição longa é tomada. Quando a média móvel rápida cruza abaixo da média móvel lenta, uma posição curta é tomada.

Estratégia lógica

A estratégia define primeiro os comprimentos da média móvel rápida maFastLength e da média móvel lenta maSlowLength. Em seguida, calcula a média móvel rápida fastMA e a média móvel lenta slowMA. A média móvel rápida reage mais rapidamente às mudanças de preço e é usada para julgar a tendência atual, enquanto a média móvel lenta reage mais lentamente e é usada para determinar a direção da tendência.

Quando a média móvel rápida cruza acima da média móvel lenta, um sinal de entrada longo goLong() é gerado.

A estratégia pode ser definida como apenas longa, apenas curta ou permitir tanto negociações longas como curtas.

No modo longo, as posições longas são inseridas no sinal goLong() e retiradas no sinal killLong().

No modo apenas curto, as posições curtas são inseridas no sinal killLong() e saem no sinal goLong().

No modo de troca, as posições longas são inseridas no goLong ((), fechadas e revertidas para curto no killLong (().

A estratégia também inclui stop loss, trailing stop, mensagens e outros recursos opcionais.

Vantagens

  1. Simples e fáceis de implementar.

  2. Flexibilidade para ir longo, curto ou ambos.

  3. Funções opcionais de stop loss e trailing stop.

  4. Mensagens personalizáveis para alertar negócios.

  5. Sensível às alterações de tendência no mercado.

  6. Os parâmetros ajustáveis adaptam-se aos diferentes mercados.

Riscos

  1. Pode gerar trocas excessivas em mercados agitados ou variáveis.

  2. Lento para reagir a notícias repentinas.

  3. A selecção de parâmetros afeta o desempenho da estratégia.

  4. Deve seguir os sinais estritamente, evitar negociações discricionárias.

  5. Os custos de negociação podem corroer os lucros se não forem considerados.

Melhorias

  1. Adicione filtros como o RSI para evitar sinais falsos.

  2. Implementar a otimização de parâmetros para encontrar as melhores configurações.

  3. Use paradas dinâmicas para bloquear lucros e ajustar.

  4. Incorporar aprendizado de máquina para ajudar a previsão de tendências.

  5. Otimizar a mensagem para os hábitos comerciais individuais.

Conclusão

A estratégia de média móvel dupla é relativamente simples e útil para capturar tendências fortes. No entanto, deve-se tomar cuidado para evitar problemas em ambientes de baixa tendência. Parâmetros de ajuste fino e adição de indicadores ou melhorias auxiliares podem melhorar ainda mais a robustez e a adaptabilidade.


/*backtest
start: 2022-10-20 00:00:00
end: 2023-10-26 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4

strategy("SMA Strategy", shorttitle="SMA Strategy", overlay=true, pyramiding=0, default_qty_type=strategy.percent_of_equity, default_qty_value=100)

// === Inputs ===
// short ma
maFastSource = input(defval=close, title="Fast MA Source")
maFastLength = input(defval=3, title="Fast MA Period", minval=1)

// long ma
maSlowSource = input(defval=close, title="Slow MA Source")
maSlowLength = input(defval=9, title="Slow MA Period", minval=1)

// Trade direction
shorting = input(defval=false, title="Short only?")
longonly = input(defval=true, title="Long only?")
swapping = input(defval=false, title="Swap orders?")
// risk management
useStop = input(defval=false, title="Use Initial Stop Loss?")
slPoints = input(defval=25, title="Initial Stop Loss Points", minval=1)
useTS = input(defval=false, title="Use Trailing Stop?")
tslPoints = input(defval=120, title="Trail Points", minval=1)
useTSO = input(defval=false, title="Use Offset For Trailing Stop?")
tslOffset = input(defval=20, title="Trail Offset Points", minval=1)

// Messages for buy and sell
message_long_entry  = input("Long entry message", title="Long entry message")
message_long_exit   = input("Long exit message", title="Long exit message")
message_short_entry = input("Short entry message", title="Short entry message")
message_short_exit  = input("Short exit message", title="Short exit message")

// Calculate start/end date and time condition
startDate  = input(timestamp("2021-01-01T00:00:00"), type = input.time)
finishDate = input(timestamp("2021-12-31T00:00:00"), type = input.time)
 
time_cond  = true
// === Vars and Series ===
fastMA = sma(maFastSource, maFastLength)
slowMA = sma(maSlowSource, maSlowLength)

plot(fastMA, color=color.blue)
plot(slowMA, color=color.purple)

goLong() =>
    crossover(fastMA, slowMA)
killLong() =>
    crossunder(fastMA, slowMA)
    
// Long only
if longonly
    strategy.entry("Buy", strategy.long, when=goLong() and time_cond, alert_message = message_long_entry)
    strategy.close("Buy", when=killLong() and time_cond, alert_message = message_long_exit)

// Short only
if shorting
    strategy.entry("Sell", strategy.short, when=killLong() and time_cond, alert_message = message_short_entry)
    strategy.close("Sell", when=goLong() and time_cond, alert_message = message_short_exit)
    
// Order Swapping
if swapping
    strategy.entry("Buy", strategy.long, when=goLong() and time_cond, alert_message = message_long_entry)
    strategy.entry("Sell", strategy.short, when=killLong() and time_cond, alert_message = message_short_entry)

if useStop
    strategy.exit("XLS", from_entry="Buy", stop=strategy.position_avg_price / 1.08, alert_message = message_long_exit)
    strategy.exit("XSS", from_entry="Sell", stop=strategy.position_avg_price * 1.08, alert_message = message_short_exit)



Mais.