Stratégie haut/bas brisée

Auteur:ChaoZhang est là., Date: 2023-12-22 à 12h59
Les étiquettes:

img

Résumé

La stratégie Broken High/Low est une stratégie de suivi de tendance qui suit les écarts de prix au-delà du haut ou du bas du chandelier précédent.

La logique de la stratégie

Les principales conditions d'entrée et de sortie déterminées par cette stratégie sont les suivantes:

  1. Identifier si le chandelier est vert ou rouge pour déterminer s'il est une bougie vers le haut ou vers le bas
  2. Vérifiez si la bougie actuelle casse le plus haut ou le plus bas de la bougie précédente
  3. Utiliser des moyennes mobiles rapides et lentes pour définir la direction de la tendance
  4. Aller long quand une bougie haussière se déplace au-dessus du haut d'une bougie basse précédente, aller court quand une bougie basse se déplace au-dessous du bas d'une bougie haussière précédente
  5. Les conditions de sortie sont déclenchées par stop loss ou trailing stop; peut également sortir immédiatement si une bougie d'inversion apparaît

La stratégie utilise également des filtres basés sur la deuxième bougie d'inversion pour éviter les fausses ruptures et assurer la fiabilité du signal.

Analyse des avantages

  • Une orientation stratégique claire, des opérations de rupture faciles à comprendre
  • Assure un jugement de tendance correct en combinant deux moyennes mobiles
  • Le trailing stop permet de réaliser plus de bénéfices
  • Les filtres à bougies inversées aident à éviter de poursuivre les hauts et de tuer les bas

Analyse des risques

  • Une rupture ratée peut entraîner des pertes liées aux opérations à très court terme.
  • Risque plus élevé de fausse rupture sur les marchés à fourchette
  • Les moyennes mobiles doubles peuvent être retardées, ce qui conduit à des erreurs de jugement

Mesures de contrôle des risques:

  1. Sélectionner des indices ou des indices de référence majeurs afin d'éviter un risque élevé pour les stocks individuels
  2. Optimiser les paramètres de moyenne mobile pour améliorer la précision de jugement
  3. Élargir raisonnablement la plage de stop-loss pour contrôler les pertes d'une seule transaction

Directions d'optimisation

Cette stratégie peut être optimisée dans les aspects suivants:

  1. Tester différentes combinaisons de paramètres de moyenne mobile
  2. Essai intégrant d'autres indicateurs techniques pour le jugement combiné
  3. Optimiser les paramètres des niveaux d'entrée et de stop loss
  4. Ajouter des règles de filtrage quantitatif pour sélectionner des sous-jacents de haute qualité
  5. Incorporer des algorithmes d'apprentissage automatique pour l'optimisation adaptative des paramètres

Résumé

La stratégie Broken High/Low est globalement une stratégie de suivi de tendance mature. Avec l'aide de moyennes mobiles pour un jugement auxiliaire, elle peut capturer un certain degré de tendances. Les mécanismes de stop loss et de trailing stop aident également à verrouiller les profits. Grâce à des tests et à l'optimisation continus, les paramètres et les performances de cette stratégie peuvent devenir plus remarquables.


/*backtest
start: 2022-12-15 00:00:00
end: 2023-12-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Broken High/Low Strategy", overlay=true, initial_capital = 5000, default_qty_value = 25, pyramiding = 10, default_qty_type= strategy.percent_of_equity)

useEMAForStop = input.bool(false, 'Use trail stop EMA', group = 'Exit strategy')
trailStopMALength = input(8, 'Trail stop EMA length', group = 'Exit strategy')

fastMALength = input(5 , 'Fast MA length', group = 'Trend strength')
fastEMAEnabled = input.bool(false, 'Fast EMA enabled (default is SMA)', group = 'Trend strength')

slowMALength = input(10, 'Slow MA length', group = 'Trend strength')
slowEMAEnabled = input.bool(false, 'Slow EMA enabled (default is SMA)', group = 'Trend strength')

ignoreSlowMA = input.bool(false, 'Use fast MA for trend ignoring slow MA', group = 'Trend strength')

useOpposingBarAsExit = input.bool(false, 'Using opposing bar as exit', group = 'Exit strategy')
secondEntryEnabled = input.bool(false, 'Second bar that eliminates opposing bar for entry', group = 'Trend strength')

longsEnabled = input.bool(true, 'Enable longs', group = 'Trade settings')
shortsEnabled = input.bool(true, 'Enable shorts', group = 'Trade settings')

fastMA = fastEMAEnabled ? ta.ema(close, fastMALength) : ta.sma(close, fastMALength)
slowMA = slowEMAEnabled ? ta.ema(close, slowMALength) : ta.sma(close, slowMALength)

FromMonth=input.int(defval=1,title="FromMonth",minval=1,maxval=12, group = 'Time filters')
FromDay=input.int(defval=1,title="FromDay",minval=1,maxval=31, group = 'Time filters')
FromYear=input.int(defval=1990,title="FromYear",minval=1900, group = 'Time filters')
ToMonth=input.int(defval=1,title="ToMonth",minval=1,maxval=12, group = 'Time filters')
ToDay=input.int(defval=1,title="ToDay",minval=1,maxval=31, group = 'Time filters')
ToYear=input.int(defval=9999,title="ToYear",minval=2017, group = 'Time filters')
start=timestamp(FromYear,FromMonth,FromDay,00,00)
finish=timestamp(ToYear,ToMonth,ToDay,23,59)
window()=>time>=start and time<=finish?true:false
afterStartDate = time >= start and time<=finish?true:false
closeTradesEOD = input.bool(false, 'Close trades end of day', group = 'Time filters')

trailStopMA = ta.ema(close, trailStopMALength)

isGreenCandle = close > open
isRedCandle = close < open
isBrokenHigh = close > open[1]
isPriorCandleRed = close[1] < open[1]
isPriorPriorCandleRed = close[2] < open[2]
isPriorPriorCandleGreen = close[2] > open[2]
isPriorCandleGreen = close[1] > open[1]
isBrokenLow = close < open[1]

isPriorRedCandleBroken = isGreenCandle and isPriorCandleRed and isBrokenHigh
isPriorGreenCandleBroken = isRedCandle and isPriorCandleGreen and isBrokenLow

isPriorPriorRedCandleBroken = secondEntryEnabled and not isPriorRedCandleBroken and isGreenCandle and isPriorPriorCandleRed ? close > open[2] : false
isPriorPriorGreenCandleBroken = secondEntryEnabled and not isPriorGreenCandleBroken and isRedCandle and isPriorPriorCandleGreen ? close < open[2] : false

longOpenCondition = (isPriorRedCandleBroken or isPriorPriorRedCandleBroken) and afterStartDate and (ignoreSlowMA ? close > fastMA : fastMA > slowMA) and longsEnabled
longCloseCondition = useOpposingBarAsExit ? isRedCandle : ta.crossunder(close, fastMA)
longCloseCondition := useEMAForStop ? ta.crossunder(close, trailStopMA) : longCloseCondition

shortOpenCondition = (isPriorGreenCandleBroken or isPriorPriorGreenCandleBroken) and afterStartDate and (ignoreSlowMA ? close < fastMA : fastMA < slowMA) and shortsEnabled
shortCloseCondition = useOpposingBarAsExit ? isGreenCandle : ta.crossover(close, fastMA)
shortCloseCondition := useEMAForStop ? ta.crossover(close, trailStopMA) : shortCloseCondition

if (longOpenCondition)
    strategy.entry("Long Entry", strategy.long)

if (longCloseCondition)
    strategy.close('Long Entry', 'Long Exit')

if (shortOpenCondition)
    strategy.entry("Short Entry", strategy.long)

if (shortCloseCondition)
    strategy.close('Short Entry', 'Short Exit')

if (closeTradesEOD and hour >= 14 and minute >= 30)
    strategy.close_all("EOD")

plot(useEMAForStop ? trailStopMA : na, linewidth = 2, color = color.red)
plot(fastMA)
plot(ignoreSlowMA ? na : slowMA, linewidth = 4)

Plus de