Estratégia de acompanhamento de tendências com base no indicador estocástico e no indicador CCI


Data de criação: 2023-11-22 16:23:31 última modificação: 2023-11-22 16:23:31
cópia: 1 Cliques: 844
1
focar em
1617
Seguidores

Estratégia de acompanhamento de tendências com base no indicador estocástico e no indicador CCI

Visão geral

A estratégia combina o indicador estocástico com o indicador CCI para identificar a direção da tendência, e usa o indicador de taxa de mudança para filtrar a tendência de choque, permitindo o acompanhamento da tendência. A estratégia usa uma entrada de ruptura e uma saída de parada.

Princípio da estratégia

  1. Indicadores estocásticos para determinar a forma de vazio
    O indicador Stochastic dá um sinal de compra quando o indicador está acima de sua última barra e um sinal de venda quando o indicador está abaixo de sua última barra
  2. Indicadores da CCI para determinar a direção da tendência
    CCI maior do que 0 para o mercado de ativos, menor do que 0 para o mercado de ativos
  3. Rate of Change indica tendência de queda de filtro
    Configurar o parâmetro de Rate of Change para determinar se o preço está em uma tendência ativa
  4. Regras de entrada e saída
    Sinais de compra: Stochastic com a mais recente barra e CCI maior que 0 e a tendência de preço ativa
    Sinais de venda: Stochastic abaixo do último bar e CCI menor que 0 e a tendência de preço ativa
    Stop loss exit: Longo 3% Stop Loss, Curto 3% Stop Loss

Análise de vantagens

  1. A combinação do indicador estocástico com o indicador CCI permite uma maior precisão na direção da tendência
  2. O indicador de taxa de mudança pode ser usado para eliminar a tendência de choque e evitar negociações ineficazes.
  3. Multi-espaço de negociação bidirecional para capturar diferentes tipos de tendências
  4. A partir daí, a tendência é de que os jogadores de futebol de rua se tornem jogadores de futebol de rua.
  5. Estritamente para evitar perdas significativas e controlar eficazmente os riscos

Análise de Riscos

  1. A configuração inadequada dos parâmetros da política pode levar a ser muito conservadora ou radical
  2. Indicadores com funções limitadas e que podem falhar em situações extremas
  3. A entrada de ruptura pode ser um salto no início da tendência, cortando parte dos lucros.
  4. Stop loss pequeno demais pode ser ultrapassado, muito grande pode ser um risco mal controlado

Direção de otimização

  1. Optimização de parâmetros. Melhorar a configuração de parâmetros para encontrar a combinação de parâmetros mais adequada.
  2. Adicionar mais indicadores de tendências de julgamento, melhorando a eficácia da decisão
  3. Paragem ativa: configuração de paragem de rastreamento ou paragem de passo de tempo, reduzindo a probabilidade de paragem ser ultrapassada
  4. Avaliação de risco. Adição de restrições de indicadores de risco, como a retirada máxima, controle total da abertura de risco

Resumir

A estratégia integra Stochastic, CCI e Rate of Change, três grandes indicadores para determinar a direção da tendência, para aproveitar as oportunidades de tendência de forma a romper o rastreamento. A vantagem da estratégia reside na combinação de indicadores para julgar com precisão e filtrar efetivamente o comportamento oscilante, através de um rigoroso controle de risco de perda. O próximo passo pode ser melhorado em termos de otimização de parâmetros, combinação de vários indicadores e estratégias de parada de perda, para tornar a estratégia mais robusta e flexível.

Código-fonte da estratégia
/*backtest
start: 2022-11-15 00:00:00
end: 2023-11-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Stochastic CCI BF 🚀", overlay=false, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.075)

/////////////// Time Frame ///////////////
testStartYear = input(2017, "Backtest Start Year") 
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)

testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)

testPeriod() => true

///////////// CCI ///////////// 
src = close
ccilength = input(13, minval=1, title="CCI Length")
c=cci(src, ccilength)

///////////// Stochastic ///////////// 
len = input(19, minval=1, title="RSI Length")
lenema = input(12, minval=1, title="RSI-EMA Length")
up = rma(max(change(src), 0), len)
down = rma(-min(change(src), 0), len)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))
out = ema(rsi, lenema)

///////////// Rate Of Change ///////////// 
source = close
roclength = input(30, minval=1)
pcntChange = input(7.0, minval=1)
roc = 100 * (source - source[roclength]) / source[roclength]
emaroc = ema(roc, roclength / 2)
isMoving() => emaroc > (pcntChange / 2) or emaroc < (0 - (pcntChange / 2))

/////////////// Strategy ///////////////
long = out > out[1] and isMoving() and c > 0
short = out < out[1] and isMoving() and c < 0

last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

last_open_long_signal = 0.0
last_open_short_signal = 0.0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])

last_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])

in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal

last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])

sl_inp = input(3.0, title='Stop Loss %') / 100 

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) 
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) 

slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na
slShort = strategy.position_avg_price * (1 + sl_inp)
long_sl = in_long_signal ? slLong : na
short_sl = in_short_signal ? slShort : na

/////////////// Execution ///////////////
if testPeriod()
    strategy.entry("L",  strategy.long, when=long_signal)
    strategy.entry("S", strategy.short, when=short_signal)
    strategy.exit("L Ex", "L", stop=long_sl, when=since_longEntry > 0)
    strategy.exit("S Ex", "S", stop=short_sl, when=since_shortEntry > 0)

/////////////// Plotting /////////////// 
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=30)
bgcolor(not isMoving() ? color.white : long ? color.lime : short ? color.red : na, transp=80)
plot(out, color = out > out[1] ? color.lime:color.red, linewidth = 2, title="Stoch")
plot(c, color = c > 0 ? color.lime:color.red, linewidth = 2, title="CCI")