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


Дата создания: 2024-04-01 10:54:47 Последнее изменение: 2024-04-01 10:54:47
Копировать: 3 Количество просмотров: 360
1
Подписаться
1215
Подписчики

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

Обзор

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

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

  1. Рассчитайте плавный интервал между двумя циклами: быстрый интервал использует более короткие циклы и меньшие кратные, а медленный интервал - более длинные циклы и большие кратные.
  2. Среднее значение быстрого и медленного диапазонов используется как комплексный диапазонный фильтр ((TRF) }}.
  3. Вычислить отношение текущей цены к предыдущей цене, чтобы определить тенденцию к росту (upward) и тенденцию к снижению (downward).
  4. Вычислить динамику верхнего трека (FUB) и нижнего трека (FLB) в качестве ссылки на тенденции.
  5. В зависимости от отношения цены закрытия к TRF, генерируются сигналы покупки и продажи.
  6. Установка четырех стоп-стриджеров и одного стоп-лоста для различных соотношений позиций и процентов прибыли/убытка.

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

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

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

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

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

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

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

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

Исходный код стратегии
/*backtest
start: 2024-03-01 00:00:00
end: 2024-03-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
//@version=5
strategy(title='2"Twin Range Filter', overlay=true)
strat_dir_input = input.string(title='İşlem Yönü', defval='Alis', options=['Alis', 'Satis', 'Tum'])
strat_dir_value = strat_dir_input == 'Alis' ? strategy.direction.long : strat_dir_input == 'Satis' ? strategy.direction.short : strategy.direction.all
strategy.risk.allow_entry_in(strat_dir_value)

////////////////////////////

// Backtest inputs
BaslangicAy = input.int(defval=1, title='İlk ay', minval=1, maxval=12)
BaslangicGun = input.int(defval=1, title='İlk Gün', minval=1, maxval=31)
BaslangicYil = input.int(defval=2023, title='İlk Yil', minval=2000)
SonAy = input.int(defval=1, title='Son Ay', minval=1, maxval=12)
SonGun = input.int(defval=1, title='Son Gün', minval=1, maxval=31)
SonYil = input.int(defval=9999, title='Son Yıl', minval=2000)

start = timestamp(BaslangicYil, BaslangicAy, BaslangicGun, 00, 00)  // backtest start window
finish = timestamp(SonYil, SonAy, SonGun, 23, 59)  // backtest finish window
window() => true

source = input(defval=close, title='Source')
showsignals = input(title='Show Buy/Sell Signals ?', defval=true)
per1 = input.int(defval=27, minval=1, title='Fast period')
mult1 = input.float(defval=1.6, minval=0.1, title='Fast range')
per2 = input.int(defval=55, minval=1, title='Slow period')
mult2 = input.float(defval=2, minval=0.1, title='Slow range')
smoothrng(x, t, m) =>
    wper = t * 2 - 1
    avrng = ta.ema(math.abs(x - x[1]), t)
    smoothrng = ta.ema(avrng, wper) * m
    smoothrng
smrng1 = smoothrng(source, per1, mult1)
smrng2 = smoothrng(source, per2, mult2)
smrng = (smrng1 + smrng2) / 2
rngfilt(x, r) =>
    rngfilt = x
    rngfilt := x > nz(rngfilt[1]) ? x - r < nz(rngfilt[1]) ? nz(rngfilt[1]) : x - r : x + r > nz(rngfilt[1]) ? nz(rngfilt[1]) : x + r
    rngfilt
filt = rngfilt(source, smrng)
upward = 0.0
upward := filt > filt[1] ? nz(upward[1]) + 1 : filt < filt[1] ? 0 : nz(upward[1])
downward = 0.0
downward := filt < filt[1] ? nz(downward[1]) + 1 : filt > filt[1] ? 0 : nz(downward[1])
STR = filt + smrng
STS = filt - smrng
FUB = 0.0
FUB := STR < nz(FUB[1]) or close[1] > nz(FUB[1]) ? STR : nz(FUB[1])
FLB = 0.0
FLB := STS > nz(FLB[1]) or close[1] < nz(FLB[1]) ? STS : nz(FLB[1])
TRF = 0.0
TRF := nz(TRF[1]) == FUB[1] and close <= FUB ? FUB : nz(TRF[1]) == FUB[1] and close >= FUB ? FLB : nz(TRF[1]) == FLB[1] and close >= FLB ? FLB : nz(TRF[1]) == FLB[1] and close <= FLB ? FUB : FUB
al = ta.crossover(close, TRF)
sat = ta.crossunder(close, TRF)
plotshape(showsignals and al, title='Long', text='BUY', style=shape.labelup, textcolor=color.white, size=size.tiny, location=location.belowbar, color=color.rgb(0, 19, 230))
plotshape(showsignals and sat, title='Short', text='SELL', style=shape.labeldown, textcolor=color.white, size=size.tiny, location=location.abovebar, color=color.rgb(0, 19, 230))
alertcondition(al, title='Long', message='Long')
alertcondition(sat, title='Short', message='Short')
Trfff = plot(TRF)
mPlot = plot(ohlc4, title='', style=plot.style_circles, linewidth=0)
longFillColor = close > TRF ? color.green : na
shortFillColor = close < TRF ? color.red : na
fill(mPlot, Trfff, title='UpTrend Highligter', color=longFillColor, transp=90)
fill(mPlot, Trfff, title='DownTrend Highligter', color=shortFillColor, transp=90)

//////////////////////



renk1 = input(true, "Mum Renk Ayarları?")
mumrenk = input(true,title="Trend Bazlı Mum Rengi Değişimi?")
htaColor = renk1 ? (al ? color.rgb(224, 230, 57) : #E56337) : #c92626
barcolor(color = mumrenk ? (renk1 ? htaColor : na) : na)
if (al) and window()
    strategy.entry("Al", strategy.long)
if (sat) and window()
    strategy.entry("Sat", strategy.short)


per1(pcnt) =>
    strategy.position_size != 0 ? math.round(pcnt / 100 * strategy.position_avg_price / syminfo.mintick) : float(na)
zarkesmgb = input.float(title='Zarar Kes Yüzdesi', defval=100, minval=0.01)
zarkeslos = per1(zarkesmgb)
q1 = input.int(title='Satış Lot Sayısı 1.Kısım %', defval=5, minval=1)
q2 = input.int(title='Satış Lot Sayısı 2.Kısım %', defval=8, minval=1)
q3 = input.int(title='Satış Lot Sayısı 3.Kısım %', defval=13, minval=1)
q4 = input.int(title='Satış Lot Sayısı 4.Kısım %', defval=21, minval=1)
tp1 = input.float(title='Kar Yüzdesi 1.Kısım', defval=13, minval=0.01)
tp2 = input.float(title='Kar Yüzdesi 2.Kısım', defval=21, minval=0.01)
tp3 = input.float(title='Kar Yüzdesi 3.Kısım', defval=29, minval=0.01)
tp4 = input.float(title='Kar Yüzdesi 4.Kısım', defval=34, minval=0.01)
strategy.exit('✨KS1', qty_percent=q1, profit=per1(tp1), loss=zarkeslos)
strategy.exit('✨KS2', qty_percent=q2, profit=per1(tp2), loss=zarkeslos)
strategy.exit('✨KS3', qty_percent=q3, profit=per1(tp3), loss=zarkeslos)
strategy.exit('✨KS4', qty_percent=q4, profit=per1(tp4), loss=zarkeslos)