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.
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.
Métodos como la optimización de parámetros, el ajuste del rango de stop loss, etc. pueden ayudar a reducir los riesgos.
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)