Estrategia del DCA Bot

El autor:¿ Qué pasa?, Fecha: 2023-09-26 17:28:27
Las etiquetas:

Resumen general

Esta es una estrategia de backtesting en el mecanismo de promedio de costos en dólares (DCA) para escalar en posiciones después de la entrada inicial. Puede agregar a la posición basada en el porcentaje de desviación de precio preestablecido y las reglas de pirámide. La estrategia también incluye funciones de toma de ganancias y de toma de ganancias.

Estrategia lógica

La estrategia primero abre una posición larga al precio de cierre una vez que está por encima de 0 dentro del marco de tiempo de backtest. Este precio de entrada se registra como el precio base bo_level. Luego coloca todas las órdenes de salida posibles en la vela actual si no existen órdenes de seguridad (así). Específicamente, el precio de la orden de seguridad se calcula en función del último precio de la orden de seguridad latest_so_level y la escala de pasos de la orden de seguridad safe_order_step_scale.

Durante las posiciones de tenencia, si el tamaño de la posición es mayor que 0, el precio de toma de beneficio take_profit_level se calcula en función del precio base y el porcentaje de toma de beneficio objetivo. Si se desactiva la toma de beneficio posterior, se utiliza este precio de toma de beneficio fijo. De lo contrario, se actualiza el precio más alto ttp_max basado en el máximo de vela para seguir el precio de toma de beneficio para la toma de beneficio posterior.

Análisis de ventajas

  • Utiliza el mecanismo DCA para promediar la base de costes descendentes cuando los precios caen, cubriendo los riesgos sistémicos.

  • Apoya parámetros personalizables para una configuración flexible de las reglas de entrada y estrategia de ganancias para diferentes activos y estilos de negociación.

  • Tiene funciones de seguimiento de beneficios incorporadas para ajustar automáticamente los beneficios basados en la acción del precio, evitando el desencadenamiento prematuro de los beneficios.

  • Los ajustes de parámetros de backtest flexibles facilitan la prueba de datos de diferentes plazos para evaluar el rendimiento de la estrategia.

  • Puede configurar directamente bots en vivo en 3commas usando resultados de backtest sin codificación adicional.

Análisis de riesgos

  • DCA corre el riesgo de aumentar aún más las posiciones y las pérdidas si el mercado continúa bajando.

  • El porcentaje fijo de ganancias no puede ajustarse a la volatilidad del mercado, se corre el riesgo de una salida prematura o tardía.

  • Se requiere una evaluación adecuada.

  • Riesgos de estabilidad de la plataforma.

Direcciones de optimización

  • Ajuste dinámico de la desviación de precios en función de la volatilidad de diferentes activos para optimizar las reglas de pirámide.

  • Incorporar indicadores de volatilidad para determinar un porcentaje de ganancias más científico.

  • Establecer un marco de tiempo razonable para las pruebas de retroceso basado en las sesiones de negociación de activos específicos.

  • Introducir un stop loss para reducir las pérdidas cuando la posición baja significativamente.

  • Utilice el aprendizaje automático para optimizar dinámicamente los parámetros.

Conclusión

En general, este es un backtester de DCA muy práctico. Soporta una gran personalización para las reglas de entrada y toma de ganancias. El trailing take profit también complementa bien el take profit fijo. Los parámetros de backtest flexibles permiten probar diferentes activos y marcos de tiempo. Con el ajuste adecuado de los parámetros, esta estrategia puede producir excelentes resultados para activos de alta oportunidad al cubrir los riesgos sistémicos con DCA. Pero los riesgos como la pirámide y el take profit deben ser observados en el comercio en vivo, junto con la estabilidad de la plataforma. Otimizaciones adicionales como parámetros dinámicos, stop loss pueden hacer que este sea un bot de trading DCA extremadamente poderoso.


/*backtest
start: 2023-09-18 00:00:00
end: 2023-09-25 00:00:00
period: 15h
basePeriod: 15m
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/
// © rouxam

// Author: rouxam
// Inspired by the original work of ericlin0122

//@version=4
// strategy("Backtesting 3commas DCA Bot", overlay=true, pyramiding=99, process_orders_on_close=true, commission_type=strategy.commission.percent, commission_value=0.1)

// Strategy Inputs
price_deviation         = input(1.0, type=input.float,  title='Price deviation to open safety orders (%)', minval=0.0, step=0.1)/100
take_profit             = input(1.0, type=input.float,  title='Target Take Profit (%)', minval=0.0, step=0.1)/100
ttp                     = input(0.5, type=input.float,  title='Trailing Take Profit (%) [0 = Disabled]', minval=0.0, step=0.1)/100
base_order              = input(10.0, type=input.float, title='base order') 
safe_order              = input(20.0, type=input.float, title='safe order') 
safe_order_volume_scale = input(2.0, type=input.float,  title='Safety order volume scale', step=0.1) 
safe_order_step_scale   = input(1.5, type=input.float,  title='Safety order step scale', step=0.1) 
max_safe_order          = input(5,                      title='Max safe order', minval=1, maxval=99, step=1) 

// Date Inputs
from_month = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
from_day   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
from_year  = input(defval = 2021, title = "From Year")
to_month   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
to_day     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
to_year    = input(defval = 9999, title = "To Year")
start  = timestamp(from_year, from_month, from_day, 00, 00)  // backtest start window
finish = timestamp(to_year, to_month, to_day, 23, 59)        // backtest finish window
window = time >= start and time <= finish ? true : false // create function "within window of time"

var bo_level = 0.0
var latest_so_level = 0.0
var next_so_level = 0.0
var ttp_active = false
var ttp_max = 0.0
var ttp_level = 0.0
var take_profit_level = 0.0

if strategy.position_size <= 0.0
    ttp_max := 0.0
    ttp_active := false


// First Position
if(strategy.opentrades == 0 and window and close > 0)
    // Place Buy Order ASAP
    bo_level := open
    strategy.entry("BO", limit=bo_level, long=strategy.long, qty=base_order/bo_level)
    latest_so_level := open

// Dollar Cost Averaging
place_safety_orders = latest_so_level == bo_level
if place_safety_orders
    // Placing all possible exit orders on that candle
    for i = 1 to max_safe_order
        next_so_level := latest_so_level * (1 - price_deviation * pow(safe_order_step_scale,  i - 1))
        so_name = "SO" + tostring(i) 
        strategy.entry(so_name, long=strategy.long, limit=next_so_level, qty=safe_order * pow(safe_order_volume_scale, i - 1)/next_so_level)
        latest_so_level := next_so_level

// Take Profit
if strategy.position_size > 0
    take_profit_level := strategy.position_avg_price * (1 + take_profit)
    if ttp <= 0.0
        // No trailing take profit
        strategy.exit(id="TP", limit=take_profit_level)
    else
        // Trailing take profit
        if take_profit_level <= close
            ttp_max := max(high, ttp_max)
            ttp_active := true
        if ttp_active 
            // Update exit order
            ttp_level := ttp_max * (1 - ttp)
            strategy.exit(id="TTP", stop=ttp_level)


Más.