
A estratégia de negociação de precisão dinâmica multidimensional de matriz de média móvel com ATR é um sistema de negociação de alta quantidade projetado para condições de mercado em rápida mudança. O núcleo da estratégia consiste na combinação de vários tipos de filtros de média móvel e ATR (medida real de amplitude de onda) para formar uma matriz de negociação altamente flexível e adaptável.
A estratégia baseia-se na colaboração de vários componentes-chave:
Matriz de média móvel de alto nívelA estratégia implementa até 11 tipos diferentes de médias móveis, incluindo SMA, EMA, SMMA, HMA, TEMA, WMA, VWMA, ZLEMA, ALMA, KAMA e DEMA. Cada média móvel tem seu método de cálculo e características de resposta únicas, com uma escolha flexível de acordo com as condições do mercado. O sistema usa duas médias móveis (rápidas e lentas) como principais indicadores de tendência, e suas cruzadas e posições relativas são usadas para gerar sinais de negociação básicos.
Gerenciamento de riscos baseado no ATRA estratégia é usar os indicadores ATR para medir a volatilidade do mercado e aplicá-los em vários aspectos:
Filtro de tendências de quadros temporais múltiplosEstratégia: Aumentar a confiabilidade do sinal, assegurando que a direção da negociação esteja em consonância com as tendências do mercado maior, consultando a tendência da média móvel em um período de tempo mais longo (de 15 minutos).
Verificação do volume e da janela de tempoA transação é executada somente quando o requisito de volume mínimo de transação é atingido, quando há uma ruptura de volume de transação e dentro de uma janela de tempo de transação predefinida, melhorando ainda mais a qualidade da transação.
Logística de geração de sinais:
Lógica de saída integradaA estratégia usa um mecanismo de saída de três camadas: stop-loss fixo (multiplicado pelo ATR), lucro-alvo (multiplicado pelo ATR) e stop-loss de rastreamento (ajustado dinamicamente com base no ATR), oferecendo proteção de risco completa para cada transação.
Analisando o código da estratégia, pode-se concluir os seguintes pontos fortes:
Excelente adaptabilidade: Através de vários tipos de médias móveis comutáveis (de HMA a KAMA, etc.), a estratégia é capaz de se adaptar a diferentes condições de mercado. Esta flexibilidade permite ao comerciante escolher o melhor indicador de acordo com o ambiente de mercado atual, sem a necessidade de reescrever toda a estratégia.
Gestão de Riscos DinâmicosO mecanismo de controle de risco baseado no ATR garante que os objetivos de stop loss e profit sejam automaticamente ajustados de acordo com a volatilidade do mercado. Esta abordagem oferece melhor proteção em mercados com maior volatilidade, enquanto permite capturar mais lucros em mercados em tendência.
Filtragem de sinais multicamadasA estratégia efetivamente reduziu os sinais de erro e melhorou a qualidade das negociações, através da combinação de cruzamento de médias móveis, análise de volume de transação, redução de volatilidade e filtragem de tendências em vários períodos de tempo. Em particular, a função de filtragem de tendências em períodos de 15 minutos reduziu significativamente a possibilidade de negociação contracorrente.
Condições de admissão precisasA estratégia não depende apenas do cruzamento de indicadores técnicos, mas também exige que os preços mantenham uma distância ATR suficiente entre eles e a média móvel lenta, o que ajuda a evitar a negociação frequente em mercados horizontais e reduz os prejuízos causados por brechas falsas.
Monitoramento de desempenho transparenteO painel de instrumentos incorporado fornece uma exibição em tempo real dos principais indicadores de desempenho, incluindo o lucro/perda atual, o equilíbrio, o ATR (o valor bruto e a porcentagem) e a diferença entre as médias móveis, permitindo que os comerciantes avaliem o estado da estratégia em tempo real.
Apesar da estratégia ser bem concebida, existem os seguintes riscos potenciais:
Parâmetros de optimização de armadilhasA estratégia contém uma grande quantidade de parâmetros (tipos e períodos de médias móveis, períodos de ATR e multiplicações, etc.) e a otimização excessiva pode levar à adaptação da curva, fazendo com que a estratégia não funcione bem em negociações em disco. A solução é realizar testes robustos entre mercados e períodos de tempo, evitando ajustes excessivos nos parâmetros.
Risco de uma rápida reversãoApesar do uso de stop loss dinâmico ATR, em situações de reversão súbita do mercado (como após um grande comunicado de imprensa), os preços podem saltar antes do stop loss ser acionado, resultando em perdas superiores às esperadas. Recomenda-se a implementação de controles de risco noturnos adicionais ou a suspensão da negociação antes de eventos de alta volatilidade.
Atrasos no sinalTodas as médias móveis são inerentemente retardadas. Mesmo variantes de baixa latência, como HMA ou ZLEMA, podem perder pontos de entrada ideais em mercados rápidos. Pode-se considerar a combinação de indicadores de dinâmica ou comportamento de preços para complementar os sistemas de sinalização existentes.
Dependência de volume de transaçãoA estratégia é emitida quando o volume de negócios aumenta, mas em certos mercados ou períodos de tempo, o volume de negócios pode ser enganoso. Se necessário, o filtro de volume de negócios deve ser ajustado ou considerar desativar este recurso em determinadas condições de mercado.
Limitação da janela de tempoA janela de horas de negociação designada pode perder oportunidades importantes de negociação noturna ou matinal. É recomendável ajustar a hora de negociação de acordo com o horário mais ativo de um determinado mercado.
Depois de analisarmos o código, aqui estão algumas maneiras possíveis de otimizá-lo:
Ajustes de parâmetros de adaptaçãoAtualmente, a estratégia usa configurações de parâmetros fixos. Uma otimização avançada é a implementação de parâmetros que se ajustam automaticamente com base no estado do mercado (trend, volatilidade, amplitude). Por exemplo, o ATR pode ser aumentado automaticamente durante períodos de alta volatilidade ou o tipo de média móvel pode ser alterado em diferentes ambientes de mercado.
Integração de modelos de aprendizagem de máquinaA introdução de uma camada de aprendizado de máquina para prever quais tipos de médias móveis podem funcionar melhor sob as condições atuais do mercado, selecionando automaticamente a combinação de médias móveis mais adequada. Isso pode ser feito analisando o desempenho relativo de diferentes indicadores em dados históricos.
Identificar tendências para melhoriasAlém dos filtros de tendência de 15 minutos existentes, algoritmos de identificação de tendências mais complexos, como o Índice de Hurst ou o Índice de Movimento Direcional (DMI), podem ser incorporados para determinar com mais precisão a intensidade e a continuidade de tendências.
Fortalecimento da estratégia de saídaA estratégia de saída atual pode ser melhorada adicionando sinais de saída baseados na estrutura do mercado, como a ruptura da linha de tendência, pontos críticos de suporte/resistência ou mudanças bruscas na volatilidade. Isso pode ajudar a bloquear os lucros antes do fim da tendência.
Dimensão da posição ajustada ao risco: Realizar o ajuste dinâmico do tamanho da posição com base na volatilidade atual e nos fundos da conta, em vez de usar um número fixo de transações. Por exemplo, reduzir a posição durante a alta volatilidade e aumentar moderadamente a posição durante a baixa volatilidade, para otimizar a taxa de retorno do risco.
Filtragem de mercados relevantes: Aumentar a qualidade do sinal monitorando os mercados relevantes (por exemplo, VIX para negociação de índices de ações) ou a correlação entre os ativos. A credibilidade da negociação pode ser aumentada quando os mercados relevantes mostram movimentos direcionais consistentes.
A estratégia de negociação de precisão dinâmica multi-dimensional da matriz de média móvel com ATR representa um método de negociação quantitativa abrangente e avançado. Combinando os benefícios de vários tipos de médias móveis com um rigoroso controle de risco baseado em ATR, a estratégia é capaz de se adaptar a diferentes condições de mercado, mantendo uma boa gestão de risco.
O verdadeiro valor da estratégia reside na sua flexibilidade e adaptabilidade, permitindo que os comerciantes a personalizem de acordo com o mercado específico e as preferências de risco pessoais. Há ainda potencial para melhorar ainda mais a performance da estratégia através da orientação de otimização recomendada, em particular, o ajuste de parâmetros de adaptação e a integração de aprendizagem de máquina.
Esta estratégia oferece uma estrutura sólida, combinando precisão técnica e controle de risco, indispensáveis para os comerciantes que buscam usar um sistema tecnicamente forte e disciplinado em ambientes de negociação de alta frequência. É importante que os comerciantes verifiquem o desempenho da estratégia em seus mercados-alvo por meio de uma análise completa e simulação de negociação, e façam os ajustes necessários para o ambiente de negociação específico.
/*backtest
start: 2024-04-16 00:00:00
end: 2025-04-15 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=6
strategy("Dskyz (DAFE) MAtrix with ATR-Powered Precision",
overlay=true,
default_qty_type=strategy.fixed,
initial_capital=1000000,
commission_value=0,
slippage=1,
pyramiding=10)
// ==================================================================
// USER-DEFINED FUNCTIONS
// ==================================================================
// Hull Moving Average (HMA)
hma(src, len) =>
halfLen = math.round(len * 0.5)
sqrtLen = math.round(math.sqrt(len))
wmaf = ta.wma(src, halfLen)
wmaFull = ta.wma(src, len)
ta.wma(2 * wmaf - wmaFull, sqrtLen)
// Triple Exponential Moving Average (TEMA)
tema(src, len) =>
ema1 = ta.ema(src, len)
ema2 = ta.ema(ema1, len)
ema3 = ta.ema(ema2, len)
3 * (ema1 - ema2) + ema3
// Double Exponential Moving Average (DEMA)
dema(src, len) =>
ema1 = ta.ema(src, len)
ema2 = ta.ema(ema1, len)
2 * ema1 - ema2
// VWMA - Volume Weighted Moving Average
vwma(src, len) =>
ta.vwma(src, len)
// ZLEMA - Zero Lag EMA
zlema(src, len) =>
lag = math.floor((len - 1) / 2)
ta.ema(2 * src - src[lag], len)
// ALMA - Arnaud Legoux Moving Average
alma(src, len, offset=0.85, sigma=6) =>
ta.alma(src, len, offset, sigma)
// Custom Kaufman Adaptive Moving Average (KAMA)
kama(src, len) =>
fastSC = 2.0 / (2 + 1)
slowSC = 2.0 / (30 + 1)
change = math.abs(src - src[len])
volatility = 0.0
for i = 0 to len - 1
volatility += math.abs(src - src[i])
er = volatility != 0 ? change / volatility : 0.0
sc = math.pow(er * (fastSC - slowSC) + slowSC, 2)
var float kama_val = na
kama_val := na(kama_val) ? ta.sma(src, len) : kama_val + sc * (src - kama_val)
kama_val
// ==================================================================
// INPUTS
// ==================================================================
fastLength = input.int(9, "[MA] Fast MA Length", minval=1)
slowLength = input.int(19, "[MA] Slow MA Length", minval=1)
fastMAType = input.string("SMA", "Fast MA Type", options=["SMA", "EMA", "SMMA", "HMA", "TEMA", "WMA", "VWMA", "ZLEMA", "ALMA", "KAMA", "DEMA"])
slowMAType = input.string("SMA", "Slow MA Type", options=["SMA", "EMA", "SMMA", "HMA", "TEMA", "WMA", "VWMA", "ZLEMA", "ALMA", "KAMA", "DEMA"])
atrPeriod = input.int(14, "ATR Period", minval=1)
atrMultiplier = input.float(1.5, "ATR Multiplier for Filter", minval=0.1, step=0.1)
useTrendFilter = input.bool(true, "[Filter Settings] Use 15m Trend Filter")
minVolume = input.int(10, "Minimum Volume", minval=1)
volatilityThreshold = input.float(1.0, "Volatility Threshold (%)", minval=0.1, step=0.1) / 100
tradingStartHour = input.int(9, "Trading Start Hour (24h)", minval=0, maxval=23)
tradingEndHour = input.int(16, "Trading End Hour (24h)", minval=0, maxval=23)
trailOffset = input.float(0.5, "[Exit Settings] Trailing Stop Offset ATR Multiplier", minval=0.01, step=0.01)
profitTargetATRMult = input.float(1.2, "Profit Target ATR Multiplier", minval=0.1, step=0.1)
fixedStopMultiplier = input.float(1.3, "Fixed Stop Multiplier", minval=0.5, step=0.1)
fixedQuantity = input.int(2, "Trade Quantity", minval=1)
resetDashboard = input.bool(false, "Reset Dashboard Stats")
// ==================================================================
// CALCULATIONS
// ==================================================================
volumeOk = volume >= minVolume
currentHour = hour(time)
timeWindow = currentHour >= tradingStartHour and currentHour <= tradingEndHour
volumeSpike = volume > 1.2 * ta.sma(volume, 10)
// ATR Calculation
atr = ta.atr(atrPeriod)
volatility = nz(atr / close, 0)
volatilityOk = volatility <= volatilityThreshold
// ==================================================================
// MOVING AVERAGES CALCULATIONS
// ==================================================================
var float fastMA = na
var float slowMA = na
// Fast MA Logic
if fastMAType == "SMA"
fastMA := ta.sma(close, fastLength)
else if fastMAType == "EMA"
fastMA := ta.ema(close, fastLength)
else if fastMAType == "SMMA"
fastMA := ta.rma(close, fastLength)
else if fastMAType == "HMA"
fastMA := hma(close, fastLength)
else if fastMAType == "TEMA"
fastMA := tema(close, fastLength)
else if fastMAType == "WMA"
fastMA := ta.wma(close, fastLength)
else if fastMAType == "VWMA"
fastMA := vwma(close, fastLength)
else if fastMAType == "ZLEMA"
fastMA := zlema(close, fastLength)
else if fastMAType == "ALMA"
fastMA := alma(close, fastLength)
else if fastMAType == "KAMA"
fastMA := kama(close, fastLength)
else if fastMAType == "DEMA"
fastMA := dema(close, fastLength)
// Slow MA Logic
if slowMAType == "SMA"
slowMA := ta.sma(close, slowLength)
else if slowMAType == "EMA"
slowMA := ta.ema(close, slowLength)
else if slowMAType == "SMMA"
slowMA := ta.rma(close, slowLength)
else if slowMAType == "HMA"
slowMA := hma(close, slowLength)
else if slowMAType == "TEMA"
slowMA := tema(close, slowLength)
else if slowMAType == "WMA"
slowMA := ta.wma(close, slowLength)
else if slowMAType == "VWMA"
slowMA := vwma(close, slowLength)
else if slowMAType == "ZLEMA"
slowMA := zlema(close, slowLength)
else if slowMAType == "ALMA"
slowMA := alma(close, slowLength)
else if slowMAType == "KAMA"
slowMA := kama(close, slowLength)
else if slowMAType == "DEMA"
slowMA := dema(close, slowLength)
// ==================================================================
// TREND FILTER & SIGNAL LOGIC
// ==================================================================
// Retrieve 15-minute MAs for trend filtering
[fastMA15m, slowMA15m] = request.security(syminfo.tickerid, "15", [ta.sma(close, fastLength), ta.sma(close, slowLength)])
trend15m = fastMA15m > slowMA15m ? 1 : fastMA15m < slowMA15m ? -1 : 0
trendLongOk = not useTrendFilter or trend15m >= 0
trendShortOk= not useTrendFilter or trend15m <= 0
// ATR-based Price Filter
atrFilterLong = close > slowMA + atr * atrMultiplier
atrFilterShort = close < slowMA - atr * atrMultiplier
// Signal Logic: MA alignment + filters
maAbove = close > fastMA and fastMA > slowMA
maBelow = close < fastMA and fastMA < slowMA
longCondition = maAbove and trendLongOk and atrFilterLong and volumeOk and volumeSpike and timeWindow and volatilityOk
shortCondition= maBelow and trendShortOk and atrFilterShort and volumeOk and volumeSpike and timeWindow and volatilityOk
// ==================================================================
// ENTRY LOGIC
// ==================================================================
if strategy.position_size == 0 and longCondition
strategy.entry("Long", strategy.long, qty=fixedQuantity)
if strategy.position_size == 0 and shortCondition
strategy.entry("Short", strategy.short, qty=fixedQuantity)
// ==================================================================
// EXIT LOGIC
// ==================================================================
if strategy.position_size > 0
strategy.exit("Long Exit", "Long",
stop = strategy.position_avg_price - atr * fixedStopMultiplier,
limit = strategy.position_avg_price + atr * profitTargetATRMult,
trail_offset = atr * trailOffset,
trail_points = atr * trailOffset)
if strategy.position_size < 0
strategy.exit("Short Exit", "Short",
stop = strategy.position_avg_price + atr * fixedStopMultiplier,
limit = strategy.position_avg_price - atr * profitTargetATRMult,
trail_offset = atr * trailOffset,
trail_points = atr * trailOffset)
// ==================================================================
// VISUALS: PLOT MAs
// ==================================================================
plot(fastMA, color=color.blue, linewidth=2, title="Fast MA")
plot(slowMA, color=color.red, linewidth=2, title="Slow MA")
// ==================================================================
// METRICS CALCULATIONS (for Dashboard)
// ==================================================================
// Additional metrics:
atrPct = close != 0 ? (atr / close) * 100 : na // ATR as percentage of Close
maGapPct = (slowMA != 0) ? (math.abs(fastMA - slowMA) / slowMA) * 100 : na // % difference between MAs
// Open PnL Calculation
currentPnL = strategy.position_size != 0 ? (close - strategy.position_avg_price) * strategy.position_size : 0
// Persistent variable for highest equity (for drawdown calculation)
var float highestEquity = strategy.equity
highestEquity := math.max(highestEquity, strategy.equity)
totalDrawdown = strategy.equity - highestEquity
// Reset dashboard metrics if reset toggle is on.
if resetDashboard
highestEquity := strategy.equity
// ==================================================================
// DASHBOARD: WATERMARK LOGO (Bottom-Right)
// ==================================================================
var table watermarkTable = table.new(position.bottom_right, 1, 1, bgcolor=color.rgb(0, 0, 0, 80), border_color=color.rgb(0, 50, 137), border_width=1)
if barstate.islast
table.cell(watermarkTable, 0, 0, "⚡ Dskyz - DAFE Trading Systems", text_color=color.rgb(159, 127, 255, 80), text_size=size.large)
// ==================================================================
// DASHBOARD: METRICS TABLE (Bottom-Left)
// ==================================================================
var table dashboard = table.new(position.middle_right, 2, 12, bgcolor=color.new(#000000, 29), border_color=color.rgb(80, 80, 80), border_width=1)
if barstate.islast
// Row 0 – Dashboard Title (duplicated in both columns to simulate spanning)
table.cell(dashboard, 0, 0, "⚡(DAFE) Trading Systems", text_color=color.rgb(135, 135, 135), text_size=size.small)
// Row 1 – Position
table.cell(dashboard, 0, 1, "Position", text_color=color.gray)
positionText = strategy.position_size > 0 ? "Long" : strategy.position_size < 0 ? "Short" : "Flat"
table.cell(dashboard, 1, 1, positionText, text_color=strategy.position_size > 0 ? color.green : strategy.position_size < 0 ? color.red : color.blue)
// Row 2 – Current PnL
table.cell(dashboard, 0, 2, "Current P/L", text_color=color.gray)
table.cell(dashboard, 1, 2, str.tostring(currentPnL, "#.##"), text_color=(currentPnL > 0 ? color.green : currentPnL < 0 ? color.red : color.gray))
// Row 3 – Equity
table.cell(dashboard, 0, 3, "Equity", text_color=color.gray)
table.cell(dashboard, 1, 3, str.tostring(strategy.equity, "#.##"), text_color=color.white)
// Row 4 – Closed Trades
table.cell(dashboard, 0, 4, "Closed Trades", text_color=color.gray)
table.cell(dashboard, 1, 4, str.tostring(strategy.closedtrades), text_color=color.white)
// Row 5 – Title Step
table.cell(dashboard, 0, 5, "Metrics", text_color=color.rgb(76, 122, 23))
// Row 6 – Fast MA
table.cell(dashboard, 0, 6, "Fast MA", text_color=color.gray)
table.cell(dashboard, 1, 6, str.tostring(fastMA, "#.##"), text_color=color.white)
// Row 7 – Slow MA
table.cell(dashboard, 0, 7, "Slow MA", text_color=color.gray)
table.cell(dashboard, 1, 7, str.tostring(slowMA, "#.##"), text_color=color.white)
// Row 8 – ATR (Raw)
table.cell(dashboard, 0, 8, "ATR", text_color=color.gray)
table.cell(dashboard, 1, 8, str.tostring(atr, "#.##"), text_color=color.white)
// Row 9 – ATR (%)
table.cell(dashboard, 0, 9, "ATR (%)", text_color=color.gray)
table.cell(dashboard, 1, 9, str.tostring(atrPct, "#.##") + "%", text_color=color.white)
// Row 10 – MA Gap (%)
table.cell(dashboard, 0, 10, "MA Gap (%)", text_color=color.gray)
table.cell(dashboard, 1, 10, na(maGapPct) ? "N/A" : str.tostring(maGapPct, "#.##") + "%", text_color=color.white)
// Row 11 – Volatility (%)
table.cell(dashboard, 0, 11, "Volatility (%)", text_color=color.gray)
table.cell(dashboard, 1, 11, str.tostring(volatility * 100, "#.##") + "%", text_color=color.white)