Стратегия Twin Range Filter - это стратегия торговли, основанная на волатильности цен. Она использует два показателя среднего диапазона с различными параметрами, в сочетании с отношением между ценой и диапазоном, для генерации торговых сигналов. Эта стратегия подходит для высоковолатильных цифровых активов, таких как Биткойн.
Эта стратегия использует два индикатора плавного диапазона с разными длинами периода: индикатор быстрого диапазона (период 27 по умолчанию) и индикатор медленного диапазона (период 55 по умолчанию).
Стратегия Twin Range Filter сравнивает цену с двумя индикаторами диапазона, чтобы определить, находится ли она в настоящее время в определенном диапазоне колебаний.
В частности, стратегия использует медианную линию в качестве ориентира, которая является средним показателем двух диапазонов. Длинный сигнал генерируется, когда цена выше медианной линии на один быстрый диапазон; короткий сигнал генерируется, когда цена падает ниже медианной линии на один быстрый диапазон.
Для фильтрации ложных сигналов он также добавляет условие: сигнал генерируется только тогда, когда текущее движение цены соответствует предыдущему периоду.
В целом, эта стратегия определяет диапазон колебаний с помощью индикаторов двойного диапазона и генерирует ордера, когда цена проходит через диапазон.
Преимущества стратегии фильтра двух диапазонов:
Использует функции волатильности цен, адаптируемые к очень волатильным активам, таким как Биткойн.
Индикаторы двойного диапазона содержат разные временные рамки: быстрый отслеживает краткосрочные возможности, а медленный - долгосрочные тенденции.
Добавление фильтров направления цены уменьшает ложные сигналы от краткосрочных колебаний.
Простая и понятная логика, легко понимаемая и реализуемая, подходящая для торговли алгоритмами.
Некоторые риски, связанные с этой стратегией:
Опирается на показатели волатильности, может быть менее эффективным в условиях низкой волатильности.
Параметры диапазона должны быть оптимизированы для различных продуктов, в противном случае торговые возможности могут быть упущены или произойдут ложные сигналы.
Дивергенция между ценой и волатильностью не учитывается. Ложные сигналы могут возникнуть, если волатильность возрастает без соответствующего роста цен.
Уровни стоп-лосса могут потребоваться в условиях высокой волатильности.
Стратегия может быть улучшена в нескольких аспектах:
Проверка и оптимизация параметров диапазона для поиска оптимальных комбинаций для различных продуктов и временных рамок.
Добавить динамические механизмы стоп-лосса на основе недавней волатильности, чтобы оптимизировать стратегию стоп-лосса.
Добавьте фильтры, основанные на дивергенции волатильности цен, чтобы избежать ложных сигналов.
Включить другие показатели, такие как изменения объема, чтобы повысить уверенность в поступлении.
Испытать и добавить соответствующие механизмы выхода, подходящие для стратегии.
В целом, 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")