
La estrategia es una estrategia de Smart Dollar Cost Average (DCA) basada en el indicador de las medias móviles (EMA) cruzadas, que combina la implementación de órdenes seguras adaptadas a la volatilidad (SO) y un mecanismo de stop loss innovador de dos vías. Entra en el mercado cuando se confirma una tendencia alcista y luego implementa automáticamente órdenes seguras adicionales según la volatilidad del mercado, mientras utiliza un sistema de seguimiento de seguimiento de pérdidas y ganancias para proteger los beneficios.
La lógica central de esta estrategia se desarrolla en torno a los siguientes componentes clave:
Sistema de reconocimiento de tendencias: Utiliza el cruce de la EMA rápida (default 9 cycles) y la EMA lenta (default 21 cycles) para identificar una potencial tendencia alcista. Cuando la EMA rápida cruza hacia arriba la EMA lenta, el sistema reconoce la tendencia alcista y dispara la orden de entrada básica.
Sistema de acceso DCA de varias capasLa estrategia es una entrada en tres niveles:
Mecanismo de adaptación volátilEl precio de activación de las órdenes de seguridad puede calcularse de forma dinámica en función del indicador ATR (rango real promedio), lo que permite a la estrategia ajustar automáticamente la posición de entrada en función de las fluctuaciones actuales del mercado. El usuario puede elegir usar el múltiplo ATR (SO1 por defecto es 1.2 veces ATR, SO2 por 2.5 veces ATR) o la caída porcentual fija (SO1 por defecto es 4%, SO2 por 8%) para calcular el punto de activación de las órdenes de seguridad.
Sistema de protección contra daños de doble vía:
Mecanismo de período de enfriamiento: Implementación de un período de enfriamiento después de la ejecución de la orden básica ((default 4 líneas K) para evitar el exceso de operaciones en un corto período de tiempo.
El análisis de la estrategia muestra las siguientes ventajas:
La adaptabilidadLa estrategia se adapta inteligentemente a los diferentes entornos de fluctuación del mercado, ampliando adecuadamente el intervalo de órdenes de seguridad en períodos de alta volatilidad y ajustando el intervalo en períodos de baja volatilidad.
Optimización de la gestión de fondosLa estrategia utiliza una distribución de capital incremental (USD 1000 → USD 1250 → USD 1750) de acuerdo con el principio de gestión de posiciones “piramidal” que permite a la estrategia obtener un mejor precio de entrada promedio con una mayor cantidad de capital cuando los precios bajan.
Mecanismo de doble protecciónEl sistema innovador de doble vía de detención de pérdidas ofrece una protección básica contra el riesgo de bajada y puede cambiar automáticamente a un modo de detención de pérdidas más conservador en el momento de la ganancia, equilibrando eficazmente la maximización de las ganancias con el control del riesgo.
Flexibilidad de personalizaciónTodos los parámetros clave son personalizables, incluyendo el ciclo EMA, la longitud de ATR, el intervalo de órdenes seguras, la proporción de stop loss y el tamaño de la orden, lo que permite a los comerciantes optimizar en función de las preferencias de riesgo personales y las condiciones del mercado.
La integraciónLa estrategia incluye el formato de las condiciones de alerta en mensajes JSON para facilitar la integración con plataformas de comercio automático de terceros (como 3Commas) para la ejecución de transacciones totalmente automatizada.
A pesar de su diseño integral, existen riesgos y desafíos potenciales:
Riesgo de inversión de tendencia: La estrategia depende de las señales cruzadas de EMA, que pueden generar señales erróneas en mercados que cambian rápidamente o en mercados convulsionados, lo que lleva a una entrada innecesaria. La solución es ajustar la longitud del ciclo EMA o agregar indicadores de confirmación adicionales.
Riesgo de gastar dineroEn un mercado en constante caída, el precio de entrada promedio puede ser mucho más alto que el precio de mercado, incluso si se implementan todos los pedidos de seguridad, lo que genera pérdidas a largo plazo. Se recomienda establecer un límite de pérdida máxima o un límite de tamaño de posición general.
El riesgo de sobrecomercialización: En mercados con gran volatilidad, los EMA pueden cruzarse con frecuencia, lo que puede desencadenar demasiadas operaciones. A pesar del mecanismo de período de enfriamiento incorporado, puede ser necesario optimizar aún más o agregar restricciones adicionales a la frecuencia de las operaciones.
La interferencia de los frenados de doble vía: En ciertos mercados, los dos mecanismos de detención pueden interferir entre sí, causando una salida prematura o una señal repetida. El equilibrio entre estos dos parámetros de detención debe ser revisado y ajustado periódicamente.
Dificultad para optimizar los parámetros: Los múltiples parámetros de la estrategia necesitan coordinarse entre sí para obtener un efecto óptimo, lo que aumenta la complejidad de la optimización de los parámetros. Se recomienda el uso de herramientas de optimización de retroalimentación para un análisis de parámetros completo.
Basado en un análisis en profundidad del código, las siguientes son las direcciones potenciales de optimización de la estrategia:
Introducción de un mecanismo de reconocimiento de múltiples tendenciasLas estrategias actuales se basan en una sola señal de cruce de EMA. Se puede considerar la adición de indicadores de confirmación de tendencia adicionales, como el RSI, el MACD o el juicio de tendencia de períodos más largos, para reducir las señales erróneas. Esto reduce significativamente el riesgo de falsos breaks.
Sistemas dinámicos de distribución de fondosLa estrategia actual utiliza un monto fijo en dólares como tamaño de orden, optimizado como un sistema de ajuste dinámico basado en la volatilidad del mercado o en los intereses de las cuentas, para garantizar que se mantenga un nivel adecuado de exposición al riesgo en diferentes condiciones de mercado.
Estrategias de salida de pérdidas optimizadasSe pueden desarrollar lógicas de stop loss más complejas, como el stop loss de seguimiento adaptativo basado en la volatilidad del mercado, o la integración de indicadores de movilidad y volumen de transacciones para optimizar las decisiones de salida y evitar la salida prematura en la volatilidad a corto plazo.
Retirada de las fuerzas de control: Adición de la función de restricción de retiro global, que automáticamente suspende los nuevos pedidos o cierra las posiciones existentes cuando la estrategia alcanza el porcentaje de retiro máximo predeterminado, para evitar pérdidas catastróficas en condiciones de mercado extremas.
Sistemas de optimización de cicloDesarrollo de la función de optimización automática de ciclos, que permite a las estrategias ajustar automáticamente la longitud de los EMA, los ciclos ATR y otros parámetros relacionados con el tiempo en función de las condiciones del mercado reciente para adaptarse a los cambios en el estado del mercado.
La estrategia DCA de seguimiento inteligente de la oscilación y el sistema de parada de doble vía es un programa de negociación cuantitativa bien diseñado, especialmente adecuado para capturar tendencias al alza y administrar el riesgo en mercados volátiles. Se combina hábilmente con el seguimiento de tendencias, la media de costos en dólares y el mecanismo de adaptación a la volatilidad, y se protegen los ingresos con un sistema de parada de doble vía innovador.
La ventaja central de esta estrategia es su adaptabilidad y equilibrio de gestión de riesgos, que permite ajustar automáticamente las decisiones de entrada y salida en diferentes entornos de mercado. Mediante el uso de ATR para calcular dinámicamente los puntos de activación de órdenes de seguridad, la estrategia puede responder inteligentemente en función de las condiciones del mercado en tiempo real, en lugar de depender de parámetros estáticos predeterminados.
Si bien existen riesgos potenciales en la identificación de tendencias y la gestión de fondos, estos pueden mitigarse de manera efectiva a través de la orientación de optimización propuesta. En particular, la introducción de un sistema de reconocimiento de múltiples tendencias y distribución dinámica de fondos mejorará significativamente la solidez y el rendimiento a largo plazo de las estrategias.
La estrategia ofrece a los operadores cuantitativos que buscan métodos sistemáticos de negociación en mercados volátiles un marco integral y escalable que capta oportunidades de tendencias al alza y proporciona una protección adecuada contra el riesgo en condiciones 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)