Esta estratégia integra o sinal de reversão da linha de base, o filtro de volatilidade ATR e o filtro de tendência HMA para gerar sinais de negociação robustos para estratégias de negociação quantitativas.
A estratégia usa uma média móvel de 37 períodos como linha de base. Quando o preço rompe para cima desta linha de base, ele gera um sinal de compra, e quando ele quebra de cima, ele gera um sinal de venda. Para evitar sinais falsos, a estratégia requer que o preço se mova além da volatilidade de 2xATR depois de penetrar a linha de base para confirmar a validade dos sinais. Além disso, a estratégia usa um HMA de 11 períodos para julgar a tendência principal.
Para a captação de lucro, a estratégia suporta o uso de um ou vários (dois ou três) níveis de captação de lucro.
Em comparação com as estratégias de breakout de média móvel simples, esta estratégia adiciona o filtro de volatilidade ATR que remove muitos sinais inválidos. Isso se alinha muito bem com técnicas de breakout de padrão visual, levando a taxas de vitória mais altas. Além disso, o viés de tendência HMA evita a seleção adversa e reduz significativamente as perdas desnecessárias. O esquema de lucro múltiplo também permite que mais lucros sejam bloqueados.
O principal risco é que o filtro de volatilidade do ATR pode remover alguns sinais válidos, causando falha na abertura de posições em tempo hábil. Além disso, o julgamento da tendência do HMA não é muito significativo às vezes quando o preço está apenas tendo uma retração de curto prazo, não uma reversão. Isso pode levar a stop loss desnecessários. Para reduzir os riscos, podemos baixar o parâmetro do filtro de volatilidade do ATR para permitir mais sinais. Também podemos ajustar o parâmetro do período do HMA para usar o HMA de longo prazo para julgar as principais tendências, evitando interferência de flutuações de curto prazo.
A estratégia pode ser otimizada nos seguintes aspectos:
Testar mais combinações de parâmetros para encontrar o conjunto óptimo de valores, por exemplo, período de referência, período ATR, coeficiente de volatilidade, etc.
Adicionar mais filtros ou osciladores para avaliar as condições de mercado para aumentar a robustez do modelo.
Otimizar os parâmetros dos mecanismos de obtenção de lucros, testar mais níveis de preços e sistemas de atribuição.
Incorporar modelos de aprendizagem de máquina para gerar sinais comerciais mais eficazes.
Esta estratégia integra o sinal de linha de base de média móvel dupla, o filtro de volatilidade ATR e o filtro de viés de tendência HMA em um sistema de negociação quantitativo muito prático.
/*backtest start: 2023-01-10 00:00:00 end: 2024-01-16 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © sevencampbell //@version=5 strategy(title="Baseline Cross Qualifier Volatility Strategy with HMA Trend Bias", overlay=true) // --- User Inputs --- // Baseline Inputs baselineLength = input.int(title="Baseline Length", defval=20) baseline = ta.sma(close, baselineLength) // PBCQ Inputs pbcqEnabled = input.bool(title="Post Baseline Cross Qualifier Enabled", defval=true) pbcqBarsAgo = input.int(title="Post Baseline Cross Qualifier Bars Ago", defval=3) // Volatility Inputs atrLength = input.int(title="ATR Length", defval=14) multiplier = input.float(title="Volatility Multiplier", defval=2.0) rangeMultiplier = input.float(title="Volatility Range Multiplier", defval=1.0) qualifierMultiplier = input.float(title="Volatility Qualifier Multiplier", defval=0.5) // Take Profit Inputs takeProfitType = input.string(title="Take Profit Type", options=["1 Take Profit", "2 Take Profits", "3 Take Profits"], defval="1 Take Profit") // HMA Inputs hmaLength = input.int(title="HMA Length", defval=50) // --- Calculations --- // ATR atr = ta.atr(atrLength) // Range Calculation rangeHigh = baseline + rangeMultiplier * atr rangeLow = baseline - rangeMultiplier * atr rangeColor = rangeLow <= close and close <= rangeHigh ? color.yellow : na bgcolor(rangeColor, transp=90) // Qualifier Calculation qualifier = qualifierMultiplier * atr // Dot Calculation isLong = close > baseline and (close - baseline) >= qualifier and close > ta.hma(close, hmaLength) isShort = close < baseline and (baseline - close) >= qualifier and close < ta.hma(close, hmaLength) colorDot = isLong ? color.green : isShort ? color.red : na plot(isLong or isShort ? baseline : na, color=colorDot, style=plot.style_circles, linewidth=3) // --- Strategy Logic --- // PBCQ pbcqValid = not pbcqEnabled or low[pbcqBarsAgo] > baseline // Entry Logic longCondition = isLong and pbcqValid shortCondition = isShort and pbcqValid if (longCondition) strategy.entry("Long", strategy.long) if (shortCondition) strategy.entry("Short", strategy.short) // Exit Logic if (takeProfitType == "1 Take Profit") strategy.exit("TP/SL", "Long", limit=rangeHigh, stop=rangeLow) strategy.exit("TP/SL", "Short", limit=rangeLow, stop=rangeHigh) else if (takeProfitType == "2 Take Profits") strategy.exit("TP1", "Long", qty=strategy.position_size * 0.5, limit=rangeHigh / 2) strategy.exit("TP2", "Long", qty=strategy.position_size * 0.5, limit=rangeHigh) strategy.exit("TP1", "Short", qty=strategy.position_size * 0.5, limit=rangeLow / 2) strategy.exit("TP2", "Short", qty=strategy.position_size * 0.5, limit=rangeLow) else if (takeProfitType == "3 Take Profits") strategy.exit("TP1", "Long", qty=strategy.position_size * 0.5, limit=rangeHigh / 2) strategy.exit("TP2", "Long", qty=strategy.position_size * 0.25, limit=rangeHigh * 0.75) strategy.exit("TP3", "Long", qty=strategy.position_size * 0.25, limit=rangeHigh * 1.5)