Estrategia DCA progresiva basada en indicadores RSI y Bandas de Bollinger


Fecha de creación: 2024-01-18 11:23:15 Última modificación: 2024-01-18 11:23:15
Copiar: 2 Número de Visitas: 941
1
Seguir
1617
Seguidores

Estrategia DCA progresiva basada en indicadores RSI y Bandas de Bollinger

Descripción general

La estrategia se llama estrategia de DCA progresivo de indicadores de doble doble. Se basa en la señal de comercio de los indicadores de la vía de Brin y el índice de fuerza relativa (RSI), mientras que el uso de la metodología de aumento progresivo de la posición para la gestión del riesgo. Su idea principal es la captura de la tendencia en el mercado alcista, el uso de indicadores para la construcción de señales de múltiples cabezas; y en la bajada, el uso de la estrategia de DCA progresivo para reducir los costos.

Principio de estrategia

La estrategia combina el canal de Bolling y el RSI. El canal de Bolling es un indicador claro de la tendencia de la situación, y el medio de Bolling está en la parte superior del mercado alcista y en la parte inferior del mercado bajista. El RSI es un indicador de sobrecompra y sobreventa. La estrategia construye un indicador MIX, que pondera el diferencial de precios del canal de Bolling y el valor de K del RSI como media ponderada.

La parte DCA progresiva, primero abre la primera orden cuando el indicador MIX supera los 20. Después, cada vez que el precio descienda un cierto margen, agregue una posición por una cierta cantidad. Hasta que se alcance el máximo volumen de la posición o la salida del stop loss.

Ventajas estratégicas

  1. El doble indicador se combina con una clara tendencia de juicio, aumentando la precisión de la señal.

  2. Las estrategias de DCA progresivo pueden reducir los costos de las posiciones en la baja, reducir el riesgo de pérdidas y aumentar el margen de ganancia.

  3. Se establecen condiciones de stop loss y stop-loss para detener los riesgos de control de pérdidas a tiempo y también para asegurar una parte de los beneficios.

  4. Añadir el rango de parámetros de fecha de apertura de la posición, que se puede probar y optimizar para un período de tiempo específico.

Riesgos y soluciones

  1. Tanto el canal de Brin como el RSI pueden fallar. Se pueden probar diferentes combinaciones de parámetros para encontrar la mejor posición.

  2. El DCA progresivo puede aumentar las pérdidas con el aumento continuo de posiciones en situaciones de gran caída. Se puede establecer el número máximo de posiciones en riesgo y mejorar adecuadamente el control de riesgos de la línea de detención de pérdidas.

  3. Las situaciones excepcionales en las que no se puede prevenir un evento inesperado. Se puede agregar un indicador de la bolsa grande para evaluar el riesgo sistemático y evitar períodos excepcionales.

Dirección de optimización de la estrategia

  1. Prueba de optimización de los parámetros del indicador MIX para obtener una señal de negociación más precisa.

  2. Optimización de los parámetros de la parada de pérdidas para maximizar la relación de pérdidas y ganancias.

  3. Prueba la amplitud y la frecuencia de las posiciones adicionales para encontrar la combinación óptima.

  4. Se puede considerar la inclusión de un módulo de control de volumen de transacciones para abrir o cerrar la estrategia en condiciones de volumen de transacciones específicas.

Resumir

La estrategia de DCA progresiva de doble indicador utiliza una combinación de indicadores y métodos técnicos cuantitativos. Construye indicadores claros para juzgar las tendencias y reduce los costos con el aumento progresivo de la posición. Al mismo tiempo, los estrictos métodos de detención de pérdidas y control de riesgo lo hacen práctico y seguro.

Código Fuente de la Estrategia
/*backtest
start: 2023-01-11 00:00:00
end: 2024-01-17 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// © lagobrian23
//@version=4
strategy(title = 'Bollinger Bands and RSI mix with DCA', shorttitle = 'BB/RSI with DCA',pyramiding = 20, calc_on_every_tick = true, overlay = false )
source=close
smoothK = input(3, "K", minval=1)
smoothD = input(3, "D", minval=1)
lengthRSI = input(14, "RSI Length", minval=1)
lengthStoch = input(14, "Stochastic Length", minval=1)
src = input(close, title="RSI Source")
rsi1 = rsi(src, lengthRSI)
k = sma(stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK)
d = sma(k, smoothD)

// Bollinger Band

length = input(20,title = 'BB lookback length', minval=1)
mult = input(2.0, minval=0.001, maxval=50, title="StdDev")
basis = sma(src, length)
dev = mult * stdev(src, length)
upper = basis + dev
lower = basis - dev
BBval = (src - basis)/dev*30+50
offset = input(0, title = "Offset", type = input.integer, minval = -500, maxval = 500)
mix=(d + BBval)/2

//plot
//plot(k, "K", color=#606060)
plot(BBval, "BBval", color=#872323, offset = offset)
plot(d, "D", color=#FF6A00)
h0 = hline(80, "Upper Band", color=#606060)
h1 = hline(20, "Lower Band", color=#606060)
plot(mix, "MIX", color=#888888, linewidth=3)

//background MIX
bgcolor(mix < 20 ? color.green : color.white, transp=50)
bgcolor(mix > 80 ? color.red : color.white, transp=50)

// Choosing the date range
fromMonth = input(defval = 1,    title = "From Month",      type = input.integer, minval = 1, maxval = 12)
fromDay   = input(defval = 1,    title = "From Day",        type = input.integer, minval = 1, maxval = 31)
fromYear  = input(defval = 2020, title = "From Year",       type = input.integer, minval = 1970)
toMonth = input(defval = 1,    title = "To Month",      type = input.integer, minval = 1, maxval = 12)
toDay   = input(defval = 1,    title = "To Day",        type = input.integer, minval = 1, maxval = 31)
toYear  = input(defval = 2112, title = "To Year",       type = input.integer, minval = 1970)

start     = timestamp(fromYear, fromMonth, fromDay, 00, 00)        // backtest start window
finish    = timestamp(toYear, toMonth, toDay, 23, 59)        // backtest finish window
window()  => true

// Initializing the strategy paraeters

P = input(defval = 1, title = 'Amount (P)' , type = input.integer, minval = 1, maxval = 100)
X = input(defval = 2, title = '% Price drop for consecutive entries(X)', type = input.float, minval = 1, maxval = 100)
B_tp = input(defval = 10, title = '% Level for Take Profit (B)', type = input.float , minval = 1, maxval = 100)
D_sl = input(defval = 10, title = '% Level for Stop Loss (D)', type = input.float, minval = 1, maxval = 100)
A = input(defval = 5, title = 'Max consecutive entries (A)', type = input.integer, minval = 2, maxval = 20)
Z = input(defval = 0.5, title = 'Z', type = input.float , minval = 0, maxval = 10)

// Declaring key DCA variables
entry_price = 0.0
entry_price := na(entry_price[1]) ? na : entry_price[1]
new_entry = 0.0
consec_entryCondition = false
// Implementing the strategy
longEntry = crossover(mix,20)
exitLongs = crossunder(mix, 80)

if(longEntry)
    entry_price := close
    strategy.entry('main_LE', strategy.long , P, when = window() and longEntry)

// Exiting conditions
stoploss = strategy.position_avg_price*(1-(D_sl/100))
takeprofit = strategy.position_avg_price*(1+(B_tp/100))
slCondition = crossunder(close, stoploss)
tpCondition = crossover(close, takeprofit)

// We want to exit if the 'mix' indicator crosses 80, take profit is attained or stop loss is tagged.
exitConditions = exitLongs or slCondition or tpCondition

// Consecutive entries upto A times
// strategy.risk.max_intraday_filled_orders(A)

//Dollar-Cost-Averaging
// Enter long whenever price goes down X%: amount set to (P+Y)*Z
newAmount = (P+X)*Z
// If we haven't reached max open trades, buy newAmount immediately price crosses under X% lower the previous entry price
new_entry := entry_price - ((X/100)*entry_price)
consec_entryCondition := crossunder(close, new_entry)
if(consec_entryCondition and strategy.opentrades != A)
    strategy.entry('consec_LE', strategy.long, newAmount, oca_name = 'consecLongs', when = window() and consec_entryCondition)
    entry_price := close
    
// Exiting
// The main trade is closed only when the  main exit conditions are satisfied
strategy.close('main_LE', comment = 'Main Long Closed', when = window() and exitConditions)

// A consective long is closed only when tp or sl is tagged
strategy.exit('ext a consec', 'consec_LE', loss = D_sl*strategy.position_avg_price , profit = B_tp*strategy.position_avg_price, oca_name =  'consecLongs')