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.
Utilize o indicador ATR para medir a volatilidade do mercado dos últimos 14 dias.
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.
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.
Calcule o MACD com 12, 26, 9 parâmetros. Um histograma MACD positivo dá sinal de compra.
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.
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.
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.
A estratégia tem os seguintes pontos fortes:
Operações sistemáticas com intervenções menos subjetivas.
Parâmetros adaptáveis ajustados em função das condições do mercado.
Maior precisão do sinal com combinação de múltiplos indicadores.
Menor risco com Bollinger Bands auto stop loss.
Filtragem da condição para evitar falsos sinais.
Stop loss dinâmico e take profit para seguir as tendências.
Os principais riscos são:
Estratégia inválida se não estiverem ajustados os parâmetros.
Falha do modelo devido a eventos repentinos.
Margem de lucro comprimida do custo de negociação.
Maior complexidade com múltiplos módulos.
Direcções potenciais de otimização:
Melhorar os critérios de avaliação do ambiente de mercado.
Introduzir aprendizado de máquina para adaptação automática de parâmetros.
Adicione análise de texto para detectar eventos.
Testes de retrospectiva em vários mercados para encontrar os melhores parâmetros.
Implementar uma estratégia de trailing stop para obter melhores lucros.
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)