Estratégia de acompanhamento do ímpeto da CCI

Autora:ChaoZhang, Data: 2023-10-25 17:37:39
Tags:

img

Resumo

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).

Estratégia lógica

  1. 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

  2. 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

  3. 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

  4. 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

  5. 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.

  6. Planejamento

    • Indicador do gráfico CCI, regiões de códigos de cores

Análise das vantagens

  1. Utilize CCI sobrecomprado/sobrevendido para a entrada, um uso clássico de CCI

  2. A EMA opcional assegura a negociação com a tendência, evitando reversões

  3. Fornecer dois tipos de stop loss/take profit para flexibilidade

  4. O encerramento do sinal da CCI torna-se uma garantia de lucro de reversão

  5. O gráfico destaca claramente os sinais da CCI

  6. Lógica simples e clara, fácil de compreender e otimizar

Análise de riscos

  1. A CCI tem um efeito retardado, pode não reverter ou dar sinais falsos

  2. Os parâmetros EMA errados podem perder as tendências ou tornar a estratégia ineficaz

  3. Percentagem fixa de stop loss/take profit menos adaptável às alterações do mercado

  4. O ATR stop loss/take profit sensível ao período ATR deve otimizar

  5. Risco de retirada maior, deve ser ajustado o tamanho da posição

  6. O desempenho varia de acordo com as condições do mercado, reavaliar os parâmetros

Orientações de otimização

  1. Avaliação dos períodos de CCI para encontrar combinações ideais de parâmetros

  2. Teste diferentes períodos de EMA para melhor estimativa da tendência

  3. Ajustar a taxa de stop loss/take profit para obter a melhor relação de risco/recompensa

  4. Adicione outros filtros como o volume para evitar ainda mais sinais falsos

  5. Combinar com linhas de tendência/padrões gráficos para confirmação de padrões

  6. Adicionar regras de dimensionamento de posição como tamanho fixo para controlar o drawdown

  7. Testes de retrocesso em diferentes condições de mercado, ajustamento dinâmico

Resumo

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))


Mais.