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.
La estrategia toma decisiones comerciales basadas principalmente en los siguientes indicadores y condiciones:
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.
Indicador CCI: se utiliza para determinar si el precio está sobrecomprado o sobrevendido.
Indicador RSI: Ayuda a juzgar los niveles de sobrecompra/sobreventa.
Volumen de negociación: requiere una ruptura de cierto valor promedio móvil.
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.
La estrategia combina múltiples indicadores y condiciones para filtrar las señales inciertas y tomar decisiones más fiables:
El filtro de tendencias evita mercados volátiles poco claros.
Los canales de Keltner identifican los niveles clave de fuga.
Las señales CCI y RSI son relativamente precisas.
El aumento de volumen ayuda a prevenir algunas fallas.
Principales riesgos:
Un juicio de tendencia incorrecto puede pasar por alto tendencias más fuertes.
Los parámetros del indicador incorrectos pueden causar señales perdidas o falsas.
La ampliación de volumen ineficaz deja ciertos riesgos de fuga falsa. Prueba diferentes multiplicadores.
Direcciones de optimización potenciales:
Prueba diferentes tipos y longitudes de MA para obtener un mejor filtro de tendencia.
Optimizar los parámetros de los canales de Keltner, CCI, RSI para señales más precisas.
Prueba diferentes multiplicadores de volumen para encontrar el nivel óptimo.
Considere la posibilidad de agregar un stop loss para limitar la pérdida máxima por operació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)