The Broken High/Low strategy is a trend-following strategy that tracks price breakouts beyond the high or low of the previous candlestick. It uses moving averages to determine the trend direction and enters on breakout points, with stop loss or trailing stop loss to lock in profits.
The key conditions for entry and exit determined by this strategy are:
The strategy also uses filters based on the second reversal candle to avoid false breakouts and ensure signal reliability.
Risk Control Measures:
This strategy can be optimized in the following aspects:
The Broken High/Low strategy is overall a mature trend-following strategy. With the help of moving averages for auxiliary judgment, it can capture certain degree of trends. The stop loss and trailing stop mechanisms also help lock in profits. Through continuous testing and optimization, the parameters and performance of this strategy can become more outstanding.
/*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)