Estrategia de cruce del índice corporal relativo

El autor:¿ Qué pasa?, Fecha: 2023-10-18 11:16:53
Las etiquetas:

img

Resumen general

Esta estrategia utiliza principalmente las señales de cruce de promedio móvil de la relación de cuerpo relativo (RB) de las velas diarias para determinar la tendencia, junto con stop loss y take profit para el comercio automatizado.

Estrategia lógica

La estrategia se basa en el indicador RBI de Vitelot, que calcula el promedio móvil de la relación relativa del cuerpo (RB) de los candelabros diarios.

La fórmula calcula la relación entre el cuerpo real y la longitud completa del candelabro para las velas alcistas, tomando valores positivos; y valores negativos para las velas bajistas.

El indicador RBI utiliza la media móvil de RB para filtrar el ruido y capturar la esencia de las tendencias del mercado.

Para evitar señales falsas durante las fases alcistas inciertas, la estrategia también comprueba si el precio de cierre está por encima de la EMA de 13 períodos antes de generar una señal de compra verdadera para la posición larga.

La estrategia también implementa stop loss y take profit para controlar los riesgos y bloquear las ganancias.

Análisis de ventajas

  • El RBI filtra el ruido significativo y captura las características de la tendencia del mercado, evitando señales falsas de mercados variados.

  • El uso de un filtro de promedio móvil evita señales falsas de manera efectiva durante las fases alcistas inciertas, reduciendo las pérdidas por cortes.

  • El stop loss y el take profit ayudan a reducir el riesgo de pérdidas en posiciones individuales y a fijar las ganancias, mejorando la rentabilidad general.

  • La estrategia tiene pocos parámetros y es fácil de entender, adecuada para el comercio automatizado.

Análisis de riesgos

  • La estrategia se basa únicamente en el RBI, cualquier señal errónea del indicador podría conducir al fracaso.

  • El mal ajuste de los parámetros del indicador también podría empeorar la calidad de las señales comerciales.

  • Ningún indicador técnico puede evitar completamente las pérdidas en determinadas condiciones de mercado.

  • Si el valor de las pérdidas de detención es demasiado ajustado, puede dar lugar a detenciones demasiado frecuentes; si es demasiado amplio, puede dar lugar a grandes pérdidas en posiciones individuales.

  • El control insuficiente de la extracción podría dar lugar a riesgos de borrado de la cuenta.

Direcciones de optimización

  • Se pueden probar diferentes combinaciones de parámetros para optimizar los parámetros del RBI.

  • Se podrían añadir indicadores adicionales para el filtrado de señales y la mejora de la calidad.

  • El aprendizaje automático se puede utilizar para entrenar y optimizar los parámetros de stop loss y take profit.

  • Se pueden añadir estrategias de gestión de riesgos para controlar el tamaño general de las posiciones y la exposición al riesgo.

  • Se podrían explorar diferentes períodos de tenencia, como las tenencias a un día o el scalping a corto plazo.

Conclusión

En general, esta es una estrategia de seguimiento de tendencias relativamente simple y directa. Utiliza el cruce de RBI para determinar la dirección de la tendencia, con filtros adicionales y stop loss / take profit para controlar los riesgos, evitando efectivamente señales falsas de mercados variados. Pero ningún indicador técnico puede evitar completamente los riesgos.


/*backtest
start: 2022-10-11 00:00:00
end: 2023-10-17 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("RBI Backtest /w TSSL", shorttitle="RBI Strategy", overlay=false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, initial_capital = 10000, slippage = 5)
// RBI:
//  The EMA of the relative body (RB) of Japanese candles is evaluated.
//  The RB of a candle (my definition) is simply the ratio of the body with respect to its full length
//  and taken positive for bull candles and negative for bear candles:
//      e.g. a bull "marubozo" has RB=1 a bear "marubozo" has RB=-1;
//      a "doji" has RB=0.
//  This simple indicator grasps the essence of the market by filtering out a great deal of noise.
//
//  A flag can be selected to calculate its very basic binary version, where a bull candle counts as a one
//  and a bear candle counts as a minus one.
//
//  Enter (or exit) the market when the signal line crosses the base line.
//  When the market is choppy we have a kind of alternating bear and bull candles so that
//  RBI is FLAT and usually close to zero. 
//  Therefore avoid entering the market when RBI is FLAT and INSIDE the Exclusion level.
//  The exclusion level is to be set by hand: go back in history and check when market was choppy; a good
//  way to set it is to frame the oscillations of RBI whe price was choppy.
//
//  RBI is more effective when an EMA of price is used as filtering. I found EMA(13) to be
//  a decent filter: go long when base crosses signal upwards AND closing price is above EMA(13);
//  same concept for going short.
//
//  As any other indicator, use it with responsibility: THERE CAN'T BE A SINGLE MAGIC INDICATOR winning
//  all trades.
//
//  Above all, have fun.
//
// Vitelot/Yanez/Vts March 31, 2019

par1 = input(5, title="MA1 Period")
par2 = input(5, title="Signal Period")
exclusion = input(0.2, title="Exclusion level")

useBin = input(false, title="Calculate the binary version")

treshold_long = input(0, title="Treshold Long")
treshold_short = input(0, title="Treshold Short")

fixedSL = input(title="SL Activation", defval=300)
trailSL = input(title="SL Trigger", defval=1)
fixedTP = input(title="TP Activation", defval=120)
trailTP = input(title="TP Trigger", defval=1)

FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2019, title = "From Year", minval = 2017)
ToMonth   = input(defval = 6, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 19, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 2020, title = "To Year", minval = 2017)
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
startTimeOk()  => true // create function "within window of time" if statement true

ynSimple(t) =>
    s = (close>open)? 1: -1
    ema(sum(s,t),t)

ynRel(t) =>
    s = (close-open)/(high-low)
    ema(sum(s,t),t)

yn = useBin? ynSimple(par1): ynRel(par1) 
sig = ema(yn,par2)


plot(yn, color=aqua, title="RBI", linewidth=3, transp=0)
plot(sig, color=orange, title="Signal", linewidth=2, transp=0)

hline(0, color=white, title="Zero level", editable=false)
hline(exclusion, color=yellow, title="Exclusion level +", editable=true, linestyle=line)
hline( 0-exclusion, color=yellow, title="Exclusion level -", editable=true, linestyle=line)

long = crossover(yn,sig) and yn < treshold_long
short = crossover(sig,yn)  and yn > treshold_short

// === STRATEGY - LONG POSITION EXECUTION ===
strategy.entry("Long", strategy.long, when= long and startTimeOk())
strategy.exit("Exit", qty_percent = 100, loss=fixedSL, trail_offset=trailTP, trail_points=fixedTP) 
strategy.exit("Exit", when= short)
// === STRATEGY - SHORT POSITION EXECUTION ===
strategy.entry("Short", strategy.short, when= short and startTimeOk())
strategy.exit("Exit", qty_percent = 100, loss=fixedSL, trail_offset=trailTP, trail_points=fixedTP)
strategy.exit("Exit", when= long)


Más.