Estratégia de acompanhamento da tendência baseada na média móvel

Autora:ChaoZhang, Data: 2023-10-07 15:04:00
Tags:

Resumo

Esta estratégia identifica a direção da tendência atual, calculando médias móveis de diferentes períodos e gerando sinais de negociação combinados com o indicador RSI. Quando a média móvel de curto período cruza acima da média móvel de longo período, a tendência é considerada e um sinal de compra é gerado. Quando a média móvel de curto período cruza abaixo da média móvel de longo período, a tendência é considerada invertida e um sinal de venda é gerado. O indicador RSI é usado para evitar falsos sinais causados por pequenas flutuações de preços.

Estratégia lógica

  1. Calcule médias móveis simples de 10 dias, 20 dias, 50 dias, 100 dias e 200 dias.

  2. Calcular o valor do RSI de 14 dias.

  3. Quando a SMA de 10 dias cruzar acima da SMA de 50 dias, e o RSI for superior a 30, e a SMA de 20 dias for superior ou igual à SMA de 100 dias ou a SMA de 50 dias for superior ou igual à SMA de 100 dias, comprar.

  4. A taxa de variação da taxa de variação da taxa de variação da taxa de variação da taxa de variação da taxa de variação da taxa de variação da taxa de variação da taxa de variação.

  5. Vender quando:

    • A SMA de 10 dias cruza abaixo da SMA de 50 dias e o fechamento está abaixo da SMA de 20 dias: sinal de venda da inversão da tendência
    • Fechar abaixo de 95% do preço de entrada: venda de stop loss
    • Fechar está abaixo do preço de stop loss: venda de stop loss

Esta estratégia julga a tendência do mercado usando médias móveis e define stop loss para controlar os riscos. O RSI filtra falhas. Ele compra quando o SMA de curto período cruza acima do SMA de longo período, indicando uma tendência de alta, e define uma linha de stop loss para controlar os riscos durante o período de detenção. Ele vende quando ocorre um sinal de reversão da tendência ou o preço de stop loss é desencadeado.

Análise das vantagens

  • Usando médias móveis para determinar a direção da tendência, comprar durante a tendência de alta evita a negociação em mercados de faixa
  • A utilização de médias móveis de períodos múltiplos evita ser enganado por flutuações de preços a curto prazo
  • A combinação com o RSI filtra sinais falsos
  • Estabelecimento de controlos do risco de queda para cada operação
  • Utilização de stop loss para bloquear os lucros

Análise de riscos

  • As médias móveis têm atraso e podem perder o melhor momento para a reversão do preço
  • O nível de prejuízo estabelecido pode ser demasiado fraco para levar a grandes perdas em operações individuais
  • A fixação do stop loss demasiado apertada pode provocar desencadeamentos de stop loss demasiado frequentes
  • O trailing stop loss pode sair muito cedo perdendo lucros maiores

A otimização pode ser feita através do ajuste de períodos de média móvel, níveis de stop loss, etc. Considere também a combinação com outros indicadores para melhorar a precisão.

Orientações de otimização

  • Ajustar os períodos de média móvel para se adequarem às diferentes condições de mercado
  • Otimizar os parâmetros do RSI para identificar melhor as condições de sobrecompra/supervenda
  • Estabelecer níveis razoáveis de perda de paragem estática e de paragem de trilha com base nas características dos instrumentos
  • Adicionar outros indicadores para evitar sinais falsos
  • Ajuste dinâmico de stop loss com base na volatilidade, etc.
  • Optimização automática de parâmetros através de aprendizado de máquina

Resumo

A estratégia tem uma lógica geral clara, usando médias móveis para determinação de tendências e definindo stop loss para controlar riscos. É uma estratégia típica de rastreamento de tendências. Melhorias adicionais podem ser alcançadas através do ajuste de parâmetros e adição de outros indicadores.


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

//@version=4
strategy("MA_Script", overlay=true)

// STEP 1:
// Configure trail stop level with input options (optional)
longTrailPerc=input(title="Trail Long Loss (%)", type=input.float, minval=0.0, step=0.05, defval=0.1)

// Configure backtest start date with inputs
startDate=input(title="Start Date", type=input.integer, defval=1, minval=1, maxval=31)
startMonth=input(title="Start Month", type=input.integer, defval=1, minval=1, maxval=12)
startYear=input(title="Start Year", type=input.integer, defval=2020, minval=1800, maxval=2100)

// See if this bar's time happened on/after start date
afterStartDate=(time >=timestamp(syminfo.timezone, startYear, startMonth, startDate, 0, 0))

// Calculate Relative Strength Index
rsiValue=rsi(close, 14)

// Calculate moving averages
MA10_Val =sma(close, 10)
//plot(MA10_Val, color=color.yellow, linewidth=1)

MA20_Val =sma(close, 20)
plot(MA20_Val, color=color.green, linewidth=1)

MA50_Val =sma(close, 50)
plot(MA50_Val, color=color.red, linewidth=1)

MA100_Val =sma(close, 100)
plot(MA100_Val, color=color.blue, linewidth=1) 

MA200_Val =sma(close, 200)
plot(MA200_Val, color=color.purple, linewidth=1) 

// Calculate candlestick
C_BodyHi = max(close, open)
C_BodyLo = min(close, open)
C_Body = C_BodyHi - C_BodyLo
C_UpShadow = high - C_BodyHi
C_DnShadow = C_BodyLo - low

// STEP 2:
// Calculate entry trading conditions
buyCondition_1=crossover(MA10_Val, MA50_Val) and (rsiValue > 30) and ((MA20_Val >=  MA100_Val) or (MA50_Val >=  MA100_Val))
avg_price = (close + open)/2

// First Entry
if (afterStartDate)
    strategy.entry(id="Entry_Trade_1", long=true, limit=avg_price, when=buyCondition_1)

plotchar(afterStartDate and crossover(MA10_Val, MA50_Val), textcolor = color.blue, text = 'MA\n')

// Determine trail stop loss prices
longStopPrice=0.0

longStopPrice :=if (strategy.position_size > 0)
    stopValue=C_BodyHi * (1 - longTrailPerc)
    max(stopValue, longStopPrice[1])
else
    0
plot(longStopPrice, color=color.orange, linewidth=1)

bought_1=strategy.position_size[0] > strategy.position_size[1]
entry_Point_1=valuewhen(bought_1, avg_price, 0)

// STEP 3:
// Calculate exit trading conditions
sellCondition_2=crossunder(MA10_Val, MA50_Val) and (close < MA20_Val)
sellCondition_3_temp=valuewhen((C_BodyHi >= entry_Point_1*1.2), 1, 0)
sellCondition_1=(entry_Point_1*0.95 > close) and (sellCondition_3_temp != 1)
sellCondition_3=(sellCondition_3_temp == 1) and (strategy.position_size > 0) and close <= longStopPrice
plotchar((sellCondition_3 == 1) and (strategy.position_size > 0) and close <= longStopPrice, textcolor = color.red, text = 'TS\n', show_last = 11)
plotchar(crossunder(MA10_Val, MA50_Val), textcolor = color.red, text = 'MA\n')

id_val = ""
stop_val = close
condition = false

if sellCondition_1
    id_val := "Exit By Stop Loss At 7%"
    stop_val := entry_Point_1*0.93
    condition := true
else if sellCondition_2
    id_val := "Exit By Take Profit based on MA"
    stop_val := close
    condition := true
else if sellCondition_3
    id_val := "Exit By Trailing Stop"
    stop_val := longStopPrice
    condition := true

// Submit exit orders for trail stop loss price
if (strategy.position_size > 0)
    //strategy.exit(id="Exit By Stop Loss At 7%", from_entry="Entry_Trade_1", stop=entry_Point_1*0.93, when=sellCondition_1)
    //strategy.exit(id="Exit By Take Profit based on MA", from_entry="Entry_Trade_1", stop=close, when=sellCondition_2)
    strategy.exit(id=id_val, from_entry="Entry_Trade_1", stop=stop_val, when=condition)
    
    


Mais.