La banda de Bollinger y el RSI se mezclan con la estrategia DCA

El autor:¿ Qué pasa?, Fecha: 2024-01-18 11:23:15
Las etiquetas:

img

Resumen general

La estrategia se llama Bollinger Band and RSI Mixing with DCA. Construye señales comerciales basadas en los indicadores Bollinger Band y Relative Strength Index (RSI) y gestiona riesgos utilizando el promedio progresivo de costos en dólares (DCA).

Principio de la estrategia

La estrategia integra los indicadores Bollinger Band y RSI. La banda de Bollinger juzga claramente la tendencia donde por encima de la banda media significa un mercado alcista y por debajo significa un mercado bajista. RSI indica situaciones de sobrecompra y sobreventa. La estrategia construye un indicador MIX ponderando la desviación de la banda de Bollinger y el valor K de RSI. Se genera una señal larga cuando el indicador MIX rompe 20 desde abajo.

Para la parte progresiva de DCA, se abre una posición inicial cuando MIX rompe 20. Se agregan posiciones adicionales a una cantidad fija cada vez que el precio cae en un porcentaje fijo. Esto se continúa hasta que se alcanzan las posiciones máximas o se activa el stop loss / take profit. Al agregar posiciones en mínimos de mercado varias veces, el costo promedio se puede reducir progresivamente.

Ventajas de la estrategia

  1. La combinación de dos indicadores mejora la precisión de la señal mediante un juicio de tendencia más claro.

  2. El DCA progresivo reduce la base de costos durante los descensos, reduciendo el riesgo de pérdidas al tiempo que aumenta el rango de ganancias.

  3. Las condiciones de toma de ganancias y stop loss controlan rápidamente los riesgos y bloquean ganancias parciales.

  4. El filtro de rango de fecha agregado permite backtests enfocados y optimizaciones de períodos específicos.

Riesgos y soluciones

  1. Tanto la banda de Bollinger como el RSI pueden sufrir fallas. Se pueden probar diferentes combinaciones de parámetros para obtener la mejor precisión de la señal.

  2. El DCA progresivo puede aumentar las pérdidas durante grandes caídas agregando continuamente posiciones.

  3. Los eventos de cisne negro y los movimientos anormales de los precios no pueden ser previstos.

Direcciones de optimización

  1. Prueba y optimiza los parámetros del indicador MIX para obtener señales comerciales más precisas.

  2. Optimice los parámetros de stop loss y take profit para obtener la mejor relación ganancia/pérdida.

  3. Prueba diferentes tamaños y frecuencias de posición de suma para encontrar combinaciones óptimas.

  4. Considere la posibilidad de añadir módulos de control del volumen de operaciones a la estrategia de apertura/cierre basada en las condiciones de volumen.

Resumen de las actividades

La mezcla de la banda de Bollinger y el RSI con la estrategia de DCA combina múltiples técnicas y métodos cuantitativos. Construye un indicador claro para juzgar la tendencia y reduce la base de costos a través de adiciones progresivas. Los métodos estrictos de control de riesgos, incluidas las operaciones de stop loss y take profit, lo hacen práctico.


/*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')


Más.