Esta estratégia baseia-se no indicador do Commodity Channel Index (CCI), com o objetivo de ficar longo em condições de sobrevenda e ficar curto em condições de sobrecompra. Ele também opcionalmente usa um filtro de média móvel exponencial (EMA) para negociar apenas na direção da tendência. A estratégia também fornece stop loss e take profit baseados em porcentagem fixa ou faixa verdadeira média (ATR).
Utilização do indicador CCI para determinar a tendência do mercado
O CCI calcula a dinâmica comparando o preço atual com o preço médio durante um período.
CCI acima de 150 é sobrecomprado, abaixo de -100 é sobrevendido
Opcionalmente utilizar filtro EMA
Apenas vá longo quando o preço estiver acima da EMA e curto quando estiver abaixo da EMA
Usar a EMA para determinar a direcção da tendência, evitar negociações contrárias à tendência
Fornecer dois tipos de stop loss e take profit
Preço de saída para a operação
Stop loss e take profit baseados em ATR: utilizar o multiplicador ATR para stop loss, calcular o take profit com base no rácio de risco/recompensa
Condições de entrada
Caso o CCI ultrapasse -100
Caso o CCI passe abaixo de 150
Se a EMA estiver habilitada, inserir apenas quando o preço estiver no lado direito da EMA
Condições de saída
Posições fechadas quando for atingido um stop loss ou um take profit
A Comissão considera que a medida de auxílio é seletiva e não prejudicial.
Planejamento
Utilize CCI sobrecomprado/sobrevendido para a entrada, um uso clássico de CCI
A EMA opcional assegura a negociação com a tendência, evitando reversões
Fornecer dois tipos de stop loss/take profit para flexibilidade
O encerramento do sinal da CCI torna-se uma garantia de lucro de reversão
O gráfico destaca claramente os sinais da CCI
Lógica simples e clara, fácil de compreender e otimizar
A CCI tem um efeito retardado, pode não reverter ou dar sinais falsos
Os parâmetros EMA errados podem perder as tendências ou tornar a estratégia ineficaz
Percentagem fixa de stop loss/take profit menos adaptável às alterações do mercado
O ATR stop loss/take profit sensível ao período ATR deve otimizar
Risco de retirada maior, deve ser ajustado o tamanho da posição
O desempenho varia de acordo com as condições do mercado, reavaliar os parâmetros
Avaliação dos períodos de CCI para encontrar combinações ideais de parâmetros
Teste diferentes períodos de EMA para melhor estimativa da tendência
Ajustar a taxa de stop loss/take profit para obter a melhor relação de risco/recompensa
Adicione outros filtros como o volume para evitar ainda mais sinais falsos
Combinar com linhas de tendência/padrões gráficos para confirmação de padrões
Adicionar regras de dimensionamento de posição como tamanho fixo para controlar o drawdown
Testes de retrocesso em diferentes condições de mercado, ajustamento dinâmico
A estratégia utiliza os princípios clássicos de sobrecompra / sobrevenda do CCI para a entrada. O filtro EMA controla a negociação de tendência. Dois tipos de stop loss / take profit fornecidos para flexibilidade. O traçado destaca sinais claramente. Lógica simples e clara, fácil de entender e otimizar.
/*backtest start: 2023-09-24 00:00:00 end: 2023-10-24 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © alifer123 //@version=5 // strategy("CCI+EMA Strategy with Percentage or ATR TP/SL [Alifer]", shorttitle = "CCI_EMA_%/ATR_TP/SL", overlay=false, // initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=10, commission_type=strategy.commission.percent, commission_value=0.045) length = input(14, "CCI Length") overbought = input.int(150, step = 10, title = "Overbought") oversold = input.int(-140, step = 10, title = "Oversold") src = hlc3 ma = ta.sma(src, length) cci = (src - ma) / (0.015 * ta.dev(src, length)) // EMA useEMA = input(true, "Use EMA", tooltip = "Only enters long when price is above the EMA, only enters short when price is below the EMA") emaLength = input(55, "EMA Length") var float ema = na if useEMA ema := ta.ema(src, emaLength) // Take Profit and Stop Loss Method tpSlMethod_percentage = input(true, "Percentage TP/SL", group="TP/SL Method") tpSlMethod_atr = input(false, "ATR TP/SL", group="TP/SL Method") // Percentage-based Take Profit and Stop Loss tp_percentage = input.float(10.0, title="Take Profit (%)", step=0.1, group="TP/SL Method") sl_percentage = input.float(10.0, title="Stop Loss (%)", step=0.1, group="TP/SL Method") // ATR-based Take Profit and Stop Loss atrLength = input(20, title="ATR Length", group="TP/SL Method") atrMultiplier = input(4, title="ATR SL Multiplier", group="TP/SL Method") riskRewardRatio = input(2, title="Risk Reward Ratio", group="TP/SL Method") // Calculate TP/SL levels based on the selected method, or leave them undefined if neither method is selected longTP = tpSlMethod_percentage ? strategy.position_avg_price * (1 + tp_percentage / 100) : na longSL = tpSlMethod_percentage ? strategy.position_avg_price * (1 - sl_percentage / 100) : na shortTP = tpSlMethod_percentage ? strategy.position_avg_price * (1 - tp_percentage / 100) : na shortSL = tpSlMethod_percentage ? strategy.position_avg_price * (1 + sl_percentage / 100) : na if tpSlMethod_atr longSL := strategy.position_avg_price - ta.atr(atrLength) * atrMultiplier longTP := ((strategy.position_avg_price - longSL) * riskRewardRatio) + strategy.position_avg_price shortSL := strategy.position_avg_price + ta.atr(atrLength) * atrMultiplier shortTP := ((strategy.position_avg_price - shortSL) * riskRewardRatio) - strategy.position_avg_price // Enter long position when CCI crosses below oversold level and price is above EMA longCondition = ta.crossover(cci, oversold) and (not useEMA or close > ema) if longCondition strategy.entry("Buy", strategy.long) // Enter short position when CCI crosses above overbought level and price is below EMA shortCondition = ta.crossunder(cci, overbought) and (not useEMA or close < ema) if shortCondition strategy.entry("Sell", strategy.short) // Close long positions with Take Profit or Stop Loss if strategy.position_size > 0 strategy.exit("Long Exit", "Buy", limit=longTP, stop=longSL) // Close short positions with Take Profit or Stop Loss if strategy.position_size < 0 strategy.exit("Short Exit", "Sell", limit=shortTP, stop=shortSL) // Close positions when CCI crosses back above oversold level in long positions or below overbought level in short positions if ta.crossover(cci, overbought) strategy.close("Buy") if ta.crossunder(cci, oversold) strategy.close("Sell") // Plotting color_c = cci > overbought ? color.red : (cci < oversold ? color.green : color.white) plot(cci, "CCI", color=color_c) hline(0, "Middle Band", color=color.new(#787B86, 50)) obband = hline(overbought, "OB Band", color=color.new(#78867a, 50)) osband = hline(oversold, "OS Band", color=color.new(#867878, 50)) fill(obband, osband, color=color.new(#787B86, 90))