Esta estratégia utiliza os pontos pivô do indicador CCI para calcular níveis dinâmicos de suporte e resistência e combina o julgamento da tendência para encontrar sinais de compra e venda.
O indicador CCI pode mostrar se o mercado é muito fraco ou muito forte. Os dois extremos de 80 e -80 podem ser usados para determinar se o mercado entrou em um estado de sobrecompra ou sobrevenda. Esta estratégia utiliza essa característica do CCI. Calculando os pontos de pivô das 50 barras esquerda e direita, os pontos de pivô superior e inferior são obtidos. Em seguida, as linhas de suporte e resistência são construídas dinamicamente adicionando ou subtraindo um buffer com base nos pontos de pivô.
Um sinal de compra é gerado quando o fechamento é superior ao aberto e inferior ao nível de suporte superior. Um sinal de venda é gerado quando o fechamento é inferior ao aberto e superior ao nível de resistência inferior. A fim de filtrar os sinais de negociação contra a direção da tendência principal, a estratégia também combina EMA e indicadores de inclinação para determinar a direção da tendência principal atual.
A taxa de stop loss e a taxa de take profit são calculadas dinamicamente com base no indicador ATR, tornando o controlo do risco desta estratégia mais razoável.
Métodos como otimização de parâmetros, ajuste do intervalo de stop loss, etc. podem ajudar a reduzir os riscos.
Esta estratégia integra a capacidade de seleção longa / curta do CCI e a confirmação do filtro a partir do julgamento da tendência, possuindo certo valor prático.
/*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)