Стратегия обратного теста с высоким низким разрывом

Автор:Чао Чжан, Дата: 2023-11-27 15:37:13
Тэги:

img

Обзор

Стратегия High Low Breaker Backtest - это стратегия, которая использует исторические максимумы и минимумы акций для определения того, выходит ли цена из этих высоко-низких диапазонов. Она рассчитывает самую высокую цену и самую низкую цену за определенный период и генерирует сигналы покупки, когда цена текущего периода превышает самую высокую цену за последний период, и сигналы продажи, когда цена превышает самую низкую цену за последний период.

Логика стратегии

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

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

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

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

  1. Логика проста и легко понять/внедрить.
  2. Он может зафиксировать некоторые тенденционные характеристики цен на акции.
  3. Параметры могут быть оптимизированы для поиска лучших комбинаций параметров.
  4. Встроенный стоп-лосс и контроль прибыли контролирует риск.
  5. Визуализация значительно облегчает настройку параметров и анализ результатов.

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

Эта стратегия также сопряжена с некоторыми рисками:

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

Следующие аспекты могут помочь смягчить эти риски:

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

Руководство по оптимизации

Эта стратегия может быть улучшена следующими способами:

  1. Оптимизация параметров с использованием более систематического тестирования.
  2. Добавьте фильтры сигналов с другими показателями, например, скользящими средними.
  3. Принимать во внимание волатильность цен, используя ATR для адаптации порогов выхода.
  4. Отличить тенденции от колебаний рынков для адаптации параметров.
  5. Улучшить правила размещения позиций, например, прекратить открывать новые позиции после значительных потерь.

Резюме

В целом, стратегия 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)


Больше