Estrategia dinámica de apoyo y resistencia de las CCI

El autor:¿ Qué pasa?, Fecha: 2024-01-22 16:37:46
Las etiquetas:

img

Resumen general

Esta estrategia utiliza los puntos de pivote del indicador CCI para calcular los niveles dinámicos de soporte y resistencia, y combina el juicio de tendencia para encontrar señales de compra y venta.

Principio de la estrategia

El indicador CCI puede mostrar si el mercado es demasiado débil o demasiado fuerte. Los dos extremos de 80 y -80 se pueden utilizar para determinar si el mercado ha entrado en un estado de sobrecompra o sobreventa. Esta estrategia utiliza esta característica del CCI. Al calcular los puntos de pivote de las 50 barras izquierda y derecha, se obtienen los puntos de pivote superior e inferior. Luego, las líneas de soporte y resistencia se construyen dinámicamente agregando o restando un amortiguador sobre la base de los puntos de pivote.

Una señal de compra se genera cuando el cierre es más alto que el abierto y más bajo que el nivel de soporte superior. Una señal de venta se genera cuando el cierre es más bajo que el abierto y más alto que el nivel de resistencia inferior. Para filtrar las señales comerciales contra la dirección de la tendencia principal, la estrategia también combina EMA e indicadores de pendiente para determinar la dirección de la tendencia principal actual. Las operaciones de entrada larga solo se realizan cuando la tendencia se determina como alcista. Las operaciones de entrada corta solo se realizan cuando la tendencia se determina como bajista.

El stop loss y el take profit se calculan dinámicamente sobre la base del indicador ATR, lo que hace que el control del riesgo de esta estrategia sea más razonable.

Análisis de ventajas

  1. En este sentido, la Comisión considera que el artículo 107, apartado 1, del Tratado constituye una ayuda estatal en su totalidad.
  2. La combinación con el juicio de tendencia evita el comercio contra la tendencia y reduce las pérdidas.
  3. Las configuraciones dinámicas de stop loss y take profit hacen que el control de riesgos sea más sensato.
  4. Los parámetros personalizables, como la longitud del CCI, el tamaño del búfer, etc., se adaptan a un mayor número de entornos de mercado.

Análisis de riesgos

  1. El indicador CCI tiende a generar señales falsas, por lo que necesita el filtro del juicio de tendencia.
  2. Las inversiones no siempre tienen éxito, con cierta probabilidad de riesgo de pérdida.
  3. La configuración incorrecta de los parámetros puede conducir a un exceso de negociación o a oportunidades perdidas.

Métodos como la optimización de parámetros, el ajuste del rango de stop loss, etc. pueden ayudar a reducir los riesgos.

Direcciones de optimización

  1. Optimizar el tamaño del colchón para adaptarse a mercados de diferentes niveles de volatilidad.
  2. Optimizar los parámetros del período ATR para obtener un stop loss dinámico más preciso y obtener beneficios.
  3. Prueba diferentes ajustes de parámetros CCI.
  4. Prueba los efectos de otros tipos de indicadores de juicio de tendencia.

Conclusión

Esta estrategia integra la capacidad de selección larga / corta de CCI y la confirmación del filtro del juicio de tendencia, que posee cierto valor práctico.


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

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © AliSignals


//@version=5
strategy("CCI based support and resistance strategy", overlay=true  )


cci_length = input.int(50, "cci length")
right_pivot = input.int(50, "right pivot")
left_pivot = input.int(50, "left pivot")
buffer = input.float(10.0, "buffer")
trend_matter = input.bool(true, "trend matter?")
showmid = input.bool ( false , "show mid?")
trend_type = input.string("cross","trend type" ,options = ["cross","slope"])
slowma_l = input.int(100, "slow ma length")
fastma_l = input.int(50, "fast ma length")
slope_l = input.int(5,  "slope's length for trend detection")
ksl = input.float(1.1)
ktp = input.float(2.2)
restf = input.timeframe(title="Time Frame of Last Period for Calculating max" , defval="D")



// Calculating Upper and Lower CCI
cci = ta.cci(hlc3,cci_length)

uppercci = 0.0
lowercci = 0.0

uppercci := fixnan(ta.pivothigh(cci, left_pivot, right_pivot)) - buffer
lowercci := fixnan(ta.pivotlow (cci, left_pivot, right_pivot)) + buffer
midccci  = math.avg(uppercci,lowercci)


// Support and Resistance based on CCI
res = uppercci*(0.015*ta.dev(hlc3,cci_length))+ ta.sma(hlc3,cci_length)
sup = lowercci*(0.015*ta.dev(hlc3,cci_length))+ ta.sma(hlc3,cci_length)
mid =  midccci*(0.015*ta.dev(hlc3,cci_length))+ ta.sma(hlc3,cci_length)



// Calculating trend
t_cross  = 0
t_cross := ta.ema(close,fastma_l) > ta.ema(close,slowma_l) ? 1 : ta.ema(close,fastma_l) < ta.ema(close,slowma_l) ? -1 : t_cross[1] 

t_slope  = 0
t_slope := ta.ema(close,slowma_l) > ta.ema(close,slowma_l)[slope_l] ? 1 : ta.ema(close,slowma_l) < ta.ema(close,slowma_l)[slope_l]  ? -1 : t_slope[1] 

t  = 0
t := trend_type == "cross" ? t_cross : trend_type == "slope" ? t_slope : na

colort =  trend_matter == false ? color.rgb(201, 251, 0) : t == 1 ? color.rgb(14, 243, 132) :  t == -1 ? color.rgb(255, 34, 34) : na
bull_t = trend_matter == false or t ==  1
bear_t = trend_matter == false or t == -1

plot(res, color = colort)
plot(sup, color = colort)
plot(showmid == true ? mid : na)


// Long and Short enter condition
buy  = bull_t == 1 and ta.lowest (2) < sup and close > open and close > sup
sell = bear_t == 1 and ta.highest(2) > res and close < open and close < res

plotshape( buy , color=color.rgb(6, 255, 23) , location = location.belowbar, style = shape.triangleup  , size = size.normal)
plotshape( sell, color=color.rgb(234, 4, 4) ,  location = location.abovebar, style = shape.triangledown, size = size.normal)





atr = ta.atr(100)



CLOSE=request.security(syminfo.tickerid, restf, close)
max = 0.0
max := CLOSE == CLOSE[1] ? math.max(max[1], atr) : atr
act_atr = 0.0
act_atr := CLOSE == CLOSE[1] ? act_atr[1] : max[1]

atr1 =  math.max(act_atr, atr) 

dis_sl = atr1 * ksl
dis_tp = atr1 * ktp


var float longsl  = open[1] - dis_sl
var float shortsl = open[1] + dis_sl
var float longtp =   open[1] + dis_tp
var float shorttp =  open[1] - dis_tp


longCondition = buy
if (longCondition)
    strategy.entry("My Long Entry Id", strategy.long)

shortCondition = sell
if (shortCondition)
    strategy.entry("My Short Entry Id", strategy.short)


longsl  := strategy.position_size > 0  ? longsl[1]  : close - dis_sl
shortsl := strategy.position_size < 0 ? shortsl[1] : close + dis_sl
longtp  := strategy.position_size > 0  ? longtp[1]  : close + dis_tp
shorttp := strategy.position_size < 0 ? shorttp[1] : close - dis_tp




if strategy.position_size > 0 
    strategy.exit(id="My Long close Id", from_entry ="My Long Entry Id" , stop=longsl, limit=longtp)
if strategy.position_size < 0 
    strategy.exit(id="My Short close Id", from_entry ="My Short Entry Id" , stop=shortsl, limit=shorttp)



Más.