El sistema de negociación de dos cantidades

El autor:¿ Qué pasa?, fecha: 2024-02-26 14:30:54
Las etiquetas:

img

Esta estrategia combina el indicador CCI, el indicador RSI y dos promedios móviles en un sistema de negociación compuesto.

Principio de la estrategia

La estrategia utiliza principalmente el indicador CCI para determinar la dirección de la tendencia. Las lecturas del CCI por encima de 100 indican un mercado alcista, mientras que las por debajo de -100 indican un mercado bajista. El sistema utiliza dos cruces de promedios móviles para ayudar a determinar la dirección de la tendencia. Cuando el promedio móvil rápido cruza por encima del promedio móvil lento, es una señal de compra, y viceversa para las señales de venta.

Después de determinar la tendencia alcista o bajista, el sistema utiliza el cruce de dos RSI con diferentes longitudes de parámetros como verificación de entrada. Por ejemplo, en un mercado alcista, si el RSI de corto período cruza por encima del RSI de largo período, es la señal final de compra. Este diseño filtra principalmente el ruido para evitar operaciones incorrectas desencadenadas por correcciones a corto plazo durante las tendencias.

La estrategia solo abre posiciones durante la sesión de negociación especificada, cerrando activamente todas las posiciones 15 minutos antes del cierre para evitar el riesgo de la noche a la mañana.

Análisis de ventajas

  • La combinación de juicio de tendencia y cruce de indicadores puede identificar de manera efectiva las tendencias y filtrar el ruido para obtener entradas precisas
  • El uso de trailing stops para controlar activamente los riesgos evita ser detenido debido a los accidentes repentinos
  • Solo la apertura de posiciones durante sesiones de negociación específicas evita el riesgo de brecha durante la noche
  • Los parámetros de RSI ajustables pueden adaptarse de forma flexible a diferentes entornos de mercado

Análisis de riesgos

  • El CCI muestra un desempeño deficiente en mercados inusualmente volátiles
  • Las condiciones cruzadas de doble RSI son relativamente estrictas, lo que podría hacer que se pierdan algunas oportunidades
  • Las paradas traseras podrían ser demasiado subjetivas, requiriendo optimización de parámetros
  • Las sesiones de negociación especificadas pueden no tener grandes brechas de noticias durante la noche

Sugerencias para optimizar

  • Prueba diferentes combinaciones de parámetros CCI para encontrar los ajustes óptimos
  • Prueba de eliminación de la condición de cruce RSI y entrada directa basada en el CCI
  • Prueba de retroceso y optimización de los parámetros de parada de trailing para encontrar la configuración óptima
  • Prueba eliminando la lógica de cierre de posición forzada y en su lugar rastrea las ganancias con paradas de seguimiento durante las posiciones para maximizar las ganancias

Resumen de las actividades

Esta estrategia considera de manera integral la determinación de tendencias y la validación del cruce de indicadores para garantizar la validez de la señal mientras se controla el riesgo. A través de la optimización de parámetros y ajustes lógicos, la estrategia tiene un mayor potencial para expandir las oportunidades de ganancia y reducir las oportunidades perdidas.


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

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © rwestbrookjr

//@version=5
strategy("EMA with RSI Cross Strategy", overlay=true)

//EMA
fastLen = input(title='Fast EMA Length', defval=9)
slowLen = input(title='Slow EMA Length', defval=20)

fastEMA = ta.ema(close, fastLen)
slowEMA = ta.ema(close, slowLen)

fema = plot(fastEMA, title='FastEMA', color=color.new(color.green, 0), linewidth=1, style=plot.style_line)
sema = plot(slowEMA, title='SlowEMA', color=color.new(color.red, 0), linewidth=1, style=plot.style_line)

fill(fema, sema, color=fastEMA > slowEMA ? color.new(#417505, 50) : color.new(#890101, 50), title='Cloud')

// Bull and Bear Alerts
//Bull = ta.crossover(fastEMA, slowEMA)
Bull = fastEMA > slowEMA
//Bear = ta.crossunder(fastEMA, slowEMA)
Bear = fastEMA < slowEMA

//RSIs
rsiLength1Input = input.int(9, minval=1, title="RSI Length", group="RSI Settings")
rsiSource1Input = input.source(close, "Source", group="RSI Settings")
rsiLength2Input = input.int(20, minval=1, title="RSI Length", group="RSI Settings")
rsiSource2Input = input.source(close, "Source", group="RSI Settings")

up1 = ta.rma(math.max(ta.change(rsiSource1Input), 0), rsiLength1Input)
down1 = ta.rma(-math.min(ta.change(rsiSource1Input), 0), rsiLength1Input)
rsi = down1 == 0 ? 100 : up1 == 0 ? 0 : 100 - (100 / (1 + up1 / down1))
up2 = ta.rma(math.max(ta.change(rsiSource2Input), 0), rsiLength2Input)
down2 = ta.rma(-math.min(ta.change(rsiSource2Input), 0), rsiLength2Input)
rsi2 = down2 == 0 ? 100 : up2 == 0 ? 0 : 100 - (100 / (1 + up2 / down2))

//CCI
cciLength = input.int(20, minval=1)
src = input(hlc3, title="Source")
ma = ta.sma(src, cciLength)
cci = (src - ma) / (0.015 * ta.dev(src, cciLength))

//Trail Stop Setup
trstp = input.float(title="Trail Loss($)", minval = 0.0, step = 0.01, defval = 0.5)

longStop = 0.0, shortStop = 0.0

longStop := if Bull
    stopValue = close - trstp
    math.max(stopValue, longStop[1])
else
    0.0

shortStop := if Bear
    stopValue = close + trstp
    math.min(stopValue, shortStop[1])
else
    999999


//Session Setup
open_session=input(defval="0930-1545")
session = time("1", open_session)
validSession=(na(session) ? 0 : 1)

//Trade Signals
longCondition = Bull and cci > 100 and ta.crossover(rsi,rsi2) and validSession
if (longCondition)
    strategy.entry("Long", strategy.long, 1)
    
//longExit = close > strategy.opentrades.entry_price(0) + 1.5 or close < strategy.opentrades.entry_price(0) - 0.75
longExit = close < longStop or not validSession
if (longExit)
    strategy.close("Long")

shortCondition = Bear and cci < 100 and ta.crossunder(rsi,rsi2) and validSession
if (shortCondition)
    strategy.entry("Short", strategy.short, 1)

//shortExit = close < strategy.opentrades.entry_price(0) - 1.5 or close > strategy.opentrades.entry_price(0) + 0.75
shortExit = close > shortStop or not validSession
if (shortExit)
    strategy.close("Short")


Más.