Estrategia de trading con indicador dual y posición dinámica SPARK

supertrend RSI ATR
Fecha de creación: 2024-04-12 17:22:47 Última modificación: 2024-04-12 17:22:47
Copiar: 0 Número de Visitas: 778
1
Seguir
1617
Seguidores

Estrategia de trading con indicador dual y posición dinámica SPARK

Descripción general

La estrategia SPARK es una estrategia de comercio cuantitativa que combina un ajuste de posición dinámico y una confirmación de doble indicador. La estrategia utiliza el indicador SuperTrend y el índice de fuerza relativa ((RSI) para identificar posibles entradas y salidas, mientras que utiliza un mecanismo de ajuste de posición dinámico para optimizar la distribución de fondos.

Principio de estrategia

El núcleo de la estrategia SPARK es la aplicación combinada del indicador SuperTrend y el indicador RSI. El indicador SuperTrend determina la dirección de la tendencia comparando el precio de cierre con la relación de la posición de resistencia de soporte dinámico, mientras que el indicador RSI se utiliza para identificar el estado de sobreventa y sobreventa en el mercado. La estrategia se lanzará cuando el indicador SuperTrend y el RSI cumplan con ciertas condiciones al mismo tiempo.

La estrategia utiliza un mecanismo de ajuste de posición dinámico para optimizar la asignación de fondos en cada operación. Al configurar el porcentaje de la cartera y el nivel de apalancamiento, la estrategia puede calcular automáticamente el tamaño de la posición óptima en función de las condiciones actuales del mercado y el saldo de la cuenta. Además, la estrategia ofrece una configuración flexible de stop-loss que permite elegir entre un porcentaje fijo o un cálculo dinámico.

Ventajas estratégicas

  1. Confirmación de doble indicador: mediante la combinación de los indicadores SuperTrend y RSI, la estrategia SPARK puede identificar con mayor precisión los puntos de entrada y salida potenciales, reduciendo la posibilidad de error de juicio.
  2. Ajuste de posición dinámico: La estrategia utiliza un mecanismo de ajuste de posición dinámico que puede optimizar automáticamente la asignación de fondos para cada operación en función del porcentaje de la cartera y el nivel de apalancamiento, lo que mejora la eficiencia de la utilización de los fondos.
  3. Gestión de riesgos flexible: La estrategia ofrece un ajuste de stop loss flexible, que permite un control preciso del riesgo, ya sea mediante un porcentaje fijo o un cálculo dinámico, según las preferencias de riesgo personales.
  4. Parámetros personalizados: la estrategia permite a los usuarios ajustar varios parámetros de entrada, como la longitud de ATR, el multiplicador y el umbral RSI, para adaptarse a diferentes condiciones de mercado y preferencias de negociación.

Riesgo estratégico

  1. Riesgo de mercado: A pesar de que la estrategia SPARK utiliza un mecanismo de confirmación de doble indicador y un ajuste dinámico de posición, es posible que se enfrente a un riesgo de pérdida en condiciones extremas de mercado.
  2. Riesgo de optimización de parámetros: el rendimiento de la estrategia depende en gran medida de la elección de los parámetros de entrada. La configuración inadecuada de los parámetros puede causar un mal rendimiento de la estrategia.
  3. Riesgo de sobreajuste: Si los parámetros de la estrategia se optimizan en exceso, puede ocasionar que la estrategia no funcione bien en condiciones de mercado futuras.

Dirección de optimización de la estrategia

  1. Introducción de más indicadores: Considere la introducción de otros indicadores técnicos, como MACD, banda de Brin, etc., para mejorar aún más la precisión de la detección de señales.
  2. Optimización de los mecanismos de stop loss: explorar estrategias de stop loss más avanzadas, como el stop loss móvil, el stop loss dinámico, etc., para proteger mejor los beneficios y limitar las pérdidas.
  3. Ajuste de parámetros de adaptación: desarrollo de mecanismos de adaptación para ajustar los parámetros de la estrategia en función de la dinámica de la situación del mercado para adaptarse a un entorno de mercado cambiante.

Resumir

La estrategia SPARK ofrece a los comerciantes una solución de negociación cuantitativa completa mediante la combinación de indicadores SuperTrend y RSI, y el uso de mecanismos de ajuste de posición dinámicos y herramientas de gestión de riesgos flexibles. Aunque la estrategia puede tener algunos riesgos, la estrategia SPARK espera lograr un rendimiento estable en una variedad de condiciones de mercado a través de la optimización y la mejora continuas.

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

//@version=4
strategy("SPARK", shorttitle="SPARK", overlay=true)

// Choose whether to activate the minimal bars in trade feature
minBarsEnabled = input(true, title="Activate Minimal Bars in Trade")
portfolioPercentage = input(10, title="Portfolio Percentage", minval=1, maxval=100)
// Leverage Input
leverage = input(1, title="Leverage", minval=1)

// Calculate position size according to portfolio percentage and leverage
positionSizePercent = portfolioPercentage / 100 * leverage
positionSize = (strategy.initial_capital / close) * positionSizePercent

// Take Profit and Stop Loss settings
useFixedTPSL = input(1, title="Use Fixed TP/SL", options=[1, 0])
tp_sl_step = 0.1
fixedTP = input(2.0, title="Fixed Take Profit (%)", step=tp_sl_step)
fixedSL = input(1.0, title="Fixed Stop Loss (%)", step=tp_sl_step)

// Calculate Take Profit and Stop Loss Levels
takeProfitLong = close * (1 + fixedTP / 100)
takeProfitShort = close * (1 - fixedTP / 100)
stopLossLong = close * (1 - fixedSL / 100)
stopLossShort = close * (1 + fixedSL / 100)

// Plot TP and SL levels on the chart
plotshape(series=takeProfitLong, title="Take Profit Long", color=color.green, style=shape.triangleup, location=location.abovebar)
plotshape(series=takeProfitShort, title="Take Profit Short", color=color.red, style=shape.triangledown, location=location.belowbar)
plotshape(series=stopLossLong, title="Stop Loss Long", color=color.red, style=shape.triangleup, location=location.abovebar)
plotshape(series=stopLossShort, title="Stop Loss Short", color=color.green, style=shape.triangledown, location=location.belowbar)

// Minimum Bars Between Trades Input
minBarsBetweenTrades = input(5, title="Minimum Bars Between Trades")

// Inputs for selecting trading direction
tradingDirection = input("Both", "Choose Trading Direction", options=["Long", "Short", "Both"])

// SuperTrend Function
trendFlow(src, atrLength, multiplier) =>
    atr = atr(atrLength)
    up = hl2 - (multiplier * atr)
    dn = hl2 + (multiplier * atr)
    trend = 1
    trend := nz(trend[1], 1)
    up := src > nz(up[1], 0) and src[1] > nz(up[1], 0) ? max(up, nz(up[1], 0)) : up
    dn := src < nz(dn[1], 0) and src[1] < nz(dn[1], 0) ? min(dn, nz(dn[1], 0)) : dn
    trend := src > nz(dn[1], 0) ? 1 : src < nz(up[1], 0)? -1 : nz(trend[1], 1)
    [up, dn, trend]

// Inputs for SuperTrend settings
atrLength1 = input(7, title="ATR Length for Trend 1")
multiplier1 = input(4.0, title="Multiplier for Trend 1")
atrLength2 = input(14, title="ATR Length for Trend 2")
multiplier2 = input(3.618, title="Multiplier for Trend 2")
atrLength3 = input(21, title="ATR Length for Trend 3")
multiplier3 = input(3.5, title="Multiplier for Trend 3")
atrLength4 = input(28, title="ATR Length for Trend 4")
multiplier4 = input(3.382, title="Multiplier for Trend 4")

// Calculate SuperTrend
[up1, dn1, trend1] = trendFlow(close, atrLength1, multiplier1)
[up2, dn2, trend2] = trendFlow(close, atrLength2, multiplier2)
[up3, dn3, trend3] = trendFlow(close, atrLength3, multiplier3)
[up4, dn4, trend4] = trendFlow(close, atrLength4, multiplier4)

// Entry Conditions based on SuperTrend and Elliott Wave-like patterns
longCondition = trend1 == 1 and trend2 == 1 and trend3 == 1 and trend4 == 1
shortCondition = trend1 == -1 and trend2 == -1 and trend3 == -1 and trend4 == -1

// Calculate bars since last trade
barsSinceLastTrade = barssince(tradingDirection == "Long" ? longCondition : shortCondition)

// Strategy Entry logic based on selected trading direction and minimum bars between trades
if tradingDirection == "Long" or tradingDirection == "Both"
    if longCondition and (not minBarsEnabled or barsSinceLastTrade >= minBarsBetweenTrades)
        strategy.entry("Long", strategy.long, qty=positionSize)
        strategy.exit("TP/SL Long", from_entry="Long", stop=stopLossLong, limit=takeProfitLong)

if tradingDirection == "Short" or tradingDirection == "Both"
    if shortCondition and (not minBarsEnabled or barsSinceLastTrade >= minBarsBetweenTrades)
        strategy.entry("Short", strategy.short, qty=positionSize)
        strategy.exit("TP/SL Short", from_entry="Short", stop=stopLossShort, limit=takeProfitShort)

// Color bars based on position
var color barColor = na
barColor := strategy.position_size > 0 ? color.green : strategy.position_size < 0 ? color.red : na

// Plot colored bars
plotcandle(open, high, low, close, color=barColor)

// Plot moving averages
plot(sma(close, 50), color=color.blue)
plot(sma(close, 200), color=color.orange)

// More customizable trading bot - adding a new indicator
// This indicator is the RSI (Relative Strength Index)

// RSI Inputs
rsi_length = input(14, title="RSI Length")
rsi_oversold = input(30, title="RSI Oversold")
rsi_overbought = input(70, title="RSI Overbought")

// Calculate RSI
rsi = rsi(close, rsi_length)

// Plot RSI
plot(rsi, color=color.purple, title="RSI")

// Entry Conditions based on RSI
rsi_long_condition = rsi < rsi_oversold
rsi_short_condition = rsi > rsi_overbought

// Strategy Entry logic based on RSI
if tradingDirection == "Long" or tradingDirection == "Both"
    if rsi_long_condition and (not minBarsEnabled or barsSinceLastTrade >= minBarsBetweenTrades)
        strategy.entry("Long_RSI", strategy.long, qty=positionSize)
        strategy.exit("TP/SL Long_RSI", from_entry="Long_RSI", stop=stopLossLong, limit=takeProfitLong)

if tradingDirection == "Short" or tradingDirection == "Both"
    if rsi_short_condition and (not minBarsEnabled or barsSinceLastTrade >= minBarsBetweenTrades)
        strategy.entry("Short_RSI", strategy.short, qty=positionSize)
        strategy.exit("TP/SL Short_RSI", from_entry="Short_RSI", stop=stopLossShort, limit=takeProfitShort)