Эта стратегия использует в комплексе прогнозирующий фильтр Voss и индикатор мгновенных трендовых линий Ehlers для идентификации периодических рыночных поворотных точек и реализации количественных сделок. Фильтр Voss может заранее подавать сигналы покупки/продажи, а индикатор мгновенных трендовых линий используется для определения направления общей тенденции и уменьшения ошибочности фильтра Voss в трендовых рынках.
Прогнозный фильтр Восса был получен из статьи Джона Ф. Элерса “A Peek Into The Future”. Формула расчета фильтра была следующей:
_filt = 0.5 * _s3 * _x1 + _f1 * _s2 * _filt[1] - _s1 * _filt[2]
_voss = _x2 * _filt - _sumC
Среди них_x1 - однозначная разница в цене;_x2 - фактор сглаживания;_s1、_s2、_s3 - параметр фильтрации;_f1 - циклический параметр;_filt - результат фильтрации;_voss для окончательного вывода.
Этот фильтр можно рассматривать как гладкий фильтр, который подчеркивает информацию о текущих и прошлых нескольких циклах, таким образом, заранее посылает сигнал покупки/продажи. Из-за внутренних групповых задержек, он может посылать прогнозные сигналы до других показателей, подобно тому, как змея смотрит в будущее змея.
Мгновенный индикатор трендовых линий рассчитывается по формуле:
_it = (_a-((_a*_a)/4.0))*_src+0.5*_a*_a*_src[1]-(_a-0.75*_a*_a)*_src[2]+2*(1-_a)*nz(_it[1])+-(1-_a)*(1-_a)*nz(_it[2])
Показатель в реальном времени рисует трендовую линию, наиболее соответствующую цене, что позволяет точно определить направление и силу тренда.
При отрицательном повороте Восс получает сигнал покупки, а после прохождения фильтрации - результат.
Продажа происходит, когда Восс переходит от положительного к отрицательному и переходит вниз по результатам фильтрации.
В то же время, торговый сигнал подается только тогда, когда мгновенный индикатор трендовой линии подтверждает направление тренда. Это позволяет отфильтровать ошибочные сигналы, которые могут быть выпущены фильтром Восса на трендовом рынке.
Риски можно снизить следующими способами:
Эта стратегия может быть оптимизирована в следующих аспектах:
Стратегия, объединяющая фильтры Voss и индикаторы тренда, позволяет эффективно идентифицировать периодические переломы рынка. Благодаря оптимизации параметров и контролю риска, стратегия позволяет достичь стабильной количественной торговой системы. Она может широко применяться в разновидностях с заметной периодичностью, которая продемонстрировала хорошую эффективность торговли в отзывах. В целом, стратегия обладает уникальными прогнозными способностями и может быть оптимизирована во многих аспектах, имея широкие перспективы применения.
/*backtest
start: 2023-08-19 00:00:00
end: 2023-09-18 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// A Peek Into the Future
// John F. Ehlers
// TASC Aug 2019
// Created by e2e4mfck for tradingview.com
// Modified by © Bitduke
//@version=4
//strategy("Voss Strategy (Filter + IT)", overlay=false, calc_on_every_tick=false,pyramiding=0, default_qty_type=strategy.cash,default_qty_value=1000, currency=currency.USD, initial_capital=1000,commission_type=strategy.commission.percent, commission_value=0.075)
// voss filter
source = input(close, type = input.source)
period = input(20, type = input.integer)
predict = input(4, type = input.integer)
bandwidth = input(0.25, type = input.float)
// it trendline
src = input(hl2, title="Source IT")
a = input(0.07, title="Alpha", step=0.01)
fr = input(false, title="Fill Trend Region")
ebc = input(false, title="Enable barcolors")
hr = input(false, title="Hide Ribbon")
voss_filter (_period, _predict, _bandwidth, _source) =>
float _filt = 0, float _sumC = 0, float _voss = 0
_PI = 2 * asin(1)
_order = 3 * _predict
_f1 = cos(2 * _PI / _period)
_g1 = cos(_bandwidth * 2 * _PI / _period)
_s1 = 1 / _g1 - sqrt(1 / (_g1 * _g1) - 1)
_s2 = 1 + _s1
_s3 = 1 - _s1
_x1 = _source - _source[2]
_x2 = (3 + _order) / 2
for _i = 0 to (_order - 1)
_sumC := _sumC + ((_i + 1) / _order) * _voss[_order - _i]
if bar_index <= _order
_filt := 0
_voss := 0
else
_filt := 0.5 * _s3 * _x1 + _f1 * _s2 * _filt[1] - _s1 * _filt[2]
_voss := _x2 * _filt - _sumC
[_voss, _filt]
[Voss, Filt] = voss_filter(period, predict, bandwidth, source)
instantaneous_trendline (_src, _a, _freq, _ebc, _hr) =>
_it = 0.0
_it := (_a-((_a*_a)/4.0))*_src+0.5*_a*_a*_src[1]-(_a-0.75*_a*_a)*_src[2]+2*(1-_a )*nz(_it[1], ((_src+2*_src[1]+_src[2])/4.0))-(1-_a)*(1-_a)*nz(_it[2], ((_src+2*_src[1]+_src[2])/4.0))
_lag = 2.0*_it-nz(_it[2])
[_it, _lag]
[it, lag] = instantaneous_trendline(src, a, fr, ebc, hr)
// - - - - - - - - - - //
plot(Filt, title = "Filter", style = plot.style_line, color = color.red, linewidth = 2)
plot(Voss, title = "Voss", style = plot.style_line, color = color.blue, linewidth = 2)
hline(0.0, title = "Zero", linestyle = hline.style_dashed, color = color.black, linewidth = 1)
plot(hr? na:it, title="IT Trend", color= fr? color.gray : color.red, linewidth=1)
plot(hr? na:lag, title="IT Trigger", color=fr? color.gray : color.blue, linewidth=1)
// Strategy Logic
longCondition = lag < it and crossover(Voss,Filt)
shortCondition = it > lag and crossover(Filt,Voss)
strategy.entry("Voss_Short", strategy.short, when=shortCondition)
strategy.entry("Voss_Long", strategy.long, when=longCondition)
// === Backtesting Dates === thanks to Trost
testPeriodSwitch = input(true, "Custom Backtesting Dates")
testStartYear = input(2019, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testStartHour = input(0, "Backtest Start Hour")
testPeriodStart = timestamp(testStartYear, testStartMonth, testStartDay, testStartHour, 0)
testStopYear = input(2020, "Backtest Stop Year")
testStopMonth = input(2, "Backtest Stop Month")
testStopDay = input(29, "Backtest Stop Day")
testStopHour = input(0, "Backtest Stop Hour")
testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, testStopHour, 0)
testPeriod() =>
time >= testPeriodStart and time <= testPeriodStop ? true : false
testPeriod_1 = testPeriod()
isPeriod = true
// === /END
if not isPeriod
strategy.cancel_all()
strategy.close_all()