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

Автор:Чао Чжан, Дата: 2023-11-13 10:38:20
Тэги:

img

Обзор

Стратегия Twin Range Filter - это стратегия торговли, основанная на волатильности цен. Она использует два показателя среднего диапазона с различными параметрами, в сочетании с отношением между ценой и диапазоном, для генерации торговых сигналов. Эта стратегия подходит для высоковолатильных цифровых активов, таких как Биткойн.

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

Эта стратегия использует два индикатора плавного диапазона с разными длинами периода: индикатор быстрого диапазона (период 27 по умолчанию) и индикатор медленного диапазона (период 55 по умолчанию).

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

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

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

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

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

Преимущества стратегии фильтра двух диапазонов:

  1. Использует функции волатильности цен, адаптируемые к очень волатильным активам, таким как Биткойн.

  2. Индикаторы двойного диапазона содержат разные временные рамки: быстрый отслеживает краткосрочные возможности, а медленный - долгосрочные тенденции.

  3. Добавление фильтров направления цены уменьшает ложные сигналы от краткосрочных колебаний.

  4. Простая и понятная логика, легко понимаемая и реализуемая, подходящая для торговли алгоритмами.

Риски

Некоторые риски, связанные с этой стратегией:

  1. Опирается на показатели волатильности, может быть менее эффективным в условиях низкой волатильности.

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

  3. Дивергенция между ценой и волатильностью не учитывается. Ложные сигналы могут возникнуть, если волатильность возрастает без соответствующего роста цен.

  4. Уровни стоп-лосса могут потребоваться в условиях высокой волатильности.

Улучшение

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

  1. Проверка и оптимизация параметров диапазона для поиска оптимальных комбинаций для различных продуктов и временных рамок.

  2. Добавить динамические механизмы стоп-лосса на основе недавней волатильности, чтобы оптимизировать стратегию стоп-лосса.

  3. Добавьте фильтры, основанные на дивергенции волатильности цен, чтобы избежать ложных сигналов.

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

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

Резюме

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


/*backtest
start: 2023-11-05 00:00:00
end: 2023-11-12 00:00:00
period: 30m
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/
// © colinmck, greenmask9

//@version=4

strategy(title="Twin Range Filter Algo", overlay=true)

source = input(defval=close, title="Source")

// Smooth Average Range

per1 = input(defval=27, minval=1, title="Fast period")
mult1 = input(defval=1.6, minval=0.1, title="Fast range")

per2 = input(defval=55, minval=1, title="Slow period")
mult2 = input(defval=2, minval=0.1, title="Slow range")

smoothrng(x, t, m) =>
    wper = t * 2 - 1
    avrng = ema(abs(x - x[1]), t)
    smoothrng = ema(avrng, wper) * m
    smoothrng
smrng1 = smoothrng(source, per1, mult1)
smrng2 = smoothrng(source, per2, mult2)
smrng = (smrng1 + smrng2) / 2

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

hband = filt + smrng
lband = filt - smrng

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

CondIni = 0
CondIni := longCond ? 1 : shortCond ? -1 : CondIni[1]

long = longCond and CondIni[1] == -1
short = shortCond and CondIni[1] == 1

// Plotting

// Strategy
// From this part on, programmer is greenmaks9
//
Separator = input(title="Following conditions and backtest algorithm are added by @greenmask9 🎯, original script is written by @colinmck 👍. Read both of their's release notes for more info on how this script works.", type=input.bool, defval=false)
disabler = input(title="Disable greenmask9's ATR conditions", type=input.bool, defval=false)

//second
l2 = input(title="ATR1", defval=32, minval=1)
s2 = input(title="Smoothing", defval="SMA", options=["RMA", "SMA", "EMA", "WMA"])
atr2(source, l2) => 
    if s2 == "SMA"
        sma(source, l2)
    else
        if s2 == "RMA"
            rma(source, l2)
        else
            if s2 == "EMA"
                ema(source, l2)
            else
                wma(source, l2)

//third
l3 = input(title="ATR2", defval=64, minval=1)
s3 = input(title="Smoothing", defval="RMA", options=["RMA", "SMA", "EMA", "WMA"])
atr3(source, l3) => 
    if s3 == "RMA"
        rma(source, l3)
    else
        if s3 == "SMA"
            sma(source, l3)
        else
            if s3 == "EMA"
                ema(source, l3)
            else
                wma(source, l3)

atr20=atr2(tr(true), l2)
atr30=atr3(tr(true), l3)
strategy.initial_capital = 50000
ordersize=floor(strategy.initial_capital/close)
profit = input(title="Ticks profit", type=input.integer, defval=900)
stop = input(title="Ticks stoploss", type=input.integer, defval=300)
maxcandles_till_close = input(title="Time stoploss", type=input.integer, defval=17)


bull = long and (atr20<atr30 or disabler)
bear = short and (atr20<atr30 or disabler)

bullclock = barssince(bull)
bearclock = barssince(bear)

if (bull)
    strategy.entry("Twin Long", strategy.long, ordersize)
    strategy.exit("Exit", from_entry =  "Twin Long", profit = profit, loss = stop)

if (bear)
    strategy.entry("Twin Short", strategy.short, ordersize)
    strategy.exit("Exit", from_entry = "Twin Short", profit = profit, loss = stop)

//time stoploss
strategy.close("Twin Long", when = bullclock == maxcandles_till_close, comment = "Timed out")
strategy.close("Twin Short", when = bearclock == maxcandles_till_close, comment = "Timed out")



Больше