Estrategia de disminución de la tendencia del índice BB porcentual

El autor:¿ Qué pasa?, Fecha: 2023-12-06 14:43:39
Las etiquetas:

img

Resumen general

Esta estrategia se basa en el índice BB porcentual combinado con indicadores RSI y de IFM. Toma decisiones largas y cortas al detectar rupturas de precios de los rieles superior e inferior de las bandas de Bollinger, junto con señales de sobreventa/sobredacción del RSI y señales de sobreventa/sobredacción de las IFM. Es una estrategia comercial típica de tendencia que se desvanece.

Estrategia lógica

  1. Calcular el porcentaje de banda de Bollinger (BB%). BB% representa la desviación estándar del precio en relación con la banda media de Bollinger, que juzga la dirección del mercado a través del canal de Bollinger.
  2. Incorporar indicadores RSI y IFM para determinar las condiciones de sobrecompra y sobreventa. El RSI compara la ganancia promedio y la pérdida promedio durante un período de tiempo para determinar los niveles de sobrecompra y sobreventa. Las IFM comparan el volumen y el volumen descendente para determinar los niveles de sobrecompra y sobreventa.
  3. Cuando el precio rompe el rieles inferiores de Bollinger hacia arriba, vaya largo; cuando el precio rompe el rieles superiores de Bollinger hacia abajo, vaya corto. Al mismo tiempo, use las señales de sobreventa / sobrecompra de los indicadores RSI y MFI para filtrar.

Ventajas

  1. El comercio de tendencias de desvanecimiento evita las tendencias del mercado y reduce las fluctuaciones de los rendimientos.
  2. La combinación de múltiples indicadores filtra las señales y mejora la precisión de las decisiones.
  3. Los parámetros son flexibles para ajustar las características de riesgo-rendimiento de la estrategia.
  4. Aplicable a instrumentos altamente volátiles como materias primas, divisas, criptomonedas, etc.

Riesgos y soluciones

  1. Existe una alta probabilidad de señales falsas de las rupturas de Bollinger, lo que requiere una combinación de múltiples indicadores para la filtración.
  2. El juicio de la señal de ruptura requiere criterios adecuadamente relajados para evitar perder buenas oportunidades.
  3. Ajustar la configuración de los parámetros para controlar los riesgos, como el tamaño de las posiciones, el aumento de las líneas de stop loss, etc.

Direcciones de optimización

  1. Incorporar mecanismos de stop loss basados en la volatilidad, como el indicador ATR.
  2. Introducir modelos de aprendizaje automático para ayudar a juzgar la calidad de la señal de fuga.
  3. Optimizar los mecanismos de selección de instrumentos para ajustar dinámicamente los instrumentos participantes.
  4. Incorporar más factores como indicadores de sentimiento, noticias, etc. para mejorar el marco de decisión.

Conclusión

Esta estrategia se aplica principalmente a los instrumentos de alta volatilidad que no son de tendencia. Implementa el comercio de tendencia a través de combinaciones de canales de Bollinger y indicadores. Las características de riesgo-rendimiento se pueden controlar ajustando los parámetros. Se pueden hacer mejoras adicionales introduciendo más indicadores y modelos auxiliares para optimizar la calidad de la decisión, logrando así un mejor rendimiento de la estrategia.


/*backtest
start: 2023-11-05 00:00:00
end: 2023-12-05 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2018

//@version=2
strategy(title = "BB%/MFI/RSI", shorttitle = "BB%/MFI/RSI", default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 100)

//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(false, defval = false, title = "Short")
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Lot, %")
fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From Day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To Day")

source = hlc3
length = input(14, minval=1), mult = input(2.0, minval=0.001, maxval=50), bblength = input(50, minval=1, title="BB Period")
DrawRSI_f=input(true, title="Draw RSI?", type=bool)
DrawMFI_f=input(false, title="Draw MFI?", type=bool)
HighlightBreaches=input(true, title="Highlight Oversold/Overbought?", type=bool)

DrawMFI = (not DrawMFI_f) and (not DrawRSI_f) ? true : DrawMFI_f
DrawRSI = (DrawMFI_f and DrawRSI_f) ? false : DrawRSI_f
// RSI
rsi_s = DrawRSI ? rsi(source, length) : na
plot(DrawRSI ? rsi_s : na, color=maroon, linewidth=2)

// MFI
upper_s = DrawMFI ? sum(volume * (change(source) <= 0 ? 0 : source), length) : na
lower_s = DrawMFI ? sum(volume * (change(source) >= 0 ? 0 : source), length) : na
mf = DrawMFI ? rsi(upper_s, lower_s) : na
plot(DrawMFI ? mf : na, color=green, linewidth=2)

// Draw BB on indices
bb_s = DrawRSI ? rsi_s : DrawMFI ? mf : na
basis = sma(bb_s, length)
dev = mult * stdev(bb_s, bblength)
upper = basis + dev
lower = basis - dev
plot(basis, color=red)
p1 = plot(upper, color=blue)
p2 = plot(lower, color=blue)
fill(p1,p2, blue)

b_color = (bb_s > upper) ? red : (bb_s < lower) ? lime : na
bgcolor(HighlightBreaches ? b_color : na, transp = 0)

//Signals
up = bb_s < lower and close < open
dn = bb_s > upper and close > open
size = strategy.position_size
lp = size > 0 and close > open
sp = size < 0 and close < open
exit = (up == false and dn == false) and (lp or sp)

//Trading
lot = strategy.position_size == 0 ? strategy.equity / close * capital / 100 : lot[1]
if up
    if strategy.position_size < 0
        strategy.close_all()
        
    strategy.entry("Long", strategy.long, needlong == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))

if dn
    if strategy.position_size > 0
        strategy.close_all()
        
    strategy.entry("Short", strategy.short, needshort == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
    
if time > timestamp(toyear, tomonth, today, 23, 59) or exit
    strategy.close_all()

Más.