Basado en una estrategia de adición de posiciones dinámicas


Fecha de creación: 2024-02-20 14:16:30 Última modificación: 2024-02-20 14:16:30
Copiar: 0 Número de Visitas: 624
1
Seguir
1617
Seguidores

Basado en una estrategia de adición de posiciones dinámicas

Descripción general

La idea principal de esta estrategia es la de acumular posiciones en función de la dinámica de las señales del sistema, y establecer gradualmente posiciones en un mercado alcista para controlar el riesgo y obtener un precio de entrada promedio más bajo.

Principio de estrategia

La estrategia establece primero el porcentaje de capital inicial y la configuración de DCA. Al cerrar cada línea K, calcula el porcentaje de configuración ajustado según el cambio de precio. Si el precio sube, reduce el porcentaje; si el precio baja, aumenta el porcentaje.

De esta manera, puede controlar el riesgo y obtener un precio de entrada promedio más bajo cuando el mercado fluctúa. Al mismo tiempo, también puede calcular el precio de entrada promedio y el precio medio para determinar la situación actual de la entrada.

Análisis de las ventajas

La estrategia tiene las siguientes ventajas:

  1. Puede aumentar la posición dinámicamente, aumentar la posición cuando el mercado cae y reducir la posición cuando el mercado sube, para controlar el riesgo.

  2. Se obtiene un precio de entrada promedio más bajo que el precio medio, lo que favorece un mayor margen de ganancias.

  3. En el mercado de los toros, el riesgo-beneficio es más favorable que el riesgo-beneficio.

  4. Se puede configurar el capital inicial y el porcentaje de DCA para controlar la cantidad de capital que se acumula cada vez, evitando el riesgo excesivo.

  5. Ofrece estadísticas del precio promedio de entrada y el precio medio, lo que permite evaluar de forma intuitiva las ventajas y desventajas.

Análisis de riesgos

La estrategia también tiene ciertos riesgos:

  1. La estrategia se mantiene al alza en el momento de una caída abrupta en el mercado, lo que puede llevar a una mayor pérdida de capital. Se puede establecer un stop loss para controlar el riesgo.

  2. Si el mercado sube rápidamente, la subida de la estrategia disminuye y puede perder la mayor parte de las oportunidades de subida. En este caso, se necesita utilizar otras señales para un LSI ágil.

  3. La configuración incorrecta de los parámetros también conlleva un cierto riesgo. El exceso de capital inicial y el porcentaje de DCA demasiado alto ampliarán las pérdidas.

Dirección de optimización

La estrategia también puede ser optimizada en los siguientes aspectos:

  1. Se puede agregar una lógica de stop loss para detener la subida de la posición en caso de caídas significativas.

  2. El porcentaje de DCA puede ajustarse a la fluctuación o a otros indicadores.

  3. Se puede agregar un modelo de aprendizaje automático para predecir los cambios en el precio y así orientar las decisiones de inversión.

  4. La estructura del mercado puede ser evaluada en combinación con otros indicadores técnicos, para detener el alza de posiciones en un punto de inflexión estructural.

  5. Se puede agregar un módulo de administración de fondos para ajustar dinámicamente el capital de cada depósito en función de la situación de los fondos de la cuenta.

Resumir

La estrategia es una estrategia de alza de posición dinámica muy práctica. Puede ajustar las posiciones de forma flexible según las fluctuaciones del mercado, obteniendo un precio de entrada promedio más bajo en un mercado alcista. Al mismo tiempo, tiene una configuración de parámetros incorporada para controlar el riesgo.

Código Fuente de la Estrategia
/*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)