Tendencia siguiendo una estrategia basada en el estocástico y el CCI

El autor:¿ Qué pasa?, Fecha: 2023-11-22 16:23:31
Las etiquetas:

img

Resumen general

Esta estrategia combina el indicador estocástico y el indicador CCI para identificar la dirección de la tendencia, y utiliza el indicador de tasa de cambio para filtrar las tendencias de rango, con el fin de seguir la tendencia.

Estrategia lógica

  1. El indicador estocástico juzga el patrón alcista/bajista
    La cruz de oro del estocástico es señal de compra, mientras que la cruz de la muerte es señal de venta
  2. El indicador CCI determina la dirección de la tendencia El CCI por encima de 0 indica mercado alcista, mientras que por debajo de 0 mercado bajista
  3. El indicador de tasa de cambio filtra la tendencia en el rango
    Establecer parámetros de la tasa de cambio para juzgar si el precio está en una tendencia activa
  4. Reglas de entrada y salida Entrada larga: cruce de oro estocástico y CCI > 0 y tendencia activa Entrada corta: Cruce de la muerte estocástica y CCI < 0 y tendencia activa Exención de pérdidas de parada: 3% de pérdidas de parada tanto para el lado largo como para el lado corto

Análisis de ventajas

  1. La combinación de la estadística estocástica y el CCI mejora la precisión del juicio sobre la tendencia
  2. La tasa de cambio filtra las tendencias dentro del rango, evitando operaciones no válidas
  3. Tanto el comercio largo como el corto, capaz de captar diferentes tipos de tendencias
  4. La entrada de la ruptura oportuna atrapa la oportunidad de tendencia
  5. El stop loss estricto evita pérdidas enormes y controla el riesgo

Análisis de riesgos

  1. La configuración incorrecta de los parámetros puede llevar a una estrategia demasiado conservadora o agresiva
  2. Efecto limitado de los indicadores, puede fallar en condiciones extremas de mercado
  3. La entrada de la breakout pierde la primera etapa de las tendencias, renunciando a parte de los beneficios
  4. Si el control de riesgos no es adecuado

Direcciones de optimización

  1. Optimización de parámetros para encontrar la combinación óptima
  2. Añadir más indicadores de tendencia para mejorar la eficacia
  3. Utilice la pérdida de detención posterior o la pérdida de detención basada en el tiempo para reducir la posibilidad de que se rompa la pérdida de detención
  4. Añadir métricas de riesgo como la extracción máxima para controlar completamente el riesgo

Resumen de las actividades

Esta estrategia juzga la dirección de la tendencia mediante la integración de los indicadores estocásticos, CCI y de la tasa de cambio, y captura la oportunidad de tendencia con el seguimiento de la ruptura. Sus ventajas se encuentran en un juicio preciso empoderado por la combinación de indicadores, el filtrado del mercado limitado por el rango y un estricto stop loss para controlar el riesgo. El siguiente paso es mejorar aún más la estrategia a través de la optimización de parámetros, múltiples indicadores, estrategia de stop loss para hacerlo más robusta y flexible.


/*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")

Más.