Estratégia de combinação de média móvel dinâmica

Autora:ChaoZhang, Data: 2024-02-05 10:23:10
Tags:

img

Resumo

A Estratégia Combinada de Crossover de Média Móvel Dinâmica é uma estratégia de negociação combinada que integra múltiplos indicadores técnicos e detecção de condições de mercado. Ela calcula dinamicamente a volatilidade do mercado e determina três fases de mercado com base na distância do preço da média móvel de longo prazo e volatilidade: volátil, tendência e consolidação. Sob diferentes condições de mercado, a estratégia adota diferentes regras de entrada e saída e gera sinais de compra e venda com uma combinação de indicadores como EMA/SMA crossover, MACD e Bollinger Bands.

Estratégia lógica

Calcular a volatilidade do mercado

Utilize o indicador ATR para medir a volatilidade do mercado dos últimos 14 dias.

Determinar as fases do mercado

Calcule a distância entre o preço e a SMA de 200 dias. Se a distância absoluta exceder 1,5 vezes a volatilidade média com uma direção clara, ela é determinada como um mercado de tendência. Se a volatilidade atual exceder 1,5 vezes a média, é um mercado volátil.

Crossover EMA/SMA

O período de EMA rápida é de 10 dias. O período de SMA lenta é de 30 dias. Um sinal de compra é gerado quando a EMA rápida cruza acima da SMA lenta.

MACD

Calcule o MACD com 12, 26, 9 parâmetros. Um histograma MACD positivo dá sinal de compra.

Bandeiras de Bollinger

Calcule o canal de desvio padrão de 20 dias. Se a largura do canal for menor que a SMA de 20 dias, ele está se consolidando.

Regras de entrada

Volatil: inserir longo quando crossover ou MACD positivo com preço dentro de faixas.

Tendência: inserir longo quando crossover ou MACD positivo.

Consolidação: inserir longo quando cruzar e preço acima da faixa inferior.

Regras de saída

Geral: Sair quando o MACD for negativo por 2 bares e o preço cair por 2 dias.

Volatil: mais saída quando o StockRSI for sobrecomprado.

Consolidação: mais saída quando o preço está abaixo da faixa superior.

Vantagens

A estratégia tem os seguintes pontos fortes:

  1. Operações sistemáticas com intervenções menos subjetivas.

  2. Parâmetros adaptáveis ajustados em função das condições do mercado.

  3. Maior precisão do sinal com combinação de múltiplos indicadores.

  4. Menor risco com Bollinger Bands auto stop loss.

  5. Filtragem da condição para evitar falsos sinais.

  6. Stop loss dinâmico e take profit para seguir as tendências.

Riscos

Os principais riscos são:

  1. Estratégia inválida se não estiverem ajustados os parâmetros.

  2. Falha do modelo devido a eventos repentinos.

  3. Margem de lucro comprimida do custo de negociação.

  4. Maior complexidade com múltiplos módulos.

Reforço

Direcções potenciais de otimização:

  1. Melhorar os critérios de avaliação do ambiente de mercado.

  2. Introduzir aprendizado de máquina para adaptação automática de parâmetros.

  3. Adicione análise de texto para detectar eventos.

  4. Testes de retrospectiva em vários mercados para encontrar os melhores parâmetros.

  5. Implementar uma estratégia de trailing stop para obter melhores lucros.

Conclusão

A estratégia de combo de crossover de média móvel dinâmica é um sistema de negociação quantitativa inteligente de múltiplos indicadores. Ajusta os parâmetros dinamicamente com base nas condições do mercado para implementar uma negociação sistemática baseada em regras. A estratégia é altamente adaptável e determinista.


/*backtest
start: 2024-01-28 00:00:00
end: 2024-02-04 00:00:00
period: 10m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Improved Custom Strategy", shorttitle="ICS", overlay=true)

// Volatility
volatility = ta.atr(14)
avg_volatility_sma = ta.sma(volatility, 100)
avg_volatility = na(avg_volatility_sma) ? 0 : avg_volatility_sma

// Market Phase detection
long_term_ma = ta.sma(close, 200)
distance_from_long_term_ma = close - long_term_ma
var bool isTrending = math.abs(distance_from_long_term_ma) > 1.5 * avg_volatility and not na(distance_from_long_term_ma)
var bool isVolatile = volatility > 1.5 * avg_volatility

// EMA/MA Crossover
fast_length = 10
slow_length = 30
fast_ma = ta.ema(close, fast_length)
slow_ma = ta.sma(close, slow_length)
crossover_signal = ta.crossover(fast_ma, slow_ma)

// MACD
[macdLine, signalLine, macdHistogram] = ta.macd(close, 12, 26, 9)
macd_signal = crossover_signal or (macdHistogram > 0)

// Bollinger Bands
source = close
basis = ta.sma(source, 20)
upper = basis + 2 * ta.stdev(source, 20)
lower = basis - 2 * ta.stdev(source, 20)
isConsolidating = (upper - lower) < ta.sma(upper - lower, 20)

// StockRSI
length = 14
K = 100 * (close - ta.lowest(close, length)) / (ta.highest(close, length) - ta.lowest(close, length))
D = ta.sma(K, 3)
overbought = 75
oversold = 25

var float potential_SL = na
var float potential_TP = na
var bool buy_condition = na
var bool sell_condition = na

// Buy and Sell Control Variables
var bool hasBought = false
var bool hasSold = true

// Previous values tracking
prev_macdHistogram = macdHistogram[1]
prev_close = close[1]

// Modify sell_condition with the new criteria
if isVolatile
    buy_condition := not hasBought and crossover_signal or macd_signal and (close > lower) and (close < upper)
    sell_condition := hasBought and (macdHistogram < 0 and prev_macdHistogram < 0) and (close < prev_close and prev_close < close[2])
    potential_SL := close - 0.5 * volatility
    potential_TP := close + volatility

if isTrending
    buy_condition := not hasBought and crossover_signal or macd_signal
    sell_condition := hasBought and (macdHistogram < 0 and prev_macdHistogram < 0) and (close < prev_close and prev_close < close[2])
    potential_SL := close - volatility
    potential_TP := close + 2 * volatility

if isConsolidating
    buy_condition := not hasBought and crossover_signal and (close > lower)
    sell_condition := hasBought and (close < upper) and (macdHistogram < 0 and prev_macdHistogram < 0) and (close < prev_close and prev_close < close[2])
    potential_SL := close - 0.5 * volatility
    potential_TP := close + volatility

// Update the hasBought and hasSold flags
if buy_condition
    hasBought := true
    hasSold := false

if sell_condition
    hasBought := false
    hasSold := true

// Strategy Entry and Exit
if buy_condition
    strategy.entry("BUY", strategy.long, stop=potential_SL, limit=potential_TP)
    strategy.exit("SELL_TS", from_entry="BUY", trail_price=close, trail_offset=close * 0.05)

if sell_condition
    strategy.close("BUY")
    
// Visualization
plotshape(series=buy_condition, style=shape.labelup, location=location.belowbar, color=color.green, text="BUY", size=size.small)
plotshape(series=sell_condition, style=shape.labeldown, location=location.abovebar, color=color.red, text="SELL", size=size.small)

plot(long_term_ma, color=color.gray, title="200-Day MA", linewidth=1)
plot(potential_SL, title="SL Level", color=color.red, linewidth=1, style=plot.style_linebr)
plot(potential_TP, title="TP Level", color=color.green, linewidth=1, style=plot.style_linebr)

bgcolor(isVolatile ? color.new(color.purple, 90) : isTrending ? color.new(color.blue, 90) : isConsolidating ? color.new(color.orange, 90) : na)


Mais.