Estrategia de captura de inversiones

El autor:¿ Qué pasa?, Fecha: 2023-11-24 16:43:25
Las etiquetas:

img

Resumen general

La estrategia Reversal-Catcher es una estrategia de trading de reversión que utiliza el indicador de volatilidad Bollinger Bands y el indicador de impulso RSI. Establece el canal de Bollinger Bands y las líneas de sobrecompra/sobreventa RSI como señales para encontrar oportunidades de reversión cuando cambia la dirección de la tendencia.

Estrategia lógica

La estrategia utiliza las bandas de Bollinger como el principal indicador técnico, combinado con el RSI y otros indicadores de impulso para verificar las señales comerciales.

  1. Utilice el EMA de 50 días y el EMA de 21 días cruz dorada / cruz muerta para determinar la tendencia.
  2. En una tendencia a la baja, cuando el precio se rompe por encima de la Banda Inferior de Bollinger, y el RSI simplemente rebota desde el territorio de sobreventa, formando una cruz de oro, indica que el área de sobreventa ya ha tocado fondo, dando una señal de compra.
  3. En una tendencia alcista, cuando el precio se rompe por debajo de la banda superior de Bollinger, y el RSI cae de nuevo desde el área de sobrecompra, formando una cruz muerta, indica que el área de sobrecompra comienza a retroceder, dando una señal de venta.
  4. Las señales de compra y venta anteriores deben activarse juntas para evitar señales falsas.

Análisis de ventajas

Las ventajas de esta estrategia incluyen:

  1. La combinación de los indicadores de volatilidad e impulso hace que las señales sean más confiables.
  2. El comercio inverso tiene un menor riesgo, adecuado para el comercio a corto plazo.
  3. Las reglas de negociación son programables para el comercio automatizado.
  4. La combinación con el comercio de tendencia evita la apertura de desórdenes durante la consolidación del mercado.

Análisis de riesgos

Los riesgos de esta estrategia incluyen:

  1. Las bandas de Bollinger son un riesgo de señal falsa, necesita un filtro RSI.
  2. El riesgo de reversión fallido, necesita un stop loss oportuno.
  3. Riesgo de tiempo de reversión, puede entrar demasiado temprano o perder el mejor punto de entrada.

Para controlar los riesgos, podemos establecer el nivel de stop loss para limitar la exposición al riesgo, y optimizar parámetros como el período de bandas de Bollinger o las cifras del RSI para mejorar el rendimiento del sistema.

Direcciones de optimización

Las principales direcciones de optimización incluyen:

  1. Optimizar los parámetros de las bandas de Bollinger, ajustar la duración del período y la desviación estándar para encontrar el ajuste óptimo.
  2. Optimizar el período de las medias móviles para determinar el mejor período para el juicio de la tendencia.
  3. Ajuste los parámetros del RSI para averiguar el mejor rango de sobrecompra/sobreventa.
  4. Agregue otros indicadores como KDJ, MACD para diversificar las señales de entrada.
  5. Introducir modelos de aprendizaje automático para encontrar parámetros optimizados.

Conclusión

La estrategia Reversal-Catcher es una estrategia comercial a corto plazo efectiva en general. Al combinar el filtrado de tendencias y las señales de reversión, puede evitar señales falsas durante la consolidación del mercado y evitar luchar contra la tendencia. A través de parámetros continuos y optimización del modelo, se puede lograr un mejor rendimiento de la estrategia.


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

// This is an Open source work. Please do acknowledge in case you want to reuse whole or part of this code.
// Please see the documentation to know the details about this.

//@version=5
strategy('Strategy:Reversal-Catcher', shorttitle="Reversal-Catcher", overlay=true , currency=currency.NONE, initial_capital=100000)

// Inputs
src = input(close, title="Source (close, high, low, open etc.")

BBlength = input.int(defval=20, minval=1,title="Bollinger Period Length, default 20")
BBmult = input.float(defval=1.5, minval=1.0, maxval=4, step=0.1, title="Bollinger Bands Standard Deviation, default is 1.5")

fastMovingAvg = input.int(defval=21, minval=5,title="Fast Exponential Moving Average, default 21", group = "Trends")
slowMovingAvg = input.int(defval=50, minval=8,title="Slow Exponential Moving Average, default 50", group = "Trends")

rsiLenght = input.int(defval=14, title="RSI Lenght, default 14", group = "Momentum")
overbought = input.int(defval=70, title="Overbought limit (RSI), default 70", group = "Momentum")
oversold = input.int(defval=30, title="Oversold limit (RSI), default 30", group = "Momentum")

hide = input.bool(defval=true, title="Hide all plots and legends from the chart (default: true)")


// Trade related
tradeType = input.string(defval='Both', group="Trade settings", title="Trade Type", options=['Both', 'TrendFollowing', 'Reversal'], tooltip="Consider all types of trades? Or only Trend Following or only Reversal? (default: Both).")
endOfDay = input.int(defval=1500, title="Close all trades, default is 3:00 PM, 1500 hours (integer)", group="Trade settings")
mktAlwaysOn = input.bool(defval=false, title="Markets that never closed (Crypto, Forex, Commodity)", tooltip="Some markers never closes. For those cases, make this checked. (Default: off)", group="Trade settings")


// Utils
annotatePlots(txt, val, hide) => 
    if (not hide)
        var l1 = label.new(bar_index, val, txt, style=label.style_label_left, size = size.tiny, textcolor = color.white, tooltip = txt)
        label.set_xy(l1, bar_index, val)

/////////////////////////////// Indicators /////////////////////
vwap = ta.vwap(src)
plot(hide ? na : vwap, color=color.purple, title="VWAP", style = plot.style_line)
annotatePlots('VWAP', vwap, hide)

// Bollinger Band of present time frame
[BBbasis, BBupper, BBlower] = ta.bb(src, BBlength, BBmult)
p1 = plot(hide ? na : BBupper, color=color.blue,title="Bollinger Bands Upper Line")
p2 = plot(hide ? na : BBlower, color=color.blue,title="Bollinger Bands Lower Line")
p3 = plot(hide ? na : BBbasis, color=color.maroon,title="Bollinger Bands Width", style=plot.style_circles, linewidth = 1)
annotatePlots('BB-Upper', BBupper, hide)
annotatePlots('BB-Lower', BBlower, hide)
annotatePlots('BB-Base(20-SMA)', BBbasis, hide)

// RSI
rsi = ta.rsi(src, rsiLenght)

// Trend following
ema50 = ta.ema(src, slowMovingAvg)
ema21 = ta.ema(src, fastMovingAvg)
annotatePlots('21-EMA', ema21, hide)
annotatePlots('50-EMA', ema50, hide)


// Trend conditions
upTrend = ema21 > ema50 
downTrend = ema21 < ema50


// Condition to check Special Entry: HH_LL
// Long side:
hhLLong = barstate.isconfirmed and (low > low[1]) and (high > high[1]) and (close > high[1])
hhLLShort = barstate.isconfirmed and (low < low[1]) and (high < high[1]) and (close < low[1])

longCond =  barstate.isconfirmed and (high[1] < BBlower[1]) and (close > BBlower) and (close < BBupper) and hhLLong and ta.crossover(rsi, oversold) and downTrend
shortCond = barstate.isconfirmed and (low[1] > BBupper[1]) and (close < BBupper) and (close > BBlower) and hhLLShort and ta.crossunder(rsi, overbought) and upTrend

// Trade execute
h = hour(time('1'), syminfo.timezone)
m = minute(time('1'), syminfo.timezone)
hourVal = h * 100 + m
totalTrades = strategy.opentrades + strategy.closedtrades
if (mktAlwaysOn or (hourVal < endOfDay))
    // Entry
    var float sl = na
    var float target = na
    if (longCond)
        strategy.entry("enter long", strategy.long, 1, limit=na, stop=na, comment="Long[E]")
        sl := low[1]
        target := high >= BBbasis ? BBupper : BBbasis
        alert('Buy:' + syminfo.ticker + ' ,SL:' + str.tostring(math.floor(sl)) + ', Target:' + str.tostring(target), alert.freq_once_per_bar)
    if (shortCond)
        strategy.entry("enter short", strategy.short, 1, limit=na, stop=na, comment="Short[E]")
        sl := high[1]
        target := low <= BBbasis ? BBlower : BBbasis
        alert('Sell:' + syminfo.ticker + ' ,SL:' + str.tostring(math.floor(sl)) + ', Target:' + str.tostring(target), alert.freq_once_per_bar)

    // Exit: target or SL
    if ((close >= target) or (close <= sl))
        strategy.close("enter long", comment=close < sl ? "Long[SL]" : "Long[T]")
    if ((close <= target) or (close >= sl))
        strategy.close("enter short", comment=close > sl ? "Short[SL]" : "Short[T]")
else if (not mktAlwaysOn)
    // Close all open position at the end if Day
    strategy.close_all(comment = "EoD[Exit]", alert_message = "EoD Exit", immediately = true)


Más.