Estratégia de negociação de retrocesso baseada na média móvel dinâmica

Autora:ChaoZhang, Data: 2024-02-27 14:38:45
Tags:

img

Resumo

Esta estratégia emprega um sistema de média móvel dupla para identificar potenciais oportunidades de ruptura em ações ou criptomoedas selecionadas.

Estratégia lógica

A estratégia utiliza duas médias móveis simples (SMA) com períodos diferentes como sinais de negociação. A primeira SMA tem um período mais longo para representar a direção geral da tendência. A segunda SMA tem um período mais curto para capturar flutuações de preços de curto prazo.

Quando a SMA de curto prazo cruza acima da SMA de longo prazo de baixo, sinaliza uma tendência de alta nos preços em geral, portanto, a estratégia abre uma posição longa.

Além disso, a estratégia tem condições de "supervenda" e "supercompra" para evitar a negociação em situações extremas.

Vantagens

  • O sistema de médias móveis duplas identifica eficazmente as tendências a médio prazo
  • Combina os méritos da negociação de tendência e de retrocesso
  • As condições de sobrevenda e sobrecompra incorporadas reduzem as transacções desnecessárias

Análise de riscos

  • Difícil de determinar o momento preciso do fim da retirada, pode parar prematuramente
  • Incapacidade de reduzir rapidamente as perdas quando a tendência muda, pode sofrer grandes atrasos
  • A regulação dos parâmetros pode resultar em negociação excessiva ou conservadora

Orientações de otimização

Há ainda mais espaço para otimizar esta estratégia:

  1. Utilize indicadores técnicos mais avançados como Bollinger Bands e KD para medir as ondas e tendências de preços
  2. Incorporar mais fatores como a mudança de volume, volatilidade para determinar a conclusão de pullback
  3. Dimensão dinâmica das posições para maximizar o potencial de lucro
  4. Otimize a lógica de stop loss com KAMA, nuvens de Ichimoku e sinais de menor tempo

Conclusão

Esta estratégia combina os pontos fortes da negociação de tendência e pullback usando um sistema de média móvel dupla para detectar oportunidades. Ao mesmo tempo, as condições de sobrecompra / sobrevenda incorporadas evitam a abertura desnecessária de posições. É uma estratégia de negociação quantitativa muito prática que vale a pena pesquisa e otimização mais profundas.


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

// @version=5
strategy("Profitable Pullback Trading Strategy", overlay=true,initial_capital=1000, default_qty_type=strategy.percent_of_equity, default_qty_value=100)

// Inputs
ma_length1 = input.int(280,'MA length 1', step = 10,group = 'Moving Avg. Parameters', inline = 'MA')
ma_length2 = input.int(13,'MA length 2', step = 1,group = 'Moving Avg. Parameters', inline = 'MA')
sl = input.float(title="Stop Loss (%)", defval=0.07, step=0.1, group="Moving Avg. Parameters")
too_deep    = input.float(title="Too Deep (%)", defval=0.27, step=0.01, group="Too Deep and Thin conditions", inline = 'Too')
too_thin    = input.float(title="Too Thin (%)", defval=0.03, step=0.01, group="Too Deep and Thin conditions", inline = 'Too')

// Calculations
ma1 = ta.sma(close,ma_length1)
ma2 = ta.sma(close,ma_length2)
too_deep2   = (ma2/ma1-1) < too_deep
too_thin2   = (ma2/ma1-1) > too_thin

// Entry and close condtions
var float buy_price = 0
buy_condition = (close > ma1) and (close < ma2) and strategy.position_size == 0 and too_deep2 and too_thin2
close_condition1  = (close > ma2) and strategy.position_size > 0 and (close < low[1])
stop_distance = strategy.position_size > 0 ? ((buy_price - close) / close) : na
close_condition2 = strategy.position_size > 0 and stop_distance > sl
stop_price = strategy.position_size > 0 ? buy_price - (buy_price * sl) : na

// Entry and close orders
if buy_condition
    strategy.entry('Long',strategy.long)
if buy_condition[1]
    buy_price := open
if close_condition1 or close_condition2
    strategy.close('Long',comment="Exit" + (close_condition2 ? "SL=true" : ""))
    buy_price := na

plot(ma1,color = color.blue)
plot(ma2,color = color.orange)



Mais.