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

Автор:Чао Чжан, Дата: 2023-11-21 15:03:19
Тэги:

img

Обзор

Эта стратегия разработана на основе индикатора Bollinger Bands для создания динамической стратегии торговли прорывом. Она сочетает в себе условия фильтра тела свечи и цветового фильтра для поиска возможностей прорыва вокруг нижней полосы Боллинджера. Выходы основаны на фильтре тела. Стратегия автоматически управляет размером позиции и риском.

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

Расчет показателя

Во-первых, вычислить базовую линию и нижнюю полосу полос Боллинджера на основе низкой цены:

src = low
basis = sma(src, length) 
dev = mult * stdev(src, length)
lower = basis - dev

Где src - низкая цена, длина - период расчета, основа - скользящая средняя, dev - стандартное отклонение, а ниже - нижняя полоса.

mult обычно устанавливается на 2, что означает, что нижняя полоса находится в одном стандартном отклонении.

Условия фильтра

Стратегия включает в себя два фильтра:

Фильтр корпуса свечиИспользуйте размер тела nbody и его среднее содержание для определения, генерируйте торговый сигнал только тогда, когда nbody больше половины содержания.

Цветовой фильтр
Не затягивайте, когда свеча закрывается положительно (закрыть > открыть).

Торговые сигналы

Сделать длинный сигнал при выполнении следующих условий:

low < lower // price breaks lower band
close < open or usecol == false // color filter
nbody > abody / 2 or usebod == false // body filter  

Если размер тела вновь превышает половину среднего значения, положение приближения:

close > open and nbody > abody / 2  

Размер позиции

Стратегия автоматически рассчитывает размер сделки для экспоненциального роста позиции:

lot = strategy.position_size == 0 ? strategy.equity / close * capital / 100 : lot[1] 

Контроль рисков

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

when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59))

Преимущества

Динамический диапазон торговли

Нижняя полоса Боллинджера обеспечивает динамическую зону поддержки для улавливания ретриксов после трендов.

Двойной фильтр

Комбинация тела свечи и цветовых фильтров эффективно избегает ложных прорывов.

Автоматическое размещение позиций

Размеры позиций увеличиваются экспоненциально до 100% автоматического управления рисками.

Диапазон даты

Установление диапазона дат снижает риск, связанный с волатильностью рынка в определенные периоды.

Риски

Продолжительное снижение

При сильном восходящем тренде средние и верхние полосы BB могут быстро перемещаться вверх, вызывая длительное снижение.

Решение

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

Неудачный выход

Прорыв может потерпеть неудачу при отходе и повторном тестировании нижней полосы.

Решение

Добавьте стоп-лосс ниже уровня поддержки или добавьте логику для обнаружения неудачного повторного теста для быстрого стоп-лосса.

Усовершенствования

Добавить стоп-лосс

Оптимизировать стоп-лосс ниже поддержки на основе результатов бэкстеста.

Оптимизировать параметры

Прекрасно настроить фильтр тела, период пребывания, цвет фильтра и т.д., чтобы найти оптимальный.

Добавить фильтр тренда

Прекратите стратегию, когда это будет считаться бычьим рынком.

Заключение

Эта стратегия сочетает в себе поддержку BB, фильтр корпуса, цветовой фильтр и логику прорыва, чтобы захватить ретрассы с высокой вероятностью.


/*backtest
start: 2022-11-14 00:00:00
end: 2023-11-20 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2018

//@version=2
strategy(title = "Noro's Wizard Strategy v1.0", shorttitle = "Wizard str 1.0", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 10)

//Settings
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %")
length = input(25, defval = 25, minval = 1, maxval = 200, title = "BB Period")
usebod = input(false, defval = false, title = "Use Body-Filter")
usecol = input(false, defval = false, title = "Use Color-Filter")
showar = input(false, defval = false, title = "Show Arrows")
fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//Bollinger
src = low
mult = 2
basis = sma(src, length)
dev = mult * stdev(src, length)
lower = basis - dev
plot(lower, color = lime, linewidth = 3, title="Bottom Line")

//Body Filter
nbody = abs(close - open)
abody = sma(nbody, 10)
body = nbody > abody / 2 or usebod == false

//Signals
up1 = low < lower and (close < open or usecol == false) and body
exit = close > open and nbody > abody / 2

//Arrows
needar = up1 and showar
plotarrow(needar ? 1 : na)

//Trading
lot = strategy.position_size == 0 ? strategy.equity / close * capital / 100 : lot[1]

if up1
    if strategy.position_size < 0
        strategy.close_all()
        
    strategy.entry("Long", strategy.long, lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
    
if time > timestamp(toyear, tomonth, today, 23, 59) or exit
    strategy.close_all()

Больше