
A estratégia é uma estratégia inteligente de custo médio em dólares baseada em sinais cruzados de EMA, combinando a implantação de ordens seguras adaptáveis à volatilidade e um mecanismo de parada de perda dupla inovador. Ela entra no mercado quando uma tendência ascendente é confirmada e, em seguida, implanta automaticamente ordens de segurança adicionais de acordo com a volatilidade do mercado, enquanto usa um sistema de rastreamento de tracking de perda e lucro para proteger os ganhos.
A lógica central da estratégia gira em torno dos seguintes componentes-chave:
Sistemas de identificação de tendências: Use o cruzamento do EMA rápido (default 9 cycles) e do EMA lento (default 21 cycles) para identificar uma potencial tendência de alta. Quando o EMA rápido atravessa o EMA lento para cima, o sistema confirma a tendência de alta e aciona a entrada básica.
Sistema de entrada de DCA em vários níveisA estratégia é baseada em três níveis de admissão:
Mecanismo de adaptação volátilO preço de disparo de uma ordem de segurança pode ser calculado dinamicamente com base no indicador ATR, permitindo que a estratégia ajuste automaticamente a posição de entrada de acordo com a flutuação atual do mercado. O usuário pode optar por usar o múltiplo ATR (SO1 padrão é de 1,2 vezes o ATR, SO2 é de 2,5 vezes o ATR) ou uma queda de porcentagem fixa (SO1 padrão é de 4% e SO2 é de 8%) para calcular o ponto de disparo de uma ordem de segurança.
Sistema de proteção contra danos em duas vias:
Mecanismo de período de arrefecimento: Implementação de um período de arrefecimento após a execução do pedido básico ((default 4 linhas K), para evitar transações excessivas em um curto espaço de tempo.
A análise da estratégia revela as seguintes vantagens significativas:
Forte adaptaçãoA estratégia pode se adaptar de forma inteligente a diferentes ambientes de volatilidade do mercado, aumentando adequadamente o intervalo de ordens de segurança em períodos de alta volatilidade e diminuindo o intervalo em períodos de baixa volatilidade.
Otimização da gestão de fundosA estratégia utiliza uma distribuição de capital crescente (US\( 1000 → US\) 1250 → US$ 1750) de acordo com o princípio de gerenciamento de posições “piramidal”, permitindo que a estratégia obtenha um preço de entrada médio superior em uma escala de capital maior quando o preço cai.
Mecanismo de proteção duplaO inovador sistema de parada de dupla linha oferece uma proteção básica contra o risco de queda e pode mudar automaticamente para um modo de parada mais conservador quando está lucrativo, equilibrando efetivamente a maximização de lucro com o controle de risco.
Flexibilidade de personalizaçãoTodos os parâmetros-chave são personalizáveis, incluindo o ciclo EMA, a duração do ATR, o intervalo de ordens de segurança, a proporção de parada e o tamanho da ordem, permitindo que o comerciante otimize de acordo com as preferências de risco pessoais e as condições de mercado.
IntegraçãoA estratégia incorpora alertas de condições formatados como mensagens JSON para facilitar a integração com plataformas de negociação automática de terceiros (como 3Commas) para a execução de negociações totalmente automatizada.
Apesar da abrangência da estratégia, existem os seguintes riscos e desafios potenciais:
Risco de reversão de tendênciaA estratégia depende do sinal de cruzamento do EMA, que pode produzir sinais errados em mercados de rápida mudança ou de turbulência, resultando em entrada desnecessária. A solução é ajustar o comprimento do ciclo EMA ou adicionar indicadores de confirmação adicionais.
Risco de esgotamento de fundos: Em mercados em queda contínua, mesmo com todos os pedidos de segurança, o preço médio de entrada pode ser muito mais alto do que o preço de mercado, resultando em perdas a longo prazo. Recomenda-se o estabelecimento de limites de perda máxima ou limites de tamanho de posição geral.
Risco de excesso de negociaçãoEm mercados altamente voláteis, EMAs podem se cruzar com frequência, desencadeando excesso de negociação. Apesar do mecanismo de período de resfriamento embutido, pode ser necessário otimizar ainda mais ou adicionar restrições adicionais à frequência de negociação.
Interferência de travões duplos: Em alguns mercados, os dois mecanismos de parada podem interferir entre si, resultando em saídas prematuras ou sinais repetidos. O equilíbrio entre esses dois parâmetros de parada deve ser revisado e ajustado periodicamente.
Dificuldade de otimização de parâmetros: Os múltiplos parâmetros da estratégia necessitam de coordenação entre si para obter o melhor efeito, aumentando a complexidade da otimização de parâmetros. Recomenda-se a utilização de ferramentas de otimização de feedback para uma análise de parâmetros completa.
Com base em uma análise aprofundada do código, as seguintes são as potenciais direções de otimização da estratégia:
Introdução de mecanismos de confirmação de tendências múltiplasA estratégia atual baseia-se apenas em um único sinal de cruzamento de EMA. Pode-se considerar a adição de indicadores de confirmação de tendência adicionais, como o RSI, o MACD ou o julgamento de tendências de períodos mais longos, para reduzir os sinais errados. Isso reduz significativamente o risco de falsas rupturas.
Sistema dinâmico de distribuição de fundosA estratégia atual utiliza um montante fixo em dólares como tamanho de ordem, otimizado para um sistema de ajuste dinâmico baseado na volatilidade do mercado ou no interesse das contas, garantindo a manutenção de níveis de exposição ao risco adequados em diferentes condições de mercado.
Estratégias de saída de stop loss optimizadasPode-se desenvolver uma lógica de stop loss mais complexa, como um stop loss de rastreamento adaptativo baseado na volatilidade do mercado, ou a integração de indicadores de volume de ação e volume de transação para otimizar as decisões de saída, evitando a saída prematura durante a volatilidade de curto prazo.
Retirada de controle reforçada: Adição de um limite de retração global, que suspende automaticamente novos pedidos ou fecha posições existentes quando a estratégia atinge a percentagem de retração máxima predefinida, para evitar perdas catastróficas em condições de mercado extremas.
Sistema de optimização de ciclo: Desenvolvimento de uma função de otimização automática do ciclo, permitindo que a estratégia ajuste automaticamente o comprimento do EMA, o ciclo ATR e outros parâmetros relacionados ao tempo com base nas condições recentes do mercado, para se adaptar a mudanças no estado do mercado.
A estratégia de DCA inteligente de rastreamento de oscilação com sistema de parada dupla é um programa de negociação quantitativa bem projetado, especialmente adequado para capturar tendências ascendentes e gerenciar riscos em mercados voláteis. Ele combina habilmente o rastreamento de tendências, a média de custo do dólar e o mecanismo de auto-adaptação da taxa de flutuação, e protege os ganhos com o inovador sistema de parada dupla.
A principal vantagem da estratégia reside no seu equilíbrio entre adaptabilidade e gestão de risco, com a capacidade de ajustar automaticamente as decisões de entrada e saída em diferentes cenários de mercado. Usando o ATR para calcular dinamicamente os pontos de disparo de ordens de segurança, a estratégia pode responder de forma inteligente em função das condições de mercado em tempo real, em vez de depender de parâmetros estáticos predefinidos.
Embora existam riscos potenciais em termos de identificação de tendências e gestão de fundos, estes podem ser efetivamente mitigados através de orientações de otimização propostas. Em particular, a introdução de um sistema de identificação de tendências múltiplas e de distribuição dinâmica de fundos irá melhorar significativamente a solidez e o desempenho a longo prazo da estratégia.
A estratégia oferece um quadro abrangente e escalável para os comerciantes de quantidade que buscam uma forma de negociar sistematicamente em mercados voláteis, para capturar oportunidades de alta e, ao mesmo tempo, oferecer proteção adequada contra riscos em condições de mercado adversas.
/*backtest
start: 2025-03-14 00:00:00
end: 2025-04-02 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
//@version=5
strategy(
title="BONK/USD (1H) - $4k DCA + Dual Trailing + Date Filter", // Updated Title
overlay=true,
initial_capital=4000,
currency=currency.USD,
default_qty_type=strategy.fixed,
default_qty_value=0, // Quantity calculated dynamically based on USD value
commission_type=strategy.commission.percent, // Example: Add commission settings
commission_value=0.1 // Example: 0.1% commission
)
// 1) USER INPUTS (Defaults adjusted for 1H timeframe - REQUIRES BACKTESTING/TUNING)
// --- Trend ---
fastMALen = input.int(9, title="Fast EMA Length (Default for 1H)")
slowMALen = input.int(21, title="Slow EMA Length (Default for 1H)")
// --- Trailing Stops ---
trailStopPerc = input.float(8.0, title="Standard Trailing Stop (%) (Default for 1H)", minval=0.1) / 100
lockInThreshold = input.float(2.5, title="Profit Lock-In Trigger (%) (Default for 1H)", minval=0.1) / 100
lockInTrailPct = input.float(1.5, title="Lock-In Trail (%) after Trigger (Default for 1H)", minval=0.1) / 100
// --- Safety Orders (SO) ---
useATRSpacing = input.bool(true, title="Use ATR-Based Spacing?")
atrLength = input.int(14, title="ATR Length", minval=1)
atrSo1Multiplier = input.float(1.2, title="ATR SO1 Multiplier (Default for 1H)", minval=0.1)
atrSo2Multiplier = input.float(2.5, title="ATR SO2 Multiplier (Default for 1H)", minval=0.1)
// --- Fallback SO Spacing (if not using ATR) ---
fallbackSo1Perc = input.float(4.0, title="Fallback SO1 Drop (%) (Default for 1H)", minval=0.1) / 100
fallbackSo2Perc = input.float(8.0, title="Fallback SO2 Drop (%) (Default for 1H)", minval=0.1) / 100
// --- Entry Cooldown ---
cooldownBars = input.int(4, "Cooldown Bars After Base Entry (Default for 1H)", minval=0)
// --- Order Sizes in USD ---
baseUsd = input.float(1000.0, title="Base Order Size (USD)", minval=1.0)
so1Usd = input.float(1250.0, title="Safety Order 1 Size (USD)", minval=1.0)
so2Usd = input.float(1750.0, title="Safety Order 2 Size (USD)", minval=1.0)
// 2) CALCULATIONS
// --- Trend & Reversal Detection ---
fastMA = ta.ema(close, fastMALen)
slowMA = ta.ema(close, slowMALen)
trendUp = ta.crossover(fastMA, slowMA)
trendDown = ta.crossunder(fastMA, slowMA)
// --- ATR Value ---
atrValue = ta.atr(atrLength)
// 3) BASE ENTRY LOGIC
// Base Buy Signal: EMA crossover
baseBuySignal = trendUp
var int lastBuyBar = na // Tracks the bar index of the last base entry
inCooldown = not na(lastBuyBar) and (bar_index - lastBuyBar < cooldownBars)
var float baseEntryPrice = na // Stores the price of the initial base entry for SO calculations
// --- Execute Base Entry ---
// Added 'inDateRange' to the condition
if baseBuySignal and strategy.position_size == 0 and not inCooldown
baseQty = baseUsd / close // Calculate quantity based on USD
strategy.entry("Base Order", strategy.long, qty=baseQty, comment="Base Entry")
baseEntryPrice := close
lastBuyBar := bar_index
// 4) SAFETY ORDERS LOGIC
// --- Calculate SO Trigger Prices ---
float so1TriggerPrice = na
float so2TriggerPrice = na
if not na(baseEntryPrice) // Only calculate if a base order has been placed
so1TriggerPrice := useATRSpacing ?
(baseEntryPrice - atrValue * atrSo1Multiplier) :
(baseEntryPrice * (1 - fallbackSo1Perc))
so2TriggerPrice := useATRSpacing ?
(baseEntryPrice - atrValue * atrSo2Multiplier) :
(baseEntryPrice * (1 - fallbackSo2Perc))
// --- Conditions for SO Execution ---
// Added 'inDateRange' check
// Ensure base order exists, price trigger hit, and the specific SO hasn't filled yet
bool so1Condition = not na(baseEntryPrice) and strategy.position_size > 0 and close <= so1TriggerPrice and strategy.opentrades == 1
bool so2Condition = not na(baseEntryPrice) and strategy.position_size > 0 and close <= so2TriggerPrice and strategy.opentrades == 2
// --- Execute SO1 ---
if so1Condition
so1Qty = so1Usd / close // Calculate quantity based on USD
strategy.entry("Safety Order 1", strategy.long, qty=so1Qty, comment="SO1")
// --- Execute SO2 ---
if so2Condition
so2Qty = so2Usd / close // Calculate quantity based on USD
strategy.entry("Safety Order 2", strategy.long, qty=so2Qty, comment="SO2")
// 5) AVERAGE ENTRY PRICE
// Use the built-in variable for the average price of the open position
avgEntryPrice = strategy.position_avg_price
// 6) DUAL TRAILING STOP LOGIC
// Variables to track trailing stop levels and states
var float highestSinceEntry = na
var float trailStopPrice = na
var bool stopHitNormal = false
var bool lockInTriggered = false
var float lockInPeak = na
var float lockInStopPrice = na
var bool stopHitLockIn = false
// --- Update Trailing Logic when in a Position ---
if strategy.position_size > 0
// --- Standard Trail ---
highestSinceEntry := na(highestSinceEntry) ? close : math.max(highestSinceEntry, close)
trailStopPrice := highestSinceEntry * (1 - trailStopPerc)
stopHitNormal := close < trailStopPrice
// --- Lock-In Trail ---
if not lockInTriggered and close >= avgEntryPrice * (1 + lockInThreshold)
lockInTriggered := true
lockInPeak := close
if lockInTriggered
lockInPeak := math.max(lockInPeak, close)
lockInStopPrice := lockInPeak * (1 - lockInTrailPct)
stopHitLockIn := close < lockInStopPrice
else
stopHitLockIn := false
lockInStopPrice := na
// --- Reset Variables when Flat ---
else
highestSinceEntry := na
trailStopPrice := na
stopHitNormal := false
lockInTriggered := false
lockInPeak := na
lockInStopPrice := na
stopHitLockIn := false
baseEntryPrice := na
// lastBuyBar is intentionally NOT reset here, cooldown depends on it
// 7) EXIT CONDITIONS
// Added 'inDateRange' check
// Exit if either trailing stop is hit OR if the trend reverses downward, within the active date range
exitCondition = (stopHitNormal or stopHitLockIn or trendDown) and strategy.position_size > 0
if exitCondition
strategy.close_all(comment="Exit: SL / LockIn / TrendDown")
// 8) ALERT CONDITIONS (Potential 3Commas Integration)
// WARNING: Verify and adapt these JSON message strings for your specific 3Commas bot configuration!
// The required format ('action', parameters, etc.) can vary.
// Added 'inDateRange[1]' check for Base Alert
alertcondition(inDateRange[1] and baseBuySignal and strategy.position_size[1] == 0 and not inCooldown[1],
title="Base Buy Alert",
message='{"action":"start_deal","order":"base"} // Verify/Adapt JSON for your 3Commas bot!')
// Added 'inDateRange' check for SO1 Alert
alertcondition(so1Condition, title="SO1 Alert",
message='{"action":"add_funds","order":"so1"} // Verify/Adapt JSON for your 3Commas bot!')
// Added 'inDateRange' check for SO2 Alert
alertcondition(so2Condition, title="SO2 Alert",
message='{"action":"add_funds","order":"so2"} // Verify/Adapt JSON for your 3Commas bot!')
// Added 'inDateRange' check for Exit Alert
alertcondition(exitCondition, title="Exit Alert",
message='{"action":"close_at_market_price"} // Verify/Adapt JSON for your 3Commas bot!')
// 9) PLOTS & DEBUG TABLE
// --- Plot MAs ---
plot(fastMA, color=color.new(color.green, 0), title="Fast EMA", linewidth=2)
plot(slowMA, color=color.new(color.red, 0), title="Slow EMA", linewidth=2)
// --- Plot Trailing Stops ---
plot(strategy.position_size > 0 ? trailStopPrice : na, color=color.new(color.orange, 0), title="Standard Trailing Stop", style=plot.style_linebr, linewidth=2)
plot(lockInTriggered ? lockInStopPrice : na, color=color.new(color.fuchsia, 0), title="Lock-In Trailing Stop", style=plot.style_linebr, linewidth=2)
// --- Debug Info Table ---
var table tradeInfo = table.new(position=position.bottom_right, columns=2, rows=10, border_width=1)