Com base na estratégia de adição de posição dinâmica


Data de criação: 2024-02-20 14:16:30 última modificação: 2024-02-20 14:16:30
cópia: 0 Cliques: 624
1
focar em
1617
Seguidores

Com base na estratégia de adição de posição dinâmica

Visão geral

A ideia principal da estratégia é aumentar a posição de acordo com a dinâmica dos sinais do sistema, construindo gradualmente posições em um mercado de alta, para controlar o risco e obter um preço de entrada médio mais baixo.

Princípio da estratégia

A estratégia define primeiro o capital inicial e a percentagem de disposição de DCA. Quando cada linha K se encerra, ela calcula a percentagem de disposição ajustada de acordo com a mudança de preço. Se o preço sobe, ela reduz a percentagem; se o preço cai, ela aumenta a percentagem.

Dessa forma, pode controlar o risco e obter um preço de entrada médio mais baixo quando o mercado oscila. Ao mesmo tempo, ele também calcula o preço de entrada médio e o preço médio, o que permite avaliar a entrada atual.

Análise de vantagens

A estratégia tem as seguintes vantagens:

  1. Pode aumentar a posição de forma dinâmica, aumentando a posição quando o mercado cai, reduzindo a posição quando o mercado sobe, controlando assim o risco.

  2. O preço médio de entrada é menor do que o preço médio, o que favorece um maior espaço de ganhos.

  3. A melhor relação risco-recompensa é obtida com a corrida de um mercado de touros.

  4. Pode-se predefinir o capital inicial e a porcentagem de DCA, controlar a quantidade de capital a ser adicionada a cada adição, evitando riscos excessivos.

  5. A partir de agora, os participantes poderão avaliar o preço médio e médio do ingresso.

Análise de Riscos

A estratégia também traz alguns riscos:

  1. A estratégia de aumentar a posição em caso de queda acentuada do mercado, o que pode levar a grandes perdas de capital. Pode-se definir um stop loss para controlar o risco.

  2. Se o mercado subir rapidamente, a estratégia pode perder a maior parte das oportunidades de alta. É necessário usar outros sinais para um LSI ágil.

  3. A configuração inadequada dos parâmetros também traz algum risco. O excesso de capital inicial e a alta porcentagem de DCA aumentam os prejuízos.

Direção de otimização

A estratégia também pode ser melhorada nos seguintes aspectos:

  1. Pode-se adicionar a lógica de stop loss, para parar de adicionar posições em caso de queda significativa.

  2. A porcentagem de DCA pode ser ajustada de acordo com a volatilidade ou outros indicadores.

  3. Pode ser adicionado um modelo de aprendizagem de máquina para prever mudanças de preço e, assim, orientar as decisões de aquisição.

  4. Pode ser combinado com outros indicadores técnicos para determinar a estrutura do mercado e parar de adicionar posições em pontos de mudança estrutural.

  5. Pode ser adicionado um módulo de gerenciamento de fundos, que ajusta dinamicamente o capital de cada adição de depósito de acordo com o saldo da conta.

Resumir

A estratégia é uma estratégia de acréscimo de posição dinâmica muito prática. Ela pode ajustar posições de forma flexível de acordo com as flutuações do mercado, obtendo um preço de entrada médio mais baixo em um mercado de touros. Ao mesmo tempo, ela incorpora configurações de parâmetros para controlar o risco.

Código-fonte da estratégia
/*backtest
start: 2024-01-20 00:00:00
end: 2024-02-19 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © RWCS_LTD

//@version=5
strategy("DCA IN Calculator {RWCS}", overlay=true, pyramiding=999, default_qty_type=strategy.cash, initial_capital=10000, commission_value=0.02)

// User inputs
backtestStartDate = input(timestamp("1 Jan 2024"), 
     title="Start Date", group="Backtest Time Period",
     tooltip="This start date is in the time zone of the exchange " + 
     "where the chart's instrument trades. It doesn't use the time " + 
     "zone of the chart or of your computer.")
start_date = true
starting_capital = input.float(defval=5000, title="Starting Capital")
dca_allocation_percentage = input.int(defval=10, title="DCA Allocation Percentage")

// Calculate DCA allocation based on price change
price_change_percentage = ((close - close[1]) / close[1]) * 100
adjusted_allocation_percentage = close > close[1] ? dca_allocation_percentage - price_change_percentage : dca_allocation_percentage + price_change_percentage // If price action is negative, increase allocations
adjusted_allocation_percentage1 = dca_allocation_percentage - price_change_percentage // If price action is positive, reduce allocations

// Calculate order size based on adjusted allocation percentage
order_size = (adjusted_allocation_percentage / 100) * starting_capital

// Track remaining capital
var remaining_capital = starting_capital

// Long on the close of every bar
if true
    // Ensure the order size doesn't exceed remaining capital or adjusted allocation
    order_size := math.min(order_size, remaining_capital, adjusted_allocation_percentage / 100 * starting_capital)
    // Ensure order size is not negative
    order_size := math.max(order_size, 0)
    
    strategy.entry("DCA", strategy.long, qty = order_size)
    remaining_capital := remaining_capital - order_size

// Plot average entry price
var float total_entry_price = 0.0
var int total_signals = 0

if start_date
    total_entry_price := total_entry_price + close
    total_signals := total_signals + 1

avg_entry_price = total_entry_price / total_signals

// Calculate and plot median price
var float median_price = na

if start_date
    var float sum_prices = 0.0
    var int num_prices = 0
    
    for i = 0 to bar_index
        if (time[i] >= backtestStartDate)
            sum_prices := sum_prices + close[i]
            num_prices := num_prices + 1
    
    median_price := sum_prices / num_prices

// Reset variables at the start of each day
if (dayofweek != dayofweek[1])
    total_entry_price := 0.0
    total_signals := 0

//table colors
borders_col = color.new(color.black, 90)
top_row_col = color.new(color.gray, 90)
size = input.string(defval='Normal', options=['Tiny', 'Small', 'Normal', 'Large'], title='Table size', inline='design', group='Table Design')
table_size = size == 'Tiny' ? size.tiny : size == 'Small' ? size.small : size == 'Normal' ? size.normal : size == 'Large' ? size.large : na

var tablee = table.new(position=position.top_right, columns=2, rows=3, frame_color=borders_col, frame_width=4, border_color=borders_col, border_width=4)

table.cell(tablee, 0, 0, "Average Entry Price", bgcolor=top_row_col, text_color=color.white, text_size=table_size)
table.cell(tablee, 1, 0, str.tostring(avg_entry_price, '#.##'), text_color=color.white, text_size=table_size)
table.cell(tablee, 0, 1, "Median Price", bgcolor=top_row_col, text_color=color.white, text_size=table_size)
table.cell(tablee, 1, 1, str.tostring(median_price, '#.##'), text_color=color.white, text_size=table_size)
table.cell(tablee, 0, 2, "Remaining Capital", bgcolor=top_row_col, text_color=color.white, text_size=table_size)
table.cell(tablee, 1, 2, str.tostring(remaining_capital, '#.##'), text_color=color.white, text_size=table_size)