Estrategia cuantitativa de superposición de tendencias de cambio Ichimoku Kinko Hyo +


Fecha de creación: 2024-02-20 16:46:56 Última modificación: 2024-02-20 16:46:56
Copiar: 0 Número de Visitas: 768
1
Seguir
1617
Seguidores

Estrategia cuantitativa de superposición de tendencias de cambio Ichimoku Kinko Hyo +

Descripción general

La estrategia es una combinación de un indicador de equilibrio visual y un indicador de superposición de movimiento para detectar tendencias potenciales en el precio de las acciones y determinar el momento de comprar y vender. La estrategia determina la dirección de la tendencia y emite una señal de negociación mediante el cálculo de la línea de equilibrio visual, en combinación con el indicador de superposición de movimiento, mientras se filtra para controlar el riesgo de negociación con el indicador RSI.

Principio de estrategia

La estrategia tiene tres partes principales:

  1. Indicador de equilibrio a primera vista: El indicador de equilibrio a primera vista utiliza principalmente dos líneas de punto de inflexión ((Tenkan-Sen) y punto de referencia ((Kijun-sen), que forman una forma de columna de equilibrio a primera vista. La línea de punto de inflexión representa la tendencia a corto plazo del precio, y la línea de punto de referencia representa la tendencia a mediano plazo del precio. La línea de punto de inflexión y el cruce de la línea de punto de referencia constituyen una señal de compra y venta.

  2. Indicador de superposición de movimiento: Indicador de superposición de movimiento para determinar la dirección de la tendencia mediante el cálculo de las bandas de intervalo de valor relativo disperso y el valor relativo de deslizamiento. Se produce una señal de negociación cuando los precios entran desde la banda de la zona exterior a la banda de la zona media.

  3. Indicador RSI: Indicador RSI para determinar si el precio está sobrepasado o sobrevendido, establecer una línea de sobreventa y un intervalo de sobreventa, combinar las señales de transacción de los indicadores de superposición de movimiento para determinar las señales de compra y venta.

En concreto, la estrategia monitorea si la línea de punto de cambio y la línea de punto de referencia tienen un horno de oro (que atraviesa la línea de punto de referencia en la línea de punto de cambio) y un horno muerto (que atraviesa la línea de punto de referencia por debajo de la línea de punto de cambio) para determinar el momento de comprar y vender. Al mismo tiempo, combina el indicador de superposición de movimiento para determinar la dirección de la tendencia general. Cuando los dos indicadores emiten señales al mismo tiempo, el indicador RSI emite una señal de negociación si no hay sobreventa o sobreventa.

Ventajas estratégicas

Esta estrategia, combinada con el uso de diferentes indicadores para determinar la dirección de la tendencia y el momento de negociación, puede mejorar la precisión del juicio, aprovechar las ventajas complementarias entre los indicadores y evitar la probabilidad de error en el juicio de un solo indicador. Las ventajas específicas son las siguientes:

  1. El uso de la línea de punto de giro y la línea de punto de referencia para formar un indicador de equilibrio a primera vista, puede reflejar tendencias a corto plazo y tendencias a medio plazo al mismo tiempo, lo que permite una mayor precisión que un solo indicador de MA.

  2. Los indicadores de superposición de movimiento son precisos y fiables para determinar la dirección de la tendencia general, y se complementan con los indicadores de equilibrio a primera vista.

  3. El indicador RSI establece condiciones de filtración que pueden filtrar efectivamente las brechas falsas y evitar el riesgo de negociación.

  4. La estrategia es fácil de entender y implementar y se aplica a las transacciones cuantitativas.

Riesgo estratégico

A pesar de que la estrategia utiliza varios indicadores para la evaluación conjunta y reduce en cierta medida la posibilidad de error, los principales riesgos son:

  1. Los parámetros de configuración son riesgos. La configuración incorrecta de los parámetros de los indicadores, como la línea de punto de giro y la línea de punto de referencia, puede causar errores en las señales de negociación. Los parámetros deben optimizarse para adaptarse a diferentes variedades.

  2. Riesgo de reversión de la tendencia. En la consolidación de la situación, puede generar falsas señales. Se requiere la combinación de más indicadores para determinar la señal de reversión de la tendencia.

  3. El riesgo de que las condiciones de filtración del RSI sean demasiado estrictas. Es posible que se eliminen más oportunidades de negociación. Los parámetros del RSI se pueden relajar adecuadamente.

Resolución de las mismas:

  1. Utiliza más datos históricos para optimizar los parámetros para las diferentes variedades, asegurando que los parámetros se ajusten de manera razonable.

  2. Incorporar un mecanismo de stop loss en la estrategia. Salir de la posición cuando el precio rompe la línea de stop loss en la dirección opuesta.

  3. Optimización de los parámetros del RSI, flexibilización adecuada de las condiciones de filtración, obtención de más oportunidades de negociación, siempre que se garantice el control del riesgo.

Dirección de optimización de la estrategia

La estrategia también tiene direcciones en las que se puede seguir optimizando:

  1. Aumentar el algoritmo de aprendizaje automático para que los parámetros de la estrategia se ajusten dinámicamente a los cambios en el mercado y mejorar la adaptabilidad de la estrategia.

  2. Envasar los componentes de la estrategia en módulos para administrarlos de manera modular, lo que facilita la sustitución rápida de los componentes o la prueba de los componentes de optimización por separado, lo que mejora la eficiencia del desarrollo.

  3. Aumentar los módulos de integración de datos, obtener datos de mercado de más fuentes de datos, formar conjuntos de entrenamiento de alta calidad y mejorar los efectos del aprendizaje automático.

  4. Desarrollar herramientas de retroalimentación para una revisión integral de las estrategias, registrar varios indicadores de evaluación, ajustar los parámetros de optimización auxiliares y la selección de modelos.

  5. Utilice la plataforma de computación en la nube para implementar sistemas de estrategias, utilizar recursos de computación flexibles para realizar retroalimentación rápida y en paralelo, acelerar la optimización de la repetición de parámetros y reducir los costos de desarrollo de estrategias.

Resumir

La estrategia utiliza un indicador de equilibrio a primera vista y un indicador de superposición de movimiento para complementar los indicadores para determinar la tendencia de los precios y el momento de negociación. Al mismo tiempo, utiliza el indicador RSI para filtrar y controlar el riesgo de negociación. Esta forma de estrategia de combinación de múltiples indicadores puede mejorar la precisión de los juicios y obtener mejores resultados.

Código Fuente de la Estrategia
/*backtest
start: 2023-02-13 00:00:00
end: 2024-02-19 00:00:00
period: 1d
basePeriod: 1h
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/
// © KryptoNight

//@version=4
// comment/uncomment Study/Strategy to easily switch modes
// study("Ichimoku Kinko Hyo Cloud - no offset - no repaint - RSI filter - alerts", shorttitle="IchiCloud + RSI - alerts", overlay=true)
// ============================================================================== Strategy mode - uncomment to activate
strategy("Ichimoku Kinko Hyo Cloud - no offset - no repaint - RSI filter - strategy", shorttitle="IchiCloud + RSI - Strategy Tester Mode", overlay=true, pyramiding = 0,
  currency = currency.EUR, initial_capital = 2000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100,
  calc_on_every_tick = true, calc_on_order_fills = true, commission_type = strategy.commission.percent, commission_value = 0.15)
// ==============================================================================

// ------------------------------------------------------------------------------

ichiCloud_offset   = input(false, title="Standard Ichimoku Cloud")                  // with the visual offset
ichiCloud_noOffset = input(true,  title="Ichimoku Cloud - no offset - no repaint")  // without the visual offset

conversion_prd = input(9, minval=1, title="Conversion Line Period - Tenkan-Sen")
baseline_prd   = input(27, minval=1, title="Base Line Period - Kijun-Sen")
baselineA_prd  = input(52, minval=1, title="Base Line Period - Kijun-Sen (auxiliary)")
leadingSpan_2prd = input(52, minval=1, title="Lagging Span 2 Periods - Senkou Span B")
displacement = input(26, minval=0, title="Displacement: (-) Chikou Span; (+) Senkou Span A")
extra_bars = input(1, minval=0, title="Displacement: additional bars")
laggingSpan_src = input(close, title="Lagging Span price source - Chikou-Span")

donchian(len) => avg(lowest(len), highest(len))
displ = displacement-extra_bars
// ------------------------------------------------------------------------------
// OFFSET:
conversion = donchian(conversion_prd)   // Conversion Line - Tenkan-Sen (9 Period)
baseline  = donchian(baseline_prd)      // Base Line - Kijun-Sen (26 Period)
baselineA = donchian(baselineA_prd)     // Base Line Period - Kijun-Sen (auxiliary)
leadingSpanA = avg(conversion, baseline)
leadingSpanB = donchian(leadingSpan_2prd)
laggingSpan = laggingSpan_src

// Color - bullish, bearish
col_cloud = leadingSpanA>=leadingSpanB ? color.green : color.red

// Cloud Lines
spanA = plot(ichiCloud_offset? leadingSpanA : na, offset=displ, title="Offset: Lead Line 1 - Senkou Span A cloud", color=color.green)
spanB = plot(ichiCloud_offset? leadingSpanB : na, offset=displ, title="Offset: Lead Line 2 - Senkou Span B cloud", color=color.red)
fill(spanA, spanB, color=col_cloud, transp=80, title="Offset: Ichimoku Cloud - Leading Span 1 & 2 based coloring")

// Other Lines
conversion_p = plot(ichiCloud_offset? conversion : na, title="Offset: Conversion Line - Tenkan-Sen", color=#0496ff)
standard_p = plot(ichiCloud_offset? baseline : na, title="Offset: Base Line - Kijun-Sen", color=#991515)
standardA_p = plot(ichiCloud_offset? baselineA : na, title="Offset: Base Line - Kijun-Sen (auxiliary)", color=color.teal)
lagging_Span_p = plot(ichiCloud_offset? laggingSpan : na, offset=-displ, title="Offset: Chikou Span (Lagging Span)", color=#459915)

// ------------------------------------------------------------------------------
// NO OFFSET:
conversion_noOffset = conversion[displ] // Conversion Line - Tenkan-Sen (9 Period)
baseline_noOffset  = baseline[displ]    // Base Line - Kijun-Sen (26 Period)
baselineA_noOffset = baselineA[displ]   // Base Line Period - Kijun-Sen (auxiliary)
leadingSpanA_noOffset = leadingSpanA[displ*2]
leadingSpanB_noOffset = leadingSpanB[displ*2]
laggingSpan_noOffset = laggingSpan[0]

// Color - bullish, bearish
col_cloud_noOffset = leadingSpanA_noOffset>=leadingSpanB_noOffset ? color.green : color.red

// Cloud Lines
spanA_noOffset = plot(ichiCloud_noOffset? leadingSpanA_noOffset : na, title="No offset: Lead Line 1 - Senkou Span A cloud", color=color.green, transp=0)
spanB_noOffset = plot(ichiCloud_noOffset? leadingSpanB_noOffset : na, title="No offset: Lead Line 2 - Senkou Span B cloud", color=color.red, transp=0)
fill(spanA_noOffset, spanB_noOffset, color=col_cloud_noOffset, transp=80, title="No offset: Ichimoku Cloud - Leading Span 1 & 2 based coloring")

// Other Lines
conversion_p_noOffset = plot(ichiCloud_noOffset? conversion_noOffset : na, title="No offset: Conversion Line - Tenkan-Sen", color=#0496ff, transp=0)
baseline_p_noOffset = plot(ichiCloud_noOffset? baseline_noOffset : na, title="No offset: Base Line - Kijun-Sen", color=#991515, transp=0)
baselineA_p_noOffset = plot(ichiCloud_noOffset? baselineA_noOffset : na, title="No offset: Base Line - Kijun-Sen (auxiliary)", color=color.teal, transp=0)
laggingSpan_p_noOffset = plot(ichiCloud_noOffset? laggingSpan_noOffset : na, title="No offset: Chikou Span (Lagging Span)", color=#459915, transp=0)

// ==============================================================================
// Conditions & Alerts (based on the lines without offset)

maxC = max(leadingSpanA_noOffset,leadingSpanB_noOffset)
minC = min(leadingSpanA_noOffset,leadingSpanB_noOffset)

// Trend start signals: crosses between Chikou Span (Lagging Span) and the Cloud (Senkou Span A, Senkou Span B)
uptrend_start   = crossover(laggingSpan_noOffset,maxC)
downtrend_start = crossunder(laggingSpan_noOffset,minC)

// Trends
uptrend   = laggingSpan_noOffset>maxC // Above Cloud
downtrend = laggingSpan_noOffset<minC // Below Cloud

// No trend: choppy trading - the price is in transition
notrend = maxC>=laggingSpan_noOffset and laggingSpan_noOffset>=minC

// Confirmations
uptrend_confirm   = crossover(leadingSpanA_noOffset,leadingSpanB_noOffset)
downtrend_confirm = crossunder(leadingSpanA_noOffset,leadingSpanB_noOffset)

// Signals - crosses between Conversion Line (Tenkan-Sen) and Base Line (Kijun-Sen)
bullish_signal = crossover(conversion_noOffset,baseline_noOffset)
bearish_signal = crossunder(conversion_noOffset,baseline_noOffset)

// Various alerts
alertcondition(uptrend_start,   title="Uptrend Started",   message="Uptrend Started")
alertcondition(downtrend_start, title="Downtrend Started", message="Downtrend Started")

alertcondition(uptrend_confirm,   title="Uptrend Confirmed",   message="Uptrend Confirmed")
alertcondition(downtrend_confirm, title="Downtrend Confirmed", message="Downtrend Confirmed")

alertcondition(bullish_signal, title="Buy Signal",  message="Buy Signal")
alertcondition(bearish_signal, title="Sell Signal", message="Sell Signal")

rsi_OBlevel = input(50, title="RSI Filter: Overbought level (0 = off)")
rsi_OSlevel = input(100,title="RSI Filter: Oversold level (100 = off)")
rsi_len = input(14,title="RSI Length")
rsi_src = input(close,title="RSI Price source")
rsi = rsi(rsi_src,rsi_len)

// Strategy -------------------------------
long_signal  = bullish_signal and uptrend   and rsi<=rsi_OSlevel // breakout filtered by the rsi
exit_long    = bearish_signal and uptrend
short_signal = bearish_signal and downtrend and rsi>=rsi_OBlevel // breakout filtered by the rsi
exit_short   = bullish_signal and downtrend

// Strategy alerts
alertcondition(long_signal, title="Long Signal - Uptrend",      message="Long Signal - Uptrend")
alertcondition(exit_long,   title="Long Exit Signal - Uptrend", message="Long Exit Signal - Uptrend")

alertcondition(short_signal, title="Long Signal - Downtrend",       message="Long Signal - Downtrend")
alertcondition(exit_short,   title="Short Exit Signal - Downtrend", message="Short Exit Signal - Downtrend")

// Plot areas for trend and transition
color_trend = uptrend? #00FF00 : downtrend? #FF0000 : notrend? color.new(#FFFFFF, 50) : na
fill(spanA_noOffset, spanB_noOffset, color=color_trend, transp=90, title="No offset: Ichimoku Cloud - Lagging Span & Cloud based coloring")

plotshape(ichiCloud_noOffset?uptrend_start:na, title="No offset: Uptrend Started", color=color.green, style=shape.circle, location=location.belowbar, size=size.tiny, text="Up")
plotshape(ichiCloud_noOffset?downtrend_start:na, title="No offset: Downtrend Started", color=color.red, style=shape.circle,location=location.abovebar, size=size.tiny, text="Down")

plotshape(ichiCloud_noOffset?uptrend_confirm:na, title="No offset: Uptrend Confirmed", color=color.green, style=shape.circle, location=location.belowbar, size=size.small, text="Confirm Up")
plotshape(ichiCloud_noOffset?downtrend_confirm:na, title="No offset: Downtrend Confirmed", color=color.red, style=shape.circle, location=location.abovebar, size=size.small, text="Confirm Down")

plotshape(ichiCloud_noOffset?long_signal:na, title="No offset: Long Signal", color=#00FF00, style=shape.triangleup, location=location.belowbar, size=size.small, text="Long")
plotshape(ichiCloud_noOffset?exit_long:na, title="No offset: Exit Long Signal", color=color.fuchsia, style=shape.triangledown, location=location.abovebar, size=size.small, text="Exit long")

plotshape(ichiCloud_noOffset?short_signal:na, title="No offset: Short Signal", color=#FF0000, style=shape.triangledown, location=location.abovebar, size=size.small, text="Short")
plotshape(ichiCloud_noOffset?exit_short:na, title="No offset: Exit Short Signal", color=color.fuchsia, style=shape.triangleup, location=location.belowbar, size=size.small, text="Exit short")

// ============================================================================== Strategy Component - uncomment to activate
if (long_signal)
    strategy.entry("Long",strategy.long)
if (exit_long)
    strategy.close("Long")
// if (short_signal)
//    strategy.entry("Short",strategy.short)
// if (exit_short)
//    strategy.close("Short")
// ==============================================================================


//@version=4
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © colinmck


RSI_Period = input(10, title='RSI Length')
SF = input(5, title='RSI Smoothing')
QQE = input(2.438, title='Fast QQE Factor')
ThreshHold = input(10, title="Thresh-hold")

src = close
Wilders_Period = RSI_Period * 3 - 1

Rsi = rsi(src, RSI_Period)
RsiMa = ema(Rsi, SF)
AtrRsi = abs(RsiMa[1] - RsiMa)
MaAtrRsi = ema(AtrRsi, Wilders_Period)
dar = ema(MaAtrRsi, Wilders_Period) * QQE

longband = 0.0
shortband = 0.0
trend = 0

DeltaFastAtrRsi = dar
RSIndex = RsiMa
newshortband = RSIndex + DeltaFastAtrRsi
newlongband = RSIndex - DeltaFastAtrRsi
longband := RSIndex[1] > longband[1] and RSIndex > longband[1] ? max(longband[1], newlongband) : newlongband
shortband := RSIndex[1] < shortband[1] and RSIndex < shortband[1] ? min(shortband[1], newshortband) : newshortband
cross_1 = cross(longband[1], RSIndex)
trend := cross(RSIndex, shortband[1]) ? 1 : cross_1 ? -1 : nz(trend[1], 1)
FastAtrRsiTL = trend == 1 ? longband : shortband

// Find all the QQE Crosses

QQExlong = 0
QQExlong := nz(QQExlong[1])
QQExshort = 0
QQExshort := nz(QQExshort[1])
QQExlong := FastAtrRsiTL < RSIndex ? QQExlong + 1 : 0
QQExshort := FastAtrRsiTL > RSIndex ? QQExshort + 1 : 0

//Conditions

qqeLong = QQExlong == 1 ? FastAtrRsiTL[1] - 50 : na
qqeShort = QQExshort == 1 ? FastAtrRsiTL[1] - 50 : na

// Plotting

plotshape(qqeLong, title="QQE long", text="Long", textcolor=color.white, style=shape.labelup, location=location.belowbar, color=color.green, transp=0, size=size.tiny)
plotshape(qqeShort, title="QQE short", text="Short", textcolor=color.white, style=shape.labeldown, location=location.abovebar, color=color.red, transp=0, size=size.tiny)

// Alerts

alertcondition(qqeLong, title="Long", message="Long")
alertcondition(qqeShort, title="Short", message="Short")