Estrategia cuantitativa basada en los canales de Keltner y el indicador CCI

El autor:¿ Qué pasa?, Fecha: 2024-02-27 15:47:20
Las etiquetas:

img

Resumen general

Esta estrategia combina los canales de Keltner, el indicador CCI y el indicador RSI con las condiciones del volumen de negociación para crear una estrategia de negociación cuantitativa de filtración de tendencias relativamente completa. Genera señales de compra y venta cuando los precios rompen áreas clave, los indicadores dan señales de negociación y aparecen grandes volúmenes de negociación. Al mismo tiempo, se utilizan promedios móviles para el juicio de tendencias para evitar el comercio sin una tendencia clara.

Estrategia lógica

La estrategia toma decisiones comerciales basadas principalmente en los siguientes indicadores y condiciones:

  1. Canales de Keltner: Calcular bandas superiores e inferiores basadas en el precio típico y ATR durante un período para determinar si el precio está dentro del canal.

  2. Indicador CCI: se utiliza para determinar si el precio está sobrecomprado o sobrevendido.

  3. Indicador RSI: Ayuda a juzgar los niveles de sobrecompra/sobreventa.

  4. Volumen de negociación: requiere una ruptura de cierto valor promedio móvil.

  5. Filtro de tendencia con MAs: utilizar SMA, EMA, etc. para determinar la dirección general de la tendencia.

Cuando se cumple la condición de dirección de tendencia, se generan señales de compra y venta cuando el precio rompe las bandas del canal Keltner, el CCI y el RSI dan señales y el volumen de operaciones aumenta.

Ventajas

La estrategia combina múltiples indicadores y condiciones para filtrar las señales inciertas y tomar decisiones más fiables:

  1. El filtro de tendencias evita mercados volátiles poco claros.

  2. Los canales de Keltner identifican los niveles clave de fuga.

  3. Las señales CCI y RSI son relativamente precisas.

  4. El aumento de volumen ayuda a prevenir algunas fallas.

Los riesgos

Principales riesgos:

  1. Un juicio de tendencia incorrecto puede pasar por alto tendencias más fuertes.

  2. Los parámetros del indicador incorrectos pueden causar señales perdidas o falsas.

  3. La ampliación de volumen ineficaz deja ciertos riesgos de fuga falsa. Prueba diferentes multiplicadores.

Direcciones de optimización

Direcciones de optimización potenciales:

  1. Prueba diferentes tipos y longitudes de MA para obtener un mejor filtro de tendencia.

  2. Optimizar los parámetros de los canales de Keltner, CCI, RSI para señales más precisas.

  3. Prueba diferentes multiplicadores de volumen para encontrar el nivel óptimo.

  4. Considere la posibilidad de agregar un stop loss para limitar la pérdida máxima por operación.

Conclusión

En general, esta estrategia combina los canales de Keltner, el CCI, los indicadores RSI y las condiciones de volumen de negociación para crear una estrategia de negociación cuantitativa de filtrado de tendencias relativamente completa. Tiene ventajas como evitar mercados volátiles poco claros, identificar breakouts clave, obtener señales de sobrecompra / sobreventa relativamente precisas y prevenir algunos breakouts falsos. Existen riesgos en aspectos como ajustes de parámetros inadecuados y aumento de volumen ineficaz. Se pueden hacer optimizaciones adicionales en el método de filtrado de tendencias, parámetros de indicadores, multiplicador de volumen y añadir mecanismos de stop loss.


/*backtest
start: 2024-01-27 00:00:00
end: 2024-02-26 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Custom Keltner CCI Strategy with Trend Filter", overlay=true )
// Input Parameters for allowing long and short trades
allowLong = input(true, title="Allow Long Trades")
allowShort = input(true, title="Allow Short Trades")
// Trend Filter Inputs
maType = input(title="MA Type", options=["OFF", "SMA", "EMA", "SMMA", "CMA", "TMA"], defval="OFF")
trendFilterMethod = input(title="Trend Filter Method", options=["OFF", "Normal", "Reversed"], defval="OFF")
maLength = input(14, title="MA Length")
// Other Input Parameters
lengthKC = input(30, title="Keltner Channels Length")
multKC = input(0.7, title="Keltner Channels Multiplier")
lengthCCI = input(5, title="CCI Length")
overboughtCCI = input(75, title="CCI Overbought Level")
oversoldCCI = input(-75, title="CCI Oversold Level")
rsiPeriod = input(30, title="RSI Period")
rsiOverbought = input(60, title="RSI Overbought Level")
rsiOversold = input(60, title="RSI Oversold Level")
volumeMultiplier = input(0, title="Volume Multiplier", type=input.float, step=0.1, minval=0)
// Define Moving Averages
var float maValue = na
if (maType == "SMA")
    maValue := sma(close, maLength)
else if (maType == "EMA")
    maValue := ema(close, maLength)
else if (maType == "SMMA")
    maValue := na(maValue[1]) ? sma(close, maLength) : (maValue[1] * (maLength - 1) + close) / maLength
else if (maType == "CMA")
    maValue := na(maValue[1]) ? sma(close, maLength) : (sma(close, maLength) + (sma(close, maLength) - maValue[1])) / 2
else if (maType == "TMA")
    maValue := sma(sma(close, round(maLength/2)), round(maLength/2)+1)
// Entry Conditions with Trend Filter
longCondition = allowLong and (trendFilterMethod == "OFF" or (trendFilterMethod == "Normal" and close > maValue) or (trendFilterMethod == "Reversed" and close < maValue))
shortCondition = allowShort and (trendFilterMethod == "OFF" or (trendFilterMethod == "Normal" and close < maValue) or (trendFilterMethod == "Reversed" and close > maValue))
// Keltner Channels
typicalPrice = hlc3
middleLine = sma(typicalPrice, lengthKC)
range = multKC * atr(lengthKC)
upperChannel = middleLine + range
lowerChannel = middleLine - range
// CCI
cci = cci(close, lengthCCI)
// RSI
rsi = rsi(close, rsiPeriod)
// Volume
volCondition = volume > sma(volume, 50) * volumeMultiplier
// Combined Entry Conditions with Trend Filter
longCondition := longCondition and cci < oversoldCCI and low < lowerChannel and rsi < rsiOversold and volCondition
shortCondition := shortCondition and cci > overboughtCCI and high > upperChannel and rsi > rsiOverbought and volCondition
// Execute orders at the open of the new bar after conditions are met
if (longCondition)
    strategy.entry("Long", strategy.long)
if (shortCondition)
    strategy.entry("Short", strategy.short)
// Exit Conditions
strategy.close("Long", when = cci > 0)
strategy.close("Short", when = cci < 0)
// Plotting
plot(upperChannel, color=color.red, linewidth=1)
plot(lowerChannel, color=color.green, linewidth=1)
hline(overboughtCCI, "Overbought", color=color.red)
hline(oversoldCCI, "Oversold", color=color.green)

Más.