Стратегия рекурсивной импульсной торговли

Автор:Чао Чжан, Дата: 2024-01-31 16:56:31
Тэги:

img

Обзор

Эта стратегия - стратегия следования трендам и прорыва, основанная на индикаторе рекурсивных полос, разработанном Алекс Гроувером.

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

Расчет показателя рекурсивных полос

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

Верхняя полоса = Макс. Предыдущая полоса - верхняя полоса, цена закрытия + nВолатильность) Нижняя полоса = Min(Предыдущая полосанижняя полоса, цена закрытия - nВолатильность) Средняя линия = (верхняя полоса + нижняя полоса) / 2

Здесь n - коэффициент масштабирования, а волатильность может быть выбрана из ATR, стандартного отклонения, среднего истинного диапазона или специального метода RFV. Параметр длины контролирует чувствительность, более высокие значения делают индикатор менее частым.

Правила торговли

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

Когда цена опускается ниже нижней полосы, идете в длинный курс. Когда цена опускается выше верхней полосы, идете в короткий.

Кроме того, реализована логика стоп-лосса.

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

Преимущества этой стратегии:

  1. Эффективное вычисление показателей с использованием рекурсивной структуры, избегая повторных вычислений
  2. Гибкая настройка параметров для адаптации к различным рыночным режимам
  3. Сочетание тренда и прорыва, избежание ложных прорывов
  4. Фильтры импульса обеспечивают качество сигнала

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

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

  1. Неправильное настройка параметров может привести к переоценке или плохому качеству сигнала
  2. При значительных изменениях тренда может быть вынужден понести большие потери
  3. Недостаточный контроль скольжения при экстремальных движениях может усилить потери

Эти риски можно управлять путем оптимизации параметров, внедрения стоп-лосса, увеличения порога скольжения и т.д.

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

Некоторые направления дальнейшей оптимизации стратегии:

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

Заключение

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


/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// @version=5
// Original indicator by alexgrover
strategy('Extended Recursive Bands Strategy', overlay=true, commission_type=strategy.commission.percent,commission_value=0.06,default_qty_type =strategy.percent_of_equity,default_qty_value = 100,initial_capital =1000)
length = input.int(260, step=10, title='Length')
src = input(close, title='Source')
method = input.string('Classic', options=['Classic', 'Atr', 'Stdev', 'Ahlr', 'Rfv'], title='Method')
bandDirectionCheck = input.bool(true, title='Bands Hold Direction')
lookback = input(3)
//----
atr = ta.atr(length)
stdev = ta.stdev(src, length)
ahlr = ta.sma(high - low, length)
rfv = 0.
rfv := ta.rising(src, length) or ta.falling(src, length) ? math.abs(ta.change(src)) : rfv[1]
//-----
f(a, b, c) =>
    method == a ? b : c
v(x) =>
    f('Atr', atr, f('Stdev', stdev, f('Ahlr', ahlr, f('Rfv', rfv, x))))
//----
sc = 2 / (length + 1)
a = 0.
a := math.max(nz(a[1], src), src) - sc * v(math.abs(src - nz(a[1], src)))
b = 0.
b := math.min(nz(b[1], src), src) + sc * v(math.abs(src - nz(b[1], src)))
c = (a+b)/2

// Colors
beColor = #675F76
buColor = #a472ff

// Plots
pA = plot(a, color=color.new(beColor, 0), linewidth=2, title='Upper Band')
pB = plot(b, color=color.new(buColor, 0), linewidth=2, title='Lower Band')
pC = plot(c, color=color.rgb(120,123,134,0), linewidth=2, title='Middle Band')
fill(pC, pA, color=color.new(beColor,90))
fill(pC, pB, color=color.new(buColor,90))

// Band keeping direction
// By Adulari
longc = 0
shortc = 0
for i = 0 to lookback-1
    if b[i] > b[i+1]
        longc:=longc+1
    if a[i] < a[i+1]
        shortc:=shortc+1
bhdLong = if bandDirectionCheck
    longc==lookback
else
    true
bhdShort = if bandDirectionCheck
    shortc==lookback
else
    true

// Strategy
if b>=low and bhdLong
    strategy.entry(id='Long',direction=strategy.long)
if high>=a and bhdShort
    strategy.entry(id='Short',direction=strategy.short)

// TP at middle line
//if low<=c and strategy.position_size<0 and strategy.position_avg_price>close
    //strategy.exit(id="Short",limit=close)
//if high>=c and strategy.position_size>0 and strategy.position_avg_price<close
    //strategy.exit(id="Long",limit=close)

Больше