Стратегия High Low Breaker Backtest - это стратегия, которая использует исторические максимумы и минимумы акций для определения того, выходит ли цена из этих высоко-низких диапазонов. Она рассчитывает самую высокую цену и самую низкую цену за определенный период и генерирует сигналы покупки, когда цена текущего периода превышает самую высокую цену за последний период, и сигналы продажи, когда цена превышает самую низкую цену за последний период.
Основная логика этой стратегии заключается в том, чтобы рассчитать самую высокую цену и самую низкую цену за определенное количество бар (по умолчанию 50 бар). При расчете самой высокой/низкой цены, он позволяет использовать близкие цены или фактические высокие/низкие цены (по умолчанию, чтобы использовать высокие/низкие цены). Затем он проверяет, превышает ли текущая цена закрытия бар или высокая цена самую высокую цену за последний период. Если да, и это было больше, чем минимальное количество бар (по умолчанию 30 бар) с последнего самого высокого ценового бар, он генерирует сигнал покупки. Точно так же, если текущая цена закрытия бар или низкая цена превышает самую низкую цену за последний период и минимальное количество бар с последней низкой цены, он генерирует сигнал продажи.
После генерации сигналов покупки стратегия входит в длинные позиции по этой цене, с установленной ценой стоп-лосса и ценой получения прибыли.
Эта стратегия обратного тестирования с высоким и низким разрывом имеет следующие преимущества:
Эта стратегия также сопряжена с некоторыми рисками:
Следующие аспекты могут помочь смягчить эти риски:
Эта стратегия может быть улучшена следующими способами:
В целом, стратегия High Low Breaker Backtest - это простая и практичная стратегия следования трендам. Она генерирует торговые сигналы, основанные на периодическом перерыве цены. Стратегия имеет такие преимущества, как простота, последовательность трендов и оптимизация параметров, но также такие риски, как чрезмерная торговля и неспособность справляться с колеблющимися рынками. Для улучшения ее производительности могут быть выполнены дальнейшие оптимизации вокруг параметров, фильтров сигналов, размещения позиций и т. Д.
/*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)