Stratégie de cassure de la double tortue


Date de création: 2023-11-28 16:25:41 Dernière modification: 2023-11-28 16:25:41
Copier: 0 Nombre de clics: 692
1
Suivre
1621
Abonnés

Stratégie de cassure de la double tortue

Aperçu

La stratégie de rupture de deux côtes combine la stratégie de rupture de la loi de la transaction de la côte et le principe de stop-loss mobile de Linda Raschke, avec une excellente performance de rupture et un contrôle rigoureux du risque. La stratégie surveille simultanément la hausse et la baisse des prix, établit des positions en plus ou en moins lorsque la rupture se produit, et utilise des positions de gestion de stop-loss et de stop-loss mobiles.

Principe de stratégie

La logique de base est de faire un short à la rupture d’un short à la hauteur d’un grand cycle et un short à la rupture d’un petit cycle à la basse d’un grand cycle. Après la création de la position, définissez un stop-loss mobile et un stop-stop mobile, en confirmant d’abord le risque de stop-loss. Lorsque le nombre de positions accumulées atteint le nombre de stop-loss définis, annulez le stop-loss au cours du prochain cycle, puis sortez de la position et définissez un stop-loss mobile et un stop-stop mobile pour verrouiller les bénéfices et suivre l’écart.

Voici les étapes à suivre:

  1. Calculer le grand cycle ((20 cycles) à hauteur de prévHigh et le petit cycle ((4 cycles) à hauteur de smallPeriodHigh。
  2. Lorsque le dernier K-ligne est plus élevé que le précédent, et que le précédent est plus élevé que le petit PériodeHigh, cela indique que le plus haut de la grande période a dépassé le plus haut de la petite période, et qu’il n’y a pas de position vide.
  3. Il est possible de mettre en place un stop-loss mobile après la création d’un emplacement et d’annuler le stop-loss après le renversement de la position afin d’éviter le stop-loss.
  4. Lorsque le nombre de positions détenues atteint le nombre de cycles d’arrêt mobile fixé (actuellement 0 cycles), la moitié des positions est libérée au cours du prochain cycle et un arrêt mobile et un arrêt mobile sont fixés, le décalage est suivi et les bénéfices sont bloqués.
  5. Pour les ruptures de bas, il est similaire de faire des positions multiples sur la base de la relation entre les ruptures de bas de grande période et de bas de petite période.

Analyse des avantages

Il s’agit d’une stratégie de rupture globale qui présente les avantages suivants:

  1. La combinaison de la méthode de négociation de deux cycles permet d’identifier efficacement les signaux de rupture.
  2. Le risque est strictement contrôlé par l’utilisation de technologies de stop-loss et de stop-motion mobiles pour éviter des pertes massives.
  3. Il a joué deux fois, une fois pour bloquer la moitié de sa position, puis pour bloquer la totalité de sa position en déplaçant la position, pour bloquer les bénéfices.
  4. Il est possible de combiner les opérations bidirectionnelles de survol et de décollage, ce qui correspond aux caractéristiques du marché de l’échange de survol.
  5. L’effet de détection est excellent, avec une forte capacité de performance sur disque dur.

Analyse des risques

Les principaux risques et les mesures à prendre sont les suivants:

  1. Risque de fausse percée. Les paramètres du cycle doivent être ajustés de manière appropriée pour assurer l’efficacité de la percée.
  2. Le risque de chute de la chasse au mortier. Le filtrage doit être effectué en fonction de la tendance et de la forme, afin d’éviter de prendre position à la fin de la tendance.
  3. Le risque de rupture de stop-loss. La largeur de stop-loss peut être allégée de manière appropriée, en s’assurant qu’il y a suffisamment de place.
  4. Le risque d’arrêt mobile est trop sensible. Le réglage du point de glissement après l’arrêt doit être ajusté pour éviter les pertes inutiles.

Direction d’optimisation

La stratégie peut également être optimisée dans les domaines suivants:

  1. Le filtrage des percées augmente le nombre de transactions et garantit la véracité des percées.
  2. L’utilisation d’indicateurs de tendance pour éviter de prendre position à la fin d’une tendance
  3. Le moment de la percée est à juger en combinant plus de cycles de temps.
  4. Ajout d’algorithmes d’apprentissage automatique et de paramètres d’optimisation dynamique.
  5. Combiner avec d’autres stratégies et mettre en place un arbitrage statistique

Résumer

La stratégie de rupture des deux côtes utilise des techniques de double cycle, la théorie de la rupture et des méthodes de gestion des risques rigoureuses pour assurer la stabilité des gains tout en maintenant un taux de réussite élevé. Le modèle de stratégie est simple et clair, facile à comprendre et à appliquer, et est une excellente stratégie quantitative.

Code source de la stratégie
/*backtest
start: 2022-11-21 00:00:00
end: 2023-11-27 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy(title = "Turtle soup plus one", shorttitle = "Turtle soup plus one", overlay=true)

bigPeriod = input(20)
smallPeriod = input(4)
takeProfitBars = input(0)
trailingStop = input(5, title = "Trailing stop percentages")
if (strategy.position_size == 0)
    strategy.cancel("Long")
    strategy.cancel("Short")
    strategy.cancel("Stop")



stopLossPrice = 0.1
stopLossPrice := nz(stopLossPrice[1])
takeProfitStarted = false
takeProfitStarted := nz(takeProfitStarted[1])

prevHigh = highest(high, bigPeriod - smallPeriod)[smallPeriod]
smallPeriodHigh = highest(high, smallPeriod - 1)[1]
if (high > prevHigh and prevHigh > smallPeriodHigh and close > prevHigh and strategy.position_size == 0)
    strategy.order("Short", strategy.short, stop = prevHigh)

if strategy.position_size < 0 and strategy.position_size[1] == 0
    stopLossPrice := high[1]
    strategy.order("Stop", strategy.long, qty = -strategy.position_size, stop = stopLossPrice)
    takeProfitStarted := false

if (strategy.position_size < 0 and sum(strategy.position_size, takeProfitBars) == strategy.position_size * takeProfitBars and close < strategy.position_avg_price and not takeProfitStarted)
    takeProfitStarted := true
    strategy.cancel("Stop")
    strategy.order("ExitHalf", strategy.long, qty = ceil(-strategy.position_size / 2), stop = close)
    if (strategy.position_size != -1)
        strategy.exit("ExitFull", "Short", qty = -strategy.position_size - ceil(-strategy.position_size / 2), loss = stopLossPrice, trail_price  = close, trail_offset = -(close - strategy.position_avg_price) * trailingStop / 100 / syminfo.mintick)
        

prevLow = lowest(low, bigPeriod - smallPeriod)[smallPeriod]
smallPeriodLow = lowest(low, smallPeriod - 1)[1]
if (low < prevLow and prevLow < smallPeriodLow and close < prevLow and strategy.position_size == 0)
    strategy.order("Long", strategy.long, stop = prevLow)

if strategy.position_size > 0 and strategy.position_size[1] == 0
    stopLossPrice := low[1]
    strategy.order("Stop", strategy.short, qty = strategy.position_size, stop = stopLossPrice)
    takeProfitStarted := false

if (strategy.position_size > 0 and sum(strategy.position_size, takeProfitBars) == strategy.position_size * takeProfitBars and close > strategy.position_avg_price and not takeProfitStarted)
    takeProfitStarted := true
    strategy.cancel("Stop")
    strategy.order("ExitHalf", strategy.short, qty = ceil(strategy.position_size / 2), stop = close)
    if (strategy.position_size != 1)
        strategy.exit("ExitFull", "Long", qty = strategy.position_size - ceil(strategy.position_size / 2),loss = stopLossPrice, trail_price  = close, trail_offset = (close - strategy.position_avg_price) * trailingStop / 100 / syminfo.mintick)

// === Backtesting Dates ===
testPeriodSwitch = input(false, "Custom Backtesting Dates")
testStartYear = input(2018, "Backtest Start Year")
testStartMonth = input(3, "Backtest Start Month")
testStartDay = input(6, "Backtest Start Day")
testStartHour = input(08, "Backtest Start Hour")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,testStartHour,0)
testStopYear = input(2038, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(14, "Backtest Stop Day")
testStopHour = input(14, "Backtest Stop Hour")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,testStopHour,0)
testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
isPeriod = testPeriodSwitch == true ? testPeriod() : true
// === /END
if not isPeriod
    strategy.cancel_all()
    strategy.close_all()