ESTRATEGIA - 01

Descripcion de la Estrategia

🔍 Indicadores utilizados

Bandas de Bollinger (BB)

Período configurable (period = 20 por defecto).

Desviación estándar ajustable (devs = 1).

Se usa el Bollinger Band Ratio (BBR) para normalizar el precio dentro de las bandas:
BBR=Precio−BandaInferiorBandaSuperior−BandaInferiorBBR = \frac{Precio - BandaInferior}{BandaSuperior - BandaInferior}BBR=BandaSuperior−BandaInferiorPrecio−BandaInferior​

Umbrales:

BBupLevel = 1 (sobre banda superior).

BBdnLevel = 0 (debajo de la banda inferior).

RSI (Relative Strength Index)

Período principal = 7 (rápido).

Niveles fijos:

RSIupLevel = 70 (sobrecompra).
RSIdnLevel = 30 (sobreventa).

CCI (Commodity Channel Index)

Período = 20.

Niveles fijos:

CCIupLevel = +100 (fuerza alcista).

CCIdnLevel = -100 (fuerza bajista).

Medias móviles exponenciales (EMA)

MAfast = 9

MAslow = 21

Se usan para filtrar tendencia (compara precio con la EMA rápida).


🎯 Condiciones de entrada

Compra (BUY – pu):

CCI > +100

RSI > 70

BBR > 1 (precio por encima de la banda superior).

La vela previa está encima de la EMA rápida (9) (open[1] > short[1] y close[1] > short[1]).

Venta (SELL – pd):

CCI < -100

RSI < 30

BBR < 0 (precio por debajo de la banda inferior).

La vela previa está debajo de la EMA rápida (9) (open[1] < short[1] y close[1] < short[1]).


📊 Interpretación

Estrategia de extremos de mercado: combina tres indicadores (CCI, RSI y Bollinger) para detectar condiciones de sobrecompra/sobreventa extremas.

El filtro de EMA evita entrar contra la tendencia inmediata.

Genera señales discretas (plot_shape) de BUY (triángulo verde) y SELL (triángulo rojo).


✅ Fortalezas

Confluencia de indicadores: no se basa en uno solo, sino en CCI + RSI + BB + tendencia.

Filtro de EMA: evita señales falsas en rangos.

Simplicidad: condiciones claras y fáciles de adaptar a un bot.


⚠️ Debilidades / Riesgos

Condiciones muy estrictas → pocas señales (baja frecuencia).

Riesgo de entrar en sobrecompra/sobreventa y que siga la tendencia (no siempre hay reversión).

No incluye gestión de riesgo ni confirmaciones adicionales (ej. velas japonesas, volumen).

Puede funcionar mejor en timeframes altos (ej. M15, H1) que en M1/M5, donde el ruido es mayor.


💡 Posibles mejoras

Gestión de riesgo integrada: stop loss dinámico o martingale controlado.

Filtro horario: evitar sesiones con baja liquidez.

Confirmación adicional: esperar una vela de reversión (ej. martillo, engulfing) tras el extremo.

Optimización de parámetros: probar períodos más largos para RSI/CCI en backtests.

Uso de BBR más flexible: en vez de exigir >1 o <0, usar umbrales como 0.8 / 0.2 para capturar señales más realistas.


👉 En resumen:
Este script es un sistema de reversión en extremos, apoyado en CCI, RSI, Bollinger y EMA, que busca detectar puntos de agotamiento en tendencia. Es muy bueno como base de estrategia, pero necesita refinamiento en gestión de riesgo y confirmaciones para volverse más consistente en real.


🔍 SCRIPT PARA UTILIZARLO DIRECTAMENTE EN IQOPTION



instrument { name = "BO indicator", overlay = true, icon = "indicators:BB" } period = input (20, "front.period", input.integer, 1) devs = input (1, "front.newind.stddev", input.integer, 1) overbought = input (1, "front.overbought", input.double, -2, 2, 0.1, false) oversold = input (0, "front.oversold", input.double, -2, 2, 0.1, false) source = input (1, "front.ind.source", input.string_selection, inputs.titles) fn = input (1, "front.newind.average", input.string_selection, averages.titles) input_group { "RSI", period1 = input (7, "front.period", input.integer, 1), source1 = input (1, "front.ind.source", input.string_selection, inputs.titles), fn1 = input (averages.ssma, "front.newind.average", input.string_selection, averages.titles), color = input { default = "#B42EFF", type = input.color }, width = input { default = 1, type = input.line_width} } local sourceSeries = inputs [source] local averageFunction = averages [fn] local sourceSeries1 = inputs [source1] local averageFunction1 = averages [fn1] CCIupLevel= 100 CCIdnLevel=-100 BBupLevel=1 BBdnLevel=0 RSIupLevel=70 RSIdnLevel=30 middle = averageFunction (sourceSeries, period) scaled_dev = devs * stdev (sourceSeries, period) top = middle + scaled_dev bottom = middle - scaled_dev bbr = (sourceSeries - bottom) / (top - bottom) delta = sourceSeries1 - sourceSeries1 [1] up1 = averageFunction (max (delta, 0), period) down1 = averageFunction (max (-delta, 0), period) rs = up1 / down1 rsi = 100 - 100 / (1 + rs) src = close len = 7 RSIupLevel=70 RSIdnLevel=30 up = rma(max(change(src), 0), len) down = rma(-min(change(src), 0), len) rsi1 = iff(down == 0 , 100 , iff( up == 0 , 0 , 100 - (100 / (1 + up / down)))) --rsi = (down == 0 , 100 ,iff( up == 0 , 0 ,iff( 100 - (100 / (1 + up / down))))) MAfast=9 MAslow=21 short = ema(close, MAfast) long = ema(close, MAslow) period_cci = 20 nom = hlc3 - sma (hlc3, period_cci) denom = mad (hlc3, period_cci) * 0.015 cci = nom / denom pu= (cci>CCIupLevel) and (rsi>RSIupLevel ) and (bbr>BBupLevel) and (open[1] > short[1] and close[1]>short[1]) pd= (cci<CCIdnLevel) and (rsi < RSIdnLevel) and (bbr < BBdnLevel) and (open[1]< short[1] and close[1]<short[1]) plot_shape(pd, "short", shape_style.triangledown, shape_size.large, 'red', shape_location.abovebar,0,'SELL', 'red') plot_shape(pu, "long", shape_style.triangleup, shape_size.large, 'green', shape_location.belowbar,0,'BUY', 'green') print(pu)

🔍 SCRIPT PARA UTILIZARLO EN SU BOT CON PYTHON


import pandas as pd # ==== INDICADORES ==== def ema(series, period): return series.ewm(span=period, adjust=False).mean() def sma(series, period): return series.rolling(window=period).mean() def rsi(series, period=7): delta = series.diff() gain = (delta.where(delta > 0, 0)).rolling(window=period).mean() loss = (-delta.where(delta < 0, 0)).rolling(window=period).mean() rs = gain / loss return 100 - (100 / (1 + rs)) def cci(df, period=20): tp = (df['high'] + df['low'] + df['close']) / 3 sma_tp = tp.rolling(window=period).mean() mad = (tp - sma_tp).abs().rolling(window=period).mean() return (tp - sma_tp) / (0.015 * mad) def bollinger_bands(series, period=20, dev=1): middle = sma(series, period) std = series.rolling(window=period).std() upper = middle + dev * std lower = middle - dev * std bbr = (series - lower) / (upper - lower) return upper, lower, bbr # ==== ESTRATEGIA ==== def generar_senal(df): df['EMA9'] = ema(df['close'], 9) df['EMA21'] = ema(df['close'], 21) df['RSI'] = rsi(df['close'], 7) df['CCI'] = cci(df, 20) _, _, df['BBR'] = bollinger_bands(df['close'], 20, 1) # Condición BUY df['BUY'] = ( (df['CCI'] > 100) & (df['RSI'] > 70) & (df['BBR'] > 1) & (df['open'].shift(1) > df['EMA9'].shift(1)) & (df['close'].shift(1) > df['EMA9'].shift(1)) ) # Condición SELL df['SELL'] = ( (df['CCI'] < -100) & (df['RSI'] < 30) & (df['BBR'] < 0) & (df['open'].shift(1) < df['EMA9'].shift(1)) & (df['close'].shift(1) < df['EMA9'].shift(1)) ) return df