Фильтр диапазона краткосрочная торговая стратегия покупки и продажи


Дата создания: 2023-09-21 21:17:40 Последнее изменение: 2023-09-21 21:17:40
Копировать: 0 Количество просмотров: 854
1
Подписаться
1617
Подписчики

Обзор

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

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

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

  1. Расчет разницы между максимальной и минимальной ценой за последние N циклов в качестве ценового подъема

  2. Уравнительная обработка ценовых колебаний для получения диапазона фильтров

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

  4. Когда цена падает выше диапазона фильтра, создается сигнал продажи

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

Стратегические преимущества

  • Использование ценового диапазона для определения прорыва
  • Гладкая обработка диапазона колебаний, эффективная фильтрация шума
  • Прорывные сигналы, легко улавливающие короткие тренды
  • Высокая частота сделок, подходящая для коротких операций
  • Настраиваемые параметры, легко оптимизируемые для разных сортов

Стратегический риск

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

Снизить риск можно, приняв следующие меры:

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

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

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

  1. Различные циклические параметры в диапазоне вычислений теста

  2. Коэффициент колебаний оптимального диапазона фильтрации

  3. Присоединение MACD и других показателей для повторного подтверждения

  4. Использование мобильных стоп или отслеживания стоп

  5. Параметры корректировки в зависимости от разновидности

  6. Рассмотреть оптимизацию системы управления позициями

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

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

Исходный код стратегии
/*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)