Esta é uma estratégia de backtesting no mecanismo de média de custos em dólares (DCA) para dimensionar posições após a entrada inicial. Pode adicionar à posição com base em porcentagem de desvio de preço e regras de pirâmide pré-definidas. A estratégia também inclui funções de take profit e trailing take profit.
A estratégia abre primeiro uma posição longa no preço de fechamento uma vez que está acima de 0 dentro do período de tempo do backtest. Este preço de entrada é registrado como o preço de base bo_level. Em seguida, coloca todas as ordens de saída possíveis na vela atual se não existirem ordens de segurança (assim). Especificamente, o preço da ordem de segurança é calculado com base no último preço da ordem de segurança latest_so_level e na escala de passos da ordem de segurança safe_order_step_scale. Isso cicla até que a contagem máxima de ordens de segurança max_safe_order seja atingida.
Durante a detenção de posições, se o tamanho da posição for maior que 0, o preço de take profit take_profit_level é calculado com base no preço de base e na porcentagem de lucro obtido. Se o trailing take profit estiver desativado, esse preço fixo de take profit é usado. Caso contrário, o preço mais alto ttp_max é atualizado com base no candle high para seguir o preço de take profit para trailing take profit.
Utiliza o mecanismo DCA para calcular a média da base de custos descendentes quando o preço cai, cobrindo riscos sistémicos.
Suporta parâmetros personalizáveis para configuração flexível de regras de entrada e estratégia de lucro para diferentes ativos e estilos de negociação.
Tem funções incorporadas de rastreamento de lucro para ajustar automaticamente o lucro com base na ação do preço, evitando o gatilho prematuro do lucro.
Configurações flexíveis de parâmetros de backtest facilitam o teste de dados de diferentes prazos para avaliar o desempenho da estratégia.
Pode configurar diretamente bots ao vivo em 3commas usando resultados de backtest sem codificação adicional.
A DCA corre o risco de aumentar ainda mais as posições e as perdas se o mercado continuar a descer.
Percentagem fixa de lucro não pode ajustar-se à volatilidade do mercado, riscos de saída prematura ou tardia.
Risco de excesso de capacidade de teste, desempenho em tempo real afetado pelos custos de transação, etc. É necessária uma avaliação adequada.
Riscos de estabilidade da plataforma, falha de execução.
Ajustar dinamicamente o desvio de preço com base na volatilidade de diferentes ativos para otimizar as regras de pirâmide.
Incorporar indicadores de volatilidade para determinar uma percentagem de lucro mais científica.
Estabelecer um prazo razoável de backtest baseado em sessões de negociação de ativos específicos.
Introduzir stop loss para cortar perdas quando a posição for significativamente baixa.
Utilize o aprendizado de máquina para otimizar dinamicamente os parâmetros.
Em geral, este é um backtester DCA muito prático. Ele suporta uma grande personalização para regras de entrada e take profit. O trailing take profit também complementa bem o fix take profit. Parâmetros de backtest flexíveis permitem testar diferentes ativos e prazos. Com ajuste adequado dos parâmetros, essa estratégia pode produzir excelentes resultados para ativos de alta oportunidade, protegendo riscos sistêmicos com DCA. Mas riscos como pirâmide e take profit devem ser observados na negociação ao vivo, juntamente com a estabilidade da plataforma.
/*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)