Stratégie quantitative Ichimoku Kinko Hyo + Shift Trend Superposition


Date de création: 2024-02-20 16:46:56 Dernière modification: 2024-02-20 16:46:56
Copier: 0 Nombre de clics: 768
1
Suivre
1617
Abonnés

Stratégie quantitative Ichimoku Kinko Hyo + Shift Trend Superposition

Aperçu

La stratégie est une combinaison d’indicateurs d’équilibre et de superposition de mouvement pour détecter les tendances potentielles du prix des actions et déterminer le moment de l’achat et de la vente. La stratégie, en calculant la ligne d’équilibre initiale, en combinaison avec l’indicateur de superposition de mouvement pour déterminer la direction de la tendance et émettre un signal de négociation, tout en utilisant l’indicateur RSI pour filtrer et contrôler le risque de négociation.

Principe de stratégie

La stratégie se compose de trois volets principaux:

  1. Indicateur d’équilibre à première vue: l’indicateur d’équilibre à première vue utilise principalement deux lignes composées de points de basculement ((Tenkan-Sen) et de points de référence ((Kijun-sen), formant une forme de colonne d’équilibre à première vue. La ligne de point de basculement représente la tendance à court terme du prix et la ligne de point de référence représente la tendance à moyen terme du prix.

  2. Indicateur de superposition de mouvement: L’indicateur de superposition de mouvement détermine la direction de la tendance en calculant la bande intermédiaire de la valeur relative dispersée et la bande relative de glissement. Un signal de transaction est généré lorsque les prix entrent dans la bande intermédiaire de la zone extérieure.

  3. Indicateur RSI: L’indicateur RSI est utilisé pour déterminer si le prix est dépassé ou survendu, pour définir une ligne de survente et une zone de survente, et pour déterminer les signaux d’achat et de vente associés aux signaux de transaction de l’indicateur de superposition de mouvement.

Plus précisément, la stratégie surveille si des forks dorés (crossings de la ligne de référence au-dessus de la ligne de référence) et des forks morts (crossings de la ligne de référence en dessous de la ligne de référence) se produisent pour déterminer le moment de l’achat et de la vente. En combinaison avec la superposition des mouvements, l’indicateur détermine la direction de la tendance globale. Lorsque les deux indicateurs émettent des signaux simultanément, l’indicateur RSI émet un signal de transaction s’il n’y a pas de survente.

Avantages stratégiques

Cette stratégie, combinée à l’utilisation de différents indicateurs pour déterminer la direction de la tendance et le moment de la transaction, peut améliorer l’exactitude du jugement, en utilisant les avantages complémentaires entre les indicateurs, et en évitant la probabilité d’erreur dans le jugement d’un seul indicateur. Les avantages spécifiques sont les suivants:

  1. L’utilisation d’une courbe de virage et d’une courbe de référence pour constituer un indicateur d’équilibre à première vue, qui peut refléter à la fois les tendances à court terme et les tendances à moyen terme, permet d’avoir une plus grande précision que l’indicateur MA unique.

  2. Les indicateurs de superposition de mouvements sont fiables pour déterminer la direction de la tendance globale et se complètent mutuellement avec les indicateurs d’équilibre à première vue.

  3. L’indicateur RSI définit des conditions de filtrage qui permettent de filtrer efficacement les fausses ruptures et d’éviter les risques de trading.

  4. Cette stratégie est facile à comprendre et à mettre en œuvre pour les transactions quantitatives.

Risque stratégique

Bien que l’utilisation d’indicateurs multiples pour la co-évaluation de la stratégie puisse réduire dans une certaine mesure le risque d’erreur, les principaux risques sont les suivants:

  1. Risque de paramétrage. Des paramètres d’indicateurs tels que la ligne de pointe de virage, la ligne de pointe de référence mal configurés peuvent entraîner des erreurs de signal de négociation. Les paramètres doivent être optimisés pour s’adapter aux différentes variétés.

  2. Risque de renversement de tendance. Dans un contexte de consolidation, il est possible de générer de faux signaux. Il est nécessaire de combiner plus d’indicateurs pour juger du signal de renversement de tendance.

  3. Les conditions de filtrage du RSI sont trop strictes. Il est possible de supprimer plus d’opportunités de négociation. Les paramètres du RSI peuvent être assouplis de manière appropriée.

La réponse:

  1. Utilisez plus de données historiques pour optimiser les paramètres pour les différentes variétés et assurez-vous que les paramètres sont bien définis.

  2. Ajout d’un mécanisme de stop loss dans la stratégie. Retrait de position lorsque le prix franchit la ligne de stop loss dans la direction opposée.

  3. Optimiser les paramètres du RSI, assouplir les conditions de filtrage de manière appropriée et obtenir plus d’opportunités de négociation tout en maintenant la maîtrise des risques.

Orientation de l’optimisation de la stratégie

Il existe d’autres directions dans lesquelles cette stratégie peut être optimisée:

  1. L’ajout d’algorithmes d’apprentissage automatique permettant aux paramètres stratégiques de s’adapter dynamiquement aux changements du marché, améliorant ainsi l’adaptabilité des stratégies.

  2. Les composants de la stratégie sont regroupés en modules et gérés de manière modulaire, ce qui facilite le remplacement rapide de ces composants ou l’optimisation des composants testés séparément, ce qui améliore l’efficacité du développement.

  3. L’ajout de modules d’intégration de données, l’acquisition de données de marché à partir de plus de sources de données, la constitution d’ensembles de formation de haute qualité et l’amélioration de l’effet d’apprentissage automatique.

  4. Développer des outils de retour d’expérience pour un retour d’expérience complet des stratégies, enregistrer divers indicateurs d’évaluation, aider à l’optimisation des paramètres et à la sélection des modèles.

  5. Utilisez une plate-forme de cloud computing pour déployer un système de stratégie, en utilisant des ressources de calcul flexibles pour effectuer des retours parallèles rapides, accélérer l’itération de l’ajustement des paramètres et réduire les coûts de développement de la stratégie.

Résumer

Cette stratégie utilise des indicateurs d’équilibre à première vue et des indicateurs de superposition de mouvement pour déterminer les tendances des prix et le moment de la transaction. Cette forme de stratégie combinant plusieurs indicateurs permet d’améliorer l’exactitude des jugements et d’obtenir de meilleurs résultats stratégiques. Cependant, la définition des paramètres et la sélection des indicateurs dans la stratégie nécessitent toujours des tests et des optimisations constants pour les différentes variétés.

Code source de la stratégie
/*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")