Estrategia de trading bidireccional de posiciones largas y cortas con filtrado de tendencias CCI+RSI+KC

CCI RSI KC SMA EMA SMMA CMA TMA
Fecha de creación: 2024-05-15 16:56:03 Última modificación: 2024-05-15 16:56:03
Copiar: 1 Número de Visitas: 670
1
Seguir
1617
Seguidores

Estrategia de trading bidireccional de posiciones largas y cortas con filtrado de tendencias CCI+RSI+KC

Descripción general

La estrategia utiliza los tres indicadores técnicos CCI, RSI y KC, combinados con filtros de tendencia, para realizar operaciones bidireccionales multi-hojas en pares de divisas AUDNZD y GBPNZD. La estrategia utiliza el CCI y el RSI para juzgar sobrecompras y sobreventas, KC como base de referencia para los paros de pérdidas, mientras que utiliza la media móvil como filtro de tendencia para abrir posiciones en caso de flujo. La estrategia se ha evaluado en datos históricos de los últimos 5 años y ha obtenido un beneficio estable.

Principio de estrategia

  1. Calcula el CCI, el RSI y el KC. El KC se suma a la línea media con el ATR, y la línea media se resta con el ATR.
  2. Seleccione el tipo de promedio móvil (SMA, EMA, SMMA, CMA o TMA) y el método de filtrado de tendencias (OFF, POSITIVO o INVERSO) según los parámetros de entrada.
  3. Condiciones de apertura de posiciones múltiples: se permite hacer más, CCI < línea de venta excesiva, precio de cierre < KC bajista, RSI < línea de venta excesiva, volumen de transacción> 50 promedio de ciclo*El número de posiciones en el mercado es el doble, y no hay más de una.
  4. Condiciones para abrir una posición a balde: se permite el descubierto, CCI> línea de sobreventa, precio de cierre> KC en marcha, RSI> línea de sobreventa, volumen de transacción> promedio de 50 ciclos*El número de posiciones vacantes en la actualidad.
  5. Condición de posición cerrada de varios titulares: CCI>0 ⋅ Condición de posición cerrada de titulares sin titulares: CCI ⋅
  6. La alerta se emite cuando se abre una posición y la alerta se emite cuando se cierra una posición.

Ventajas estratégicas

  1. La combinación de varios indicadores para un juicio integral, mejora la precisión de la señal.
  2. El método de filtrado de tendencias permite un ajuste flexible de las tendencias del mercado.
  3. El tipo de media móvil es opcional y se adapta a las diferentes características del mercado.
  4. Con datos históricos comprobados desde hace mucho tiempo, la estabilidad es buena y es adecuada para un uso prolongado.
  5. El comercio bilateral, adaptable a las diversas situaciones, ofrece más oportunidades de ganar.
  6. El nivel de automatización es alto, no requiere intervención humana y ahorra tiempo y esfuerzo.

Riesgo estratégico

  1. La ausencia de los tradicionales paradores de pérdidas, con una mayor posibilidad de retroceder ante situaciones extremas.
  2. En los mercados convulsionados, las posiciones bajas pueden ser frecuentes y los costos de las transacciones pueden aumentar.
  3. El uso de un ciclo CCI relativamente corto puede producir señales de ruido.
  4. El filtro de tendencias tiene un efecto limitado cuando las tendencias son poco claras o la volatilidad del mercado aumenta.
  5. Las posiciones fijas no pueden adaptarse a los cambios en la volatilidad del mercado.

Dirección de optimización de la estrategia

  1. Se puede considerar aumentar el stop loss móvil o el stop loss de puntos fijos para controlar el riesgo de una sola transacción.
  2. Los parámetros de RSI y CCI se pueden optimizar aún más para reducir la señal de ruido.
  3. Se puede considerar la introducción de indicadores de volatilidad como el ATR, para ajustar las posiciones y los paros en función de la volatilidad del mercado.
  4. Añadir más pares de divisas y optimizar los parámetros individualmente según las características de cada variedad.
  5. Intentar introducir tecnologías de inteligencia artificial, como el aprendizaje automático, para adaptarse a los parámetros de optimización.

Resumir

La estrategia utiliza varios indicadores clásicos, es más fácil de escribir y analizar en la vista de trading. El efecto de la evaluación es bueno, pero también se debe tener en cuenta el control del riesgo y el ajuste de los parámetros en el campo real. Se recomienda probar un pequeño capital primero, y aumentar gradualmente la inversión después de la acumulación de experiencia.

Código Fuente de la Estrategia
/*backtest
start: 2024-04-01 00:00:00
end: 2024-04-30 23:59:59
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy('CCI Strategy with Trend Filter AUDNZD, GBPNZD', overlay=true, default_qty_type=strategy.cash, default_qty_value=50000, commission_value=0.0005, slippage=2, initial_capital=10000)

// State variables to ensure one entry per signal
var bool isLongOpen = false
var bool isShortOpen = false

// 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.string(title='MA Type', options=['OFF', 'SMA', 'EMA', 'SMMA', 'CMA', 'TMA'], defval='OFF')
trendFilterMethod = input.string(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.float(0, title='Volume Multiplier', step=0.1, minval=0)

// Define Moving Averages
var float maValue = na
if maType == 'SMA'
    maValue := ta.sma(close, maLength)
else if maType == 'EMA'
    maValue := ta.ema(close, maLength)
else if maType == 'SMMA'
    float initialSMMA = ta.sma(close, maLength)
    maValue := na(maValue[1]) ? initialSMMA : (maValue[1] * (maLength - 1) + close) / maLength
else if maType == 'CMA'
    float firstSMA = ta.sma(close, maLength)
    float secondSMA = ta.sma(close, maLength)
    maValue := na(maValue[1]) ? firstSMA : (firstSMA + secondSMA - maValue[1]) / 2
else if maType == 'TMA'
    maValue := ta.sma(ta.sma(close, math.round(maLength / 2)), math.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 = ta.sma(typicalPrice, lengthKC)
range_1 = multKC * ta.atr(lengthKC)
upperChannel = middleLine + range_1
lowerChannel = middleLine - range_1

// CCI
cci = ta.cci(close, lengthCCI)

// RSI
rsi = ta.rsi(close, rsiPeriod)

// Volume
volCondition = volume > ta.sma(volume, 50) * volumeMultiplier

// Combined Entry Conditions with Trend Filter and state check
longCondition := longCondition and cci < oversoldCCI and low < lowerChannel and rsi < rsiOversold and volCondition and not isLongOpen
shortCondition := shortCondition and cci > overboughtCCI and high > upperChannel and rsi > rsiOverbought and volCondition and not isShortOpen

// Execute orders at the open of the new bar after conditions are met
if longCondition
    strategy.entry('Long', strategy.long)
    alert('LicenseID,buy,AUDNZD,risk=1')
    isLongOpen := true
if shortCondition
    strategy.entry('Short', strategy.short)
    alert('LicenseID,sell,AUDNZD,risk=1')
    isShortOpen := true

// Exit Conditions and Alerts
longExitCondition = cci > 0
shortExitCondition = cci < 0
if (longExitCondition and isLongOpen)
    strategy.close('Long')
    alert('LiceneseID,closelong,AUDNZD')
    isLongOpen := false
if (shortExitCondition and isShortOpen)
    strategy.close('Short')
    alert('LicenseID,closeshort,AUDNZD')
    isShortOpen := false

// Plotting
plot(upperChannel, color=color.new(color.red, 0), linewidth=1)
plot(lowerChannel, color=color.new(color.green, 0), linewidth=1)
hline(overboughtCCI, 'Overbought', color=color.red)
hline(oversoldCCI, 'Oversold', color=color.green)