Краткосрочная стратегия торговли с прорывом диапазона фильтра

Автор:Чао Чжан, Дата: 21 сентября 2023 года 21:17:40
Тэги:

Обзор

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

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

Основным показателем является диапазон колебаний цен.

  1. Вычислить высоко-низкий диапазон за прошлые N периодов как амплитуду цены

  2. Сгладить амплитуду с использованием скользящих средних для получения диапазона фильтра

  3. Сигнал покупки генерируется, когда цена поднимается выше диапазона фильтра

  4. Сигнал продажи генерируется, когда цена опускается ниже диапазона фильтра

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

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

  • Ценовой диапазон легко оценить
  • Сглаженный диапазон эффективно фильтрует шум
  • Сигналы прорыва улавливают краткосрочные тенденции
  • Более высокая частота торговли, подходящая для краткосрочных сделок
  • Регулируемые параметры легко оптимизировать

Риски

  • Прорывы в диапазоне, склонные к ударам.
  • Требуется достаточно исторических данных для расчета диапазона
  • Плохие параметры вызывают повышенную чувствительность или вялость.
  • Нет эффективных остановок, большие выводы
  • На производительность влияют сборы за высокую частоту

Риски могут быть смягчены:

  • Коэффициент волатильности фильтра расслабляющего диапазона
  • Оптимизация параметров для идеальных настроек
  • Использование стоп-лосса или стоп-трейлинга
  • Сокращение частоты торговли для снижения сборов
  • Испытания специфических для продукта параметров

Руководство по улучшению

Стратегия может быть улучшена путем:

  1. Испытание различных периодов расчета диапазона

  2. Оптимизация коэффициента волатильности фильтра диапазона

  3. Добавление подтверждающих показателей, таких как MACD

  4. Использование движущихся или задерживающихся остановок

  5. Специальные параметры настройки для каждого продукта

  6. Оптимизация системы размещения позиций

Резюме

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


/*backtest
start: 2023-08-21 00:00:00
end: 2023-09-20 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy(title="Range Filter Buy and Sell 5min [Strategy]", overlay=true, commission_type=strategy.commission.percent, commission_value=0.025, default_qty_type=strategy.cash, default_qty_value=10000, initial_capital=10000, slippage=0)

// === INPUT BACKTEST RANGE ===
useDate = input(true,     title='---------------- Use Date ----------------', type=bool)
FromMonth = input(defval = 7, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 25, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2019, title = "From Year", minval = 2017)
ToMonth   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 9999, title = "To Year", minval = 2017)
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
window()  => true  // create function "within window of time"
// === INPUT BACKTEST RANGE ===


sources = input(defval=close, title="Source")
isHA = input(false, "Use HA Candles", bool)
src = isHA ? security(heikenashi(tickerid), period, sources) : sources
// Sampling Period
// Settings for 5min chart, BTCUSDC. For Other coin, change the paremeters

per = input(defval=50, minval=1, title="Sampling Period")

// Range Multiplier

mult = input(defval=3.0, minval=0.1, title="Range Multiplier")

// Smooth Average Range

smoothrng(x, t, m)=>
    wper      = (t*2) - 1
    avrng     = ema(abs(x - x[1]), t)
    smoothrng = ema(avrng, wper)*m
    smoothrng
smrng = smoothrng(src, per, mult)

// Range Filter

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(src, smrng)

// Filter Direction

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])

// Target Bands

hband = filt + smrng
lband = filt - smrng

// Colors

filtcolor = upward > 0 ? lime : downward > 0 ? red : orange
barcolor  = (src > filt) and (src > src[1]) and (upward > 0) ? lime : (src > filt) and (src < src[1]) and (upward > 0) ? green : 
   (src < filt) and (src < src[1]) and (downward > 0) ? red : (src < filt) and (src > src[1]) and (downward > 0) ? maroon : orange

filtplot = plot(filt, color=filtcolor, linewidth=3, title="Range Filter")

// Target

hbandplot = plot(hband, color=aqua, transp=100, title="High Target")
lbandplot = plot(lband, color=fuchsia, transp=100, title="Low Target")

// Fills

fill(hbandplot, filtplot, color=aqua, title="High Target Range")
fill(lbandplot, filtplot, color=fuchsia, title="Low Target Range")

// Bar Color

//barcolor(barcolor)

// Break Outs 

longCond = na
shortCond = na
longCond := ((src > filt) and (src > src[1]) and (upward > 0)) or ((src > filt) and (src < src[1]) and (upward > 0)) 
shortCond := ((src < filt) and (src < src[1]) and (downward > 0)) or ((src < filt) and (src > src[1]) and (downward > 0))

CondIni = 0
CondIni := longCond ? 1 : shortCond ? -1 : CondIni[1]
longCondition = longCond and CondIni[1] == -1
shortCondition = shortCond and CondIni[1] == 1

//Alerts

plotshape(longCondition, title = "Buy Signal", text ="BUY", textcolor = white, style=shape.labelup, size = size.normal, location=location.belowbar, color = green, transp = 0)
plotshape(shortCondition, title = "Sell Signal", text ="SELL", textcolor = white, style=shape.labeldown, size = size.normal, location=location.abovebar, color = red, transp = 0)

//strategy.entry("Long", strategy.long, stop = hband, when = window() , comment="Long")
//strategy.entry("Short", strategy.short, stop = lband, when = window() , comment="Short")

strategy.entry("Long", strategy.long, when = longCondition and window() , comment="Long")
strategy.entry("Short", strategy.short, when = shortCondition and window() , comment="Short")



// === Stop LOSS ===
useStopLoss = input(false, title='----- Use Stop Loss / Take profit -----', type=bool)
sl_inp = input(100, title='Stop Loss %', type=float, step=0.25)/100
tp_inp = input(1.5, title='Take Profit %', type=float, step=0.25)/100
stop_level = strategy.position_avg_price * (1 - sl_inp)
take_level = strategy.position_avg_price * (1 + tp_inp)
stop_level_short = strategy.position_avg_price * (1 + sl_inp)
take_level_short = strategy.position_avg_price * (1 - tp_inp)
// === Stop LOSS ===

if useStopLoss
    strategy.exit("Stop Loss/Profit Long","Long", stop=stop_level, limit=take_level)
    strategy.exit("Stop Loss/Profit Short","Short", stop=stop_level_short, limit=take_level_short)


Больше