Ajuste dinámico de la estrategia DCA en función del volumen de operaciones

QFL DCA TP SL ATR ADX EMA SMA RSI MACD
Fecha de creación: 2024-04-12 17:12:07 Última modificación: 2024-04-12 17:12:07
Copiar: 5 Número de Visitas: 995
1
Seguir
1617
Seguidores

Ajuste dinámico de la estrategia DCA en función del volumen de operaciones

Descripción general

La estrategia es una estrategia de DCA dinámica basada en volumen de transacciones y brechas de precios. Identifica los mínimos de precios más recientes y comienza a colocarse cuando los precios superan ese mínimo y el volumen de transacciones aumenta. A medida que los precios continúan bajando, la estrategia ajusta dinámicamente el número de posiciones establecidas cada vez según el tamaño de las pérdidas flotantes hasta alcanzar el número total de posiciones establecidas.

Principio de estrategia

  1. Utiliza la función ta.pivotlow (()) para identificar los mínimos más recientes y usarlos como soporte.
  2. Calcular la caída después de que el precio histórico haya roto el nivel de soporte, tomando los dígitos como referencia para la distancia de seguridad y la caída de alto.
  3. Cuando el precio rompa el soporte y el volumen de operaciones relativo es mayor que el multiplicador establecido, se activa la señal de construcción de posición.
  4. De acuerdo con el número total de almacenes establecidos, divida el capital total en partes iguales, y cada vez que se construya un almacén, ajuste el número de almacenes según la dinámica del número de almacenes construidos en el momento, para lograr un aumento en el índice de posiciones.
  5. En el proceso de construcción de la bodega, si la pérdida flotante alcanza el umbral establecido, continúe aumentando la bodega hasta alcanzar el número total de construcción de la bodega.
  6. Cuando el precio sube hasta el precio de parada, se eliminan todas las posiciones.

Ventajas estratégicas

  1. Ajuste dinámico del número de posiciones creadas: De acuerdo con los pérdidas flotantes en el proceso de caída de los precios, ajuste dinámico del número de posiciones creadas cada vez, al mismo tiempo que controla el riesgo, también puede obtener más ganancias cuando los precios se recuperan.
  2. Para establecer los parámetros de referencia de los datos históricos, utilice los dígitos de la caída después de que el precio histórico haya roto el nivel de soporte como referencia para la distancia de seguridad y la amplitud de la parálisis, para que los parámetros de la estrategia estén más cerca de la situación real del mercado.
  3. Limitar el número de posiciones totales: mediante la configuración del número de posiciones totales, controlar la abertura de riesgo total de la estrategia y evitar las pérdidas causadas por la acumulación excesiva de posiciones.

Riesgo estratégico

  1. Riesgo de falla de soporte: Si el mercado se encuentra en un estado de extremo, el precio se mantiene en una caída significativa después de romper el soporte, el mecanismo de alza de la estrategia puede causar grandes pérdidas.
  2. Riesgo de configuración de parámetros: el rendimiento de la estrategia depende en gran medida de la configuración de los parámetros, y si los parámetros se ajustan incorrectamente, puede ocasionar un mal rendimiento de la estrategia.
  3. El riesgo de establecer un precio de parada: si se establece un precio de parada demasiado alto, se puede perder parte de los beneficios; si se establece demasiado bajo, se puede cerrar la posición prematuramente y no aprovechar al máximo las oportunidades de repunte del precio.

Dirección de optimización de la estrategia

  1. Introducción de más indicadores: En el juicio de la señal de almacenamiento, se pueden introducir más indicadores técnicos, como RSI, MACD, etc., para mejorar la precisión de la señal.
  2. Optimización de la gestión de fondos: Se puede ajustar dinámicamente la proporción de fondos en cada posición de inversión en función de factores como la volatilidad del mercado y la capacidad de soportar el riesgo de la cuenta para controlar mejor el riesgo.
  3. Adaptación de la parada automática: ajusta dinámicamente la magnitud de la parada automática de acuerdo con los cambios en la volatilidad del mercado para adaptarse mejor a los cambios en el mercado.

Resumir

La estrategia busca obtener más ganancias en caso de rebote de los precios, a través de ajustes dinámicos del número de posiciones creadas y de la configuración de parámetros basados en datos históricos. Sin embargo, el rendimiento de la estrategia depende en gran medida de la configuración de los parámetros y de las condiciones del mercado.

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