Высоко-низкий прорывный отсчет является стратегией отслеживания тенденции, использующей исторические высоты и низкие точки акций, чтобы определить, преодолела ли цена эти высокие и низкие точки. Он производит сигнал покупки, рассчитывая максимальные и минимальные цены за определенный период, когда цена текущего периода превышает максимальную цену последнего определенного периода; сигнал продажи, когда цена падает ниже минимальной цены последнего определенного периода.
Основная логика этой стратегии заключается в том, чтобы рассчитать наивысшую и наименьшую цены за определенный период времени (например, 50 K-линий). При расчете наивысшей и наименьшей цены можно выбрать закрытую цену или наивысшую и наименьшую цену (например, наивысшую и наименьшую цену). Затем можно определить, превышает ли текущая цена закрытия или наивысшей цены на линии K наивысшую цену за последний определенный период времени.
После получения сигнала “купить” стратегия покупает по этой цене и устанавливает цены “стоп-лосс” и “стоп-приз”. Когда цена касается цены “стоп-лосс”, стратегия останавливает убытки и выходит; когда цена касается цены “стоп-приз”, стратегия останавливает и выходит. Логика сигналов “продать” аналогична.
Такой подход имеет следующие преимущества:
Однако эта стратегия также несет в себе некоторые риски:
Для того, чтобы контролировать эти риски, можно оптимизировать следующие аспекты:
Эта стратегия может быть оптимизирована в следующих аспектах:
Оптимальные параметры могут быть найдены путем более систематического тестирования различных комбинаций параметров.
В сочетании с другими индикаторами фильтруют сигналы. Например, в сочетании с индикаторами движущихся средних, только тогда, когда цены превышают максимальные цены, и только тогда, когда долгосрочные движущиеся средние пересекают краткосрочные движущиеся средние.
Принимать во внимание частоту колебаний цен на акции. Например, можно использовать ATR, чтобы соответственно ослабить прорыв, когда цены на акции колеблются.
Различают трендовые и волатильные рынки. В период, когда тенденция очевидна, параметры должны быть расслаблены, чтобы отслеживать тенденцию. В период волатильности рынка параметры должны быть ужесточены.
Повышение механизмов управления позициями. Например, приостановка открытия позиций при достижении определенной доли убытков и т. д.
В целом, стратегия высокого и низкого прорыва является простой практической стратегией отслеживания тенденций. Она определяет торговый сигнал, определяя, будет ли цена преодолевать максимальные и минимальные цены в течение определенного периода. Эта стратегия имеет преимущества, такие как простота, отслеживание тенденций, параметрическая оптимизация, а также существует риск создания чрезмерной торговли и невозможности обрабатывать волатильные рынки. Мы можем оптимизировать эту стратегию в нескольких аспектах, таких как параметрическая оптимизация, индикаторная фильтрация и управление позициями, чтобы ее эффективность могла быть улучшена.
/*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)