Stratégie de rupture à double tendance

Auteur:ChaoZhang est là., Date: 2024-02-19 11:52:40 Je suis désolé
Les étiquettes:

img

Résumé

La stratégie de rupture de tendance double intègre plusieurs indicateurs techniques, y compris les lignes de tendance, les croisements de moyenne mobile et les ruptures de canal de prix, afin d'identifier les points tournants potentiels du marché.

La logique de la stratégie

Tendance

La stratégie utilise d'abord des hauts et des bas pour diviser les tendances haussières et baissières.

Moyenne mobile croisée

La stratégie adopte une moyenne mobile à court terme de 5 jours et une moyenne mobile à long terme de 34 jours pour les transactions croisées rapides et lentes.

Chaîne de prix

Un canal de prix de 5 jours est également configuré dans la stratégie. Une rupture au-dessus de la bande supérieure déclenche une entrée longue et une rupture en dessous de la bande inférieure déclenche une entrée courte pour capturer les ruptures de prix à court terme.

Les trois types d'indicateurs techniques sont intégrés dans une seule stratégie pour former un mécanisme de double confirmation robuste, évitant les faux échanges.

Les avantages

  1. Intégre plusieurs indicateurs pour des signaux relativement fiables, réduisant les pertes de fausses ruptures.

  2. Les MA rapides et les canaux de prix capturent rapidement les changements de tendance à court terme.

  3. Structure de code propre avec des paramètres réglables pour l'optimisation sur différents produits et délais.

  4. Combine le suivi des tendances et les signaux de rupture pour la rentabilité dans des tendances fortes et pour éviter les fléchettes sur les marchés en marge.

Les risques

  1. Il peut y avoir certains risques de fausses ruptures, en particulier dans les scénarios de plage, entraînant des pertes.

  2. Le caractère retardé des croisements de l'AM entraîne un risque d'achat de sommets ou de vente de fonds après un renversement de tendance majeur.

  3. Plusieurs indicateurs intégrés nécessitent un backtesting intensif et des calculs pour l'ajustement des paramètres.

  • Les indicateurs de volume peuvent être ajoutés pour la validation des ruptures, par exemple pour expansion du volume des ruptures.

  • Les indicateurs de survente/surachat empêchent les scénarios d'épuisement d'achat/de vente.

  • Stop loss pour contrôler les pertes sur les faux métiers.

  • L'apprentissage automatique pour trouver des paramètres optimaux rapidement à travers des données historiques massives.

Amélioration

  1. Ajouter des filtres de volume ou de RSI pour confirmer des changements de tendance fiables, en définissant des filtres stricts pour éviter les pertes dues à de fausses ruptures.

  2. Ajustez les paramètres de l'AM et du canal pour les différents produits en fonction de leurs caractéristiques.

  3. Ajoutez des mécanismes de stop loss via le stop loss de suivi, les ordres stop limit pour limiter les pertes par transaction.

  4. Adopter des approches adaptatives pour négocier moins fréquemment sur les marchés à fourchette et plus souvent lors de fortes tendances établies.

  5. Former des modèles d'apprentissage en profondeur pour générer des signaux d'achat/vente au lieu d'utiliser uniquement des indicateurs techniques, en tirant parti des réseaux neuronaux capacités de reconnaissance de modèles pour trouver des stratégies plus prédictives.

Conclusion

Cette stratégie forme un système de double confirmation en combinant plusieurs indicateurs techniques populaires, capables de capturer efficacement les changements de tendance avec des résultats de backtest relativement stables.


/*backtest
start: 2024-02-11 00:00:00
end: 2024-02-18 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © FinanceUpPvtLtd

//@version=5
strategy("FINANCE UP FREE STRATEGY (+919665229664)", overlay=true)

// Script 01 - Trendlines
length_tl = input.int(14, 'Swing Detection Lookback')
mult_tl = input.float(1., 'Slope', minval=0, step=.1)
calcMethod_tl = input.string('Atr', 'Slope Calculation Method', options=['Atr', 'Stdev', 'Linreg'])
backpaint_tl = input(true, tooltip='Backpainting offset displayed elements in the past. Disable backpainting to see real-time information returned by the indicator.')
upCss_tl = input(color.teal, 'Up Trendline Color', group='Style')
dnCss_tl = input(color.red, 'Down Trendline Color', group='Style')
showExt_tl = input(true, 'Show Extended Lines')

var upper_tl = 0.
var lower_tl = 0.
var slope_ph_tl = 0.
var slope_pl_tl = 0.
var offset_tl = backpaint_tl ? length_tl : 0
n_tl = bar_index
src_tl = close
ph_tl = ta.pivothigh(length_tl, length_tl)
pl_tl = ta.pivotlow(length_tl, length_tl)
slope_tl = switch calcMethod_tl
    'Atr'    => ta.atr(length_tl) / length_tl * mult_tl
    'Stdev'  => ta.stdev(src_tl, length_tl) / length_tl * mult_tl
    'Linreg' => math.abs(ta.sma(src_tl * n_tl, length_tl) - ta.sma(src_tl, length_tl) * ta.sma(n_tl, length_tl)) / ta.variance(n_tl, length_tl) / 2 * mult_tl
slope_ph_tl := ph_tl ? slope_tl : slope_ph_tl
slope_pl_tl := pl_tl ? slope_tl : slope_pl_tl
upper_tl := ph_tl ? ph_tl : upper_tl - slope_ph_tl
lower_tl := pl_tl ? pl_tl : lower_tl + slope_pl_tl
var upos_tl = 0
var dnos_tl = 0
upos_tl := ph_tl ? 0 : close > upper_tl - slope_ph_tl * length_tl ? 1 : upos_tl
dnos_tl := pl_tl ? 0 : close < lower_tl + slope_pl_tl * length_tl ? 1 : dnos_tl

// var uptl_tl = line.new(na, na, na, na, color=upCss_tl, style=line.style_dashed, extend=extend.right)
// var dntl_tl = line.new(na, na, na, na, color=dnCss_tl, style=line.style_dashed, extend=extend.right)
// if ph_tl and showExt_tl
//     uptl_tl.set_xy1(n_tl - offset_tl, backpaint_tl ? ph_tl : upper_tl - slope_ph_tl * length_tl)
//     uptl_tl.set_xy2(n_tl - offset_tl + 1, backpaint_tl ? ph_tl - slope_tl : upper_tl - slope_ph_tl * (length_tl + 1))
// if pl_tl and showExt_tl
//     dntl_tl.set_xy1(n_tl - offset_tl, backpaint_tl ? pl_tl : lower_tl + slope_pl_tl * length_tl)
//     dntl_tl.set_xy2(n_tl - offset_tl + 1, backpaint_tl ? pl_tl + slope_tl : lower_tl + slope_pl_tl * (length_tl + 1))

plot(backpaint_tl ? upper_tl : upper_tl - slope_ph_tl * length_tl, 'Upper', color=ph_tl ? na : upCss_tl, offset=-offset_tl)
plot(backpaint_tl ? lower_tl : lower_tl + slope_pl_tl * length_tl, 'Lower', color=pl_tl ? na : dnCss_tl, offset=-offset_tl)

plotshape(upos_tl > upos_tl[1] ? low : na, "Upper Break", shape.labelup, location.absolute, upCss_tl, text="B", textcolor=color.white, size=size.tiny)
plotshape(dnos_tl > dnos_tl[1] ? high : na, "Lower Break", shape.labeldown, location.absolute, dnCss_tl, text="B", textcolor=color.white, size=size.tiny)

alertcondition(upos_tl > upos_tl[1], 'Upward Breakout', 'Price broke the down-trendline upward')
alertcondition(dnos_tl > dnos_tl[1], 'Downward Breakout', 'Price broke the up-trendline downward')

// Script 02 - Channel Breakout
length_channel = input.int(title="Channel Length", minval=1, maxval=1000, defval=5)
upBound_channel = ta.highest(high, length_channel)
downBound_channel = ta.lowest(low, length_channel)
if (not na(close[length_channel]))
    strategy.entry("LE-LE", strategy.long, stop=upBound_channel + syminfo.mintick, comment="LE-LE")
strategy.entry("BECH-DE", strategy.short, stop=downBound_channel - syminfo.mintick, comment="BECH-DE")

// Script 03 - MA Cross
shortlen_ma = input.int(5, "Short MA Length", minval=1)
longlen_ma = input.int(34, "Long MA Length", minval=1)
short_ma = ta.sma(close, shortlen_ma)
long_ma = ta.sma(close, longlen_ma)
plot(short_ma, color=#FF6D00, title="Short MA")
plot(long_ma, color=#43A047, title="Long MA")
plot(ta.cross(short_ma, long_ma) ? short_ma : na, color=#2962FF, style=plot.style_cross, linewidth=4, title="Cross")


Plus de