En la carga de los recursos... Cargando...

Estrategia dinámica de DCA basada en el volumen

El autor:¿ Qué pasa?, Fecha: 2024-04-12 17:12:07
Las etiquetas:Cuota de mercadoDCATPSLEl ATRADXEl EMALa SMAIndicador de riesgoEl MACD

img

Resumen general

Esta estrategia es una estrategia dinámica de DCA basada en el volumen que utiliza las rupturas de precios. Identifica el precio más bajo reciente y comienza a construir posiciones cuando el precio se rompe por debajo de ese mínimo y el volumen de negociación aumenta. A medida que el precio continúa cayendo, la estrategia ajusta dinámicamente la cantidad de cada posición en función del tamaño de la pérdida flotante hasta que alcanza el número total de posiciones establecidas. Al mismo tiempo, la estrategia establece el precio de toma de ganancias basado en la mediana de los porcentajes históricos de caída de precios.

Principios de estrategia

  1. Utilice la función ta.pivotlow() para identificar el precio más bajo reciente y tratarlo como un nivel de soporte.
  2. Calcular los porcentajes históricos de caída de precios después de romper el nivel de soporte y tomar la mediana como referencia para la distancia segura y el porcentaje de ganancia.
  3. Activar la señal de construcción de posición cuando el precio se rompe por debajo del nivel de soporte y el volumen relativo de operaciones es mayor que el múltiplo establecido.
  4. Cada vez que se construye una posición, ajuste dinámicamente el tamaño de la posición en función del número actual de posiciones, logrando un crecimiento exponencial en el tamaño de la posición.
  5. Durante el proceso de creación de posiciones, si la pérdida flotante alcanza el umbral establecido, seguirá agregando posiciones hasta que se alcance el número total de posiciones.
  6. Cuando el precio suba al precio de take-profit, cierre todas las posiciones.

Ventajas estratégicas

  1. Ajuste dinámico del tamaño de la posición: Al ajustar dinámicamente el tamaño de cada posición en función de la pérdida flotante durante la caída del precio, la estrategia controla el riesgo y también permite obtener mayores ganancias cuando el precio rebota.
  2. Establecimiento de parámetros basados en datos históricos: al calcular la mediana de los porcentajes históricos de caída de precios después de romper el nivel de soporte y utilizarla como referencia para la distancia segura y el porcentaje de obtención de beneficios, los parámetros de la estrategia se alinean más estrechamente con las condiciones reales del mercado.
  3. Limitación del número total de posiciones: al establecer un número total de posiciones, la estrategia controla su exposición al riesgo global y evita pérdidas excesivas debido a la sobreposicionamiento.

Riesgos estratégicos

  1. Si el mercado experimenta condiciones extremas y el precio continúa cayendo bruscamente después de romper el nivel de soporte, el mecanismo de adición de posición de la estrategia puede dar lugar a pérdidas significativas.
  2. Si los parámetros se establecen incorrectamente, puede dar lugar a un mal rendimiento de la estrategia.
  3. El riesgo de fijación del precio de take-profit: si el precio de take-profit se fija demasiado alto, las ganancias potenciales pueden perderse.

Direcciones para la optimización de la estrategia

  1. Introducir más indicadores: al determinar la señal de construcción de posición, se pueden introducir más indicadores técnicos como el RSI y el MACD para mejorar la precisión de la señal.
  2. Optimizar la gestión de fondos: basándose en factores como la volatilidad del mercado y la tolerancia al riesgo de la cuenta, ajustar dinámicamente la proporción de fondos para cada posición para controlar mejor el riesgo.
  3. Profit y stop-loss adaptativos: ajustar dinámicamente los porcentajes de take-profit y stop-loss en función de los cambios en la volatilidad del mercado para adaptarse mejor a los cambios del mercado.

Resumen de las actividades

Al ajustar dinámicamente los tamaños de las posiciones y establecer parámetros basados en datos históricos, esta estrategia tiene como objetivo controlar el riesgo mientras busca mayores ganancias durante los rebotes de precios. Sin embargo, el rendimiento de la estrategia depende en gran medida de la configuración de los parámetros y las condiciones del mercado, y los riesgos aún existen. Al introducir más indicadores, optimizar la gestión de dinero y usar el aprovechamiento y la parada de pérdida adaptativos, el rendimiento de la estrategia puede mejorarse aún más.


/*backtest
start: 2024-04-04 00:00:00
end: 2024-04-11 00:00:00
period: 1m
basePeriod: 1m
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/
// © AHMEDABDELAZIZZIZO

//@version=5

strategy("Qfl Dca strategy", overlay=true)

// Parameters
swing = input(3 , title = "Swing Points")
mediandropmult = input.float(1.1, "Median drop Mult", step=0.1 , tooltip = "The script Calculate The Median Drop for all last Bases That Was cracked you can Increase or decrease it")
floatinglossvalue = input(-5 , "Floating Loss" , tooltip = "Position Floating Loss to start firs DCA order")
num_orders = input(5 , "Number of all orders" , tooltip = " The number of orders is including the base order and the DCA orders the script will alculate every order qty based on the orders number So that the position size doubles with every order")
length = input(20, title="Length of relative volume" ,tooltip =  " the length of relative volume indicator")
mult = input(2.0, title="Volume Multiplier" , tooltip = "you can adjust the relative volume multiplier to find best parameter")
tpmult = input.float(1, step=0.1 ,title = "Take Profit Multiplier" ,tooltip =  " By default, the script is set to take profits based on the same median drop percent you can adjust it as you like")



// Pivot Calculation
p = ta.pivotlow(low, swing, swing)
v = ta.valuewhen(p, low[swing], 0)

// Variables
var float[] lows = array.new_float()
var float chn = na

// Calculate drops
if v < v[1]
    chn := (v[1] - v) / v[1] * 100
    if array.size(lows) < 4000
        array.push(lows, chn)
    else
        array.shift(lows)
        array.push(lows, chn)

mediandrop = array.avg(lows)
maxdrop = array.max(lows)
mindrop = array.min(lows)

// Table display
textcolor = color.white
// tabl = table.new(position=position.top_right, columns=4, rows=4)
// table.cell(table_id=tabl, column=1, row=1, text="Avg Drop %", width=15, text_color=textcolor)
// table.cell(table_id=tabl, column=2, row=1, text="Min Drop %", width=15, text_color=textcolor)
// table.cell(table_id=tabl, column=3, row=1, text="Max Drop %", width=15, text_color=textcolor)
// table.cell(table_id=tabl, column=1, row=2, text=str.tostring(mediandrop), width=10, text_color=textcolor)
// table.cell(table_id=tabl, column=2, row=2, text=str.tostring(mindrop), width=10, text_color=textcolor)
// table.cell(table_id=tabl, column=3, row=2, text=str.tostring(maxdrop), width=10, text_color=textcolor)

// Plot support
t = fixnan(ta.pivotlow(low, swing, swing))
plot(t, color=ta.change(t) ? na : #03f590b6, linewidth=3, offset=-(swing), title="Support")

// Calculate relative volume
avgVolume = ta.sma(volume, length)
relVolume = volume / avgVolume

// Base Activation
var bool baseisactive = na
if not na(p)
    baseisactive := true

// Buy Signal Calculation
buyprice = v * (1 - (mediandrop / 100) * mediandropmult)
signal = close <= buyprice and relVolume > mult and baseisactive

// Take Profit Calculation
tpsl = (mediandrop / 100)
tp = (strategy.position_avg_price * (1 + (tpsl * tpmult)))

// Position Sizing
capital_per_order(num_orders, equity) =>
    equity / math.pow(2, (num_orders - 1))

equity_per_order = capital_per_order(num_orders, strategy.equity)

qty_per_order(equity_per_order, order_number) =>
    equity_per_order * order_number / close

// Calculate floating loss
floatingLoss = ((close - strategy.position_avg_price) / strategy.position_avg_price) * 100

// Strategy Entries
if signal and strategy.opentrades == 0
    strategy.entry("Buy", strategy.long, qty=qty_per_order(equity_per_order, 1))
    baseisactive := false

for i = 1 to num_orders -1
    if signal and strategy.opentrades == i and floatingLoss <= floatinglossvalue
        strategy.entry("Buy", strategy.long, qty=qty_per_order(equity_per_order, i), comment="DCA Order" + str.tostring(i))
        baseisactive := false

// Strategy Exit
strategy.exit("exit", "Buy", limit=tp)

// Plot
plot(strategy.position_avg_price, color=color.rgb(238, 255, 0), style=plot.style_linebr, linewidth=2)


Relacionados

Más.