La stratégie High Low Breaker Backtest est une stratégie de suivi des tendances qui utilise les hauts et les bas historiques d'un stock pour déterminer si le prix dépasse ces plages de hauts-bas. Elle calcule le prix le plus élevé et le prix le plus bas sur une certaine période, et génère des signaux d'achat lorsque le prix de la période en cours dépasse le prix le plus élevé sur une période récente, et des signaux de vente lorsque le prix dépasse le prix le plus bas sur une période récente.
La logique de base de cette stratégie est de calculer le prix le plus élevé et le prix le plus bas sur un certain nombre de barres (défaut 50 barres). Lors du calcul des prix les plus élevés / les plus bas, il permet d'utiliser les prix de clôture ou les prix élevés / bas réels (défaut d'utiliser les prix élevés / bas). Ensuite, il vérifie si le prix de clôture ou le prix élevé de la barre actuelle dépasse le prix le plus élevé au cours de la dernière période. Si oui et qu'il y a eu plus d'un nombre minimum de barres (défaut 30 barres) depuis la dernière barre de prix la plus élevée, il génère un signal d'achat. De même, si le prix de clôture ou le prix bas de la barre actuelle dépasse le prix le plus bas au cours de la dernière période et qu'un nombre minimum de barres depuis la dernière barre de prix le plus bas est passé, il génère un signal de vente.
Après avoir généré des signaux d'achat, la stratégie entre dans des positions longues à ce prix, avec un prix de stop loss et un prix de profit.
Cette stratégie de backtest à haut et à bas disjoncteur présente les avantages suivants:
Cette stratégie comporte également des risques:
Les aspects suivants peuvent contribuer à atténuer ces risques:
Cette stratégie peut être améliorée de la manière suivante:
En résumé, la stratégie High Low Breaker Backtest est une stratégie simple et pratique de suivi des tendances. Elle génère des signaux de trading basés sur la rupture des prix périodiques des prix les plus élevés / les plus bas. La stratégie présente des avantages tels que la simplicité, le suivi des tendances et l'optimisation des paramètres, mais aussi des risques tels que le sur-trading et l'incapacité de gérer les marchés oscillants. Des optimisations supplémentaires peuvent être effectuées autour des paramètres, des filtres de signaux, de la taille des positions, etc. pour améliorer sa performance.
/*backtest start: 2023-11-25 00:00:00 end: 2023-11-26 00:00:00 period: 1m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 strategy("High/Low Breaker Backtest 1.0", overlay=true, initial_capital=1000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, max_bars_back=700) // Strategy Settings takeProfitPercentageLong = input(.1, title='Take Profit Percentage Long', type=float)/100 stopLossPercentageLong = input(0.15, title='Stop Loss Percentage Long', type=float)/100 takeProfitPercentageShort = input(.1, title='Take Profit Percentage Short', type=float)/100 stopLossPercentageShort = input(0.15, title='Stop Loss Percentage Short', type=float)/100 candlesBack = input(title="Number of candles back", defval=50) useHighAndLows = input(true, title="Use high and lows (uncheck to use close)", defval=true) lastBarsBackMinimum = input(title="Number of candles back to ignore for last high/low", defval=30) showHighsAndLows = input(true, title="Show high/low lines", defval=true) getIndexOfLowestInSeries(series, period) => index = 0 current = series for i = 1 to period if series[i] <= current index := i current := series[i] index getIndexOfHighestInSeries(series, period) => index = 0 current = series for i = 1 to period if series[i] >= current index := i current := series[i] index indexOfHighestInRange = getIndexOfHighestInSeries(useHighAndLows ? high : close, candlesBack) indexOfLowestInRange = getIndexOfLowestInSeries(useHighAndLows ? low : close, candlesBack) max = useHighAndLows ? high[indexOfHighestInRange] : close[indexOfHighestInRange] min = useHighAndLows ? low[indexOfLowestInRange] : close[indexOfLowestInRange] barsSinceLastHigh = indexOfHighestInRange barsSinceLastLow = indexOfLowestInRange isNewHigh = (useHighAndLows ? high > max[1] : close > max[1]) and (barsSinceLastHigh[1] + 1 > lastBarsBackMinimum) isNewLow = (useHighAndLows ? low < min[1] : close < min[1]) and (barsSinceLastLow[1] + 1 > lastBarsBackMinimum) alertcondition(condition=isNewHigh, title="New High", message="Last High Broken") alertcondition(condition=isNewLow, title="New Low", message="Last Low Broken") if high > max max := high barsSinceLastHigh := 0 if low < min min := low barsSinceLastLow := 0 plot( showHighsAndLows ? max : na, color=red, style=line, title="High", linewidth=3) plot( showHighsAndLows ? min : na, color=green, style=line, title="Low", linewidth=3) // Strategy Entry/Exit Logic goLong =isNewHigh longStopLevel = strategy.position_avg_price * (1 - stopLossPercentageLong) longTakeProfitLevel = strategy.position_avg_price * (1 + takeProfitPercentageLong) goShort = isNewLow shortStopLevel = strategy.position_avg_price * (1 + stopLossPercentageShort) shortTakeProfitLevel = strategy.position_avg_price * (1 - takeProfitPercentageShort) strategy.entry("Long", strategy.long, when=goLong) strategy.exit("Long Exit", "Long", stop=longStopLevel, limit=longTakeProfitLevel) strategy.entry("Short", strategy.short, when=goShort) strategy.exit("Short Exit", "Short", stop=shortStopLevel, limit=shortTakeProfitLevel) plot(goShort ? shortStopLevel : na, color=yellow, style=linebr, linewidth=2) plot(goShort ? shortTakeProfitLevel : na, color=blue, style=linebr, linewidth=2) plot(goLong ? longStopLevel : na, color=yellow, style=linebr, linewidth=2) plot(goLong ? longTakeProfitLevel : na, color=blue, style=linebr, linewidth=2)