Стратегия бэктестинга прорыва максимума-минимума


Дата создания: 2023-11-27 15:37:13 Последнее изменение: 2023-11-27 15:37:13
Копировать: 0 Количество просмотров: 435
1
Подписаться
1237
Подписчики

Стратегия бэктестинга прорыва максимума-минимума

Обзор

Высоко-низкий прорывный отсчет является стратегией отслеживания тенденции, использующей исторические высоты и низкие точки акций, чтобы определить, преодолела ли цена эти высокие и низкие точки. Он производит сигнал покупки, рассчитывая максимальные и минимальные цены за определенный период, когда цена текущего периода превышает максимальную цену последнего определенного периода; сигнал продажи, когда цена падает ниже минимальной цены последнего определенного периода.

Стратегический принцип

Основная логика этой стратегии заключается в том, чтобы рассчитать наивысшую и наименьшую цены за определенный период времени (например, 50 K-линий). При расчете наивысшей и наименьшей цены можно выбрать закрытую цену или наивысшую и наименьшую цену (например, наивысшую и наименьшую цену). Затем можно определить, превышает ли текущая цена закрытия или наивысшей цены на линии K наивысшую цену за последний определенный период времени.

После получения сигнала “купить” стратегия покупает по этой цене и устанавливает цены “стоп-лосс” и “стоп-приз”. Когда цена касается цены “стоп-лосс”, стратегия останавливает убытки и выходит; когда цена касается цены “стоп-приз”, стратегия останавливает и выходит. Логика сигналов “продать” аналогична.

Анализ преимуществ

Такой подход имеет следующие преимущества:

  1. Логика стратегии проста, легко понятна и реализуема.
  2. Умение улавливать тенденционные особенности цен на акции, двигаясь в соответствии с ценовой тенденцией.
  3. Найдите наиболее подходящую комбинацию параметров стратегии.
  4. Встроенные механизмы остановки и торможения позволяют контролировать риск.
  5. Визуализированное отображение очень удобствует корректировке параметров и анализу результатов.

Анализ рисков

Однако эта стратегия также несет в себе некоторые риски:

  1. Обычно это связано с многократными и чрезмерными сделками.
  2. В то же время, когда цена колеблется, часто открываются позиции.
  3. Если показатель не соответствует параметрам, то мы можем упустить большую возможность тренда.
  4. Не учитывая частоту и величину колебаний цен на акции.
  5. Сигнал не проверяется в сочетании с другими показателями.

Для того, чтобы контролировать эти риски, можно оптимизировать следующие аспекты:

  1. Сокращение приостановки и увеличение времени удержания.
  2. Условия для открытия позиций должны быть повышены, чтобы избежать частого открытия.
  3. Оптимизируйте параметры, чтобы найти оптимальную комбинацию параметров.
  4. В сочетании с другими показателями фильтрует сигналы.

Направление оптимизации

Эта стратегия может быть оптимизирована в следующих аспектах:

  1. Оптимальные параметры могут быть найдены путем более систематического тестирования различных комбинаций параметров.

  2. В сочетании с другими индикаторами фильтруют сигналы. Например, в сочетании с индикаторами движущихся средних, только тогда, когда цены превышают максимальные цены, и только тогда, когда долгосрочные движущиеся средние пересекают краткосрочные движущиеся средние.

  3. Принимать во внимание частоту колебаний цен на акции. Например, можно использовать ATR, чтобы соответственно ослабить прорыв, когда цены на акции колеблются.

  4. Различают трендовые и волатильные рынки. В период, когда тенденция очевидна, параметры должны быть расслаблены, чтобы отслеживать тенденцию. В период волатильности рынка параметры должны быть ужесточены.

  5. Повышение механизмов управления позициями. Например, приостановка открытия позиций при достижении определенной доли убытков и т. д.

Подвести итог

В целом, стратегия высокого и низкого прорыва является простой практической стратегией отслеживания тенденций. Она определяет торговый сигнал, определяя, будет ли цена преодолевать максимальные и минимальные цены в течение определенного периода. Эта стратегия имеет преимущества, такие как простота, отслеживание тенденций, параметрическая оптимизация, а также существует риск создания чрезмерной торговли и невозможности обрабатывать волатильные рынки. Мы можем оптимизировать эту стратегию в нескольких аспектах, таких как параметрическая оптимизация, индикаторная фильтрация и управление позициями, чтобы ее эффективность могла быть улучшена.

Исходный код стратегии
/*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)