Strategi ini menggabungkan Voss Predictive Filter dan Ehlers Instantaneous Trendline indicator untuk mengidentifikasi titik balik siklik di pasar untuk perdagangan kuantitatif. Filter Voss memberikan sinyal beli / jual awal, sementara indikator trendline menentukan arah tren keseluruhan untuk menghindari penyimpangan dari filter Voss di pasar tren. Strategi ini bekerja dengan baik pada instrumen seperti Bitcoin yang menunjukkan pola siklik, seperti yang dibuktikan oleh hasil backtest yang baik.
Filter Voss berasal dari artikel John F. Ehlers
_filt = 0.5 * _s3 * _x1 + _f1 * _s2 * _filt[1] - _s1 * _filt[2]
_voss = _x2 * _filt - _sumC
Di mana _x1 adalah perbedaan harga urutan pertama; _x2 adalah faktor pelunturan; _s1, _s2, _s3 adalah parameter filter; _f1 adalah parameter siklus; _filt adalah output filter; _voss adalah output akhir.
Filter ini dapat dilihat sebagai filter yang dihaluskan yang menekankan informasi siklus saat ini dan masa lalu untuk menghasilkan sinyal awal.
Indikator trendline dihitung sebagai berikut:
_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])
Ini memetakan garis tren secara real-time yang sangat sesuai dengan aksi harga, secara akurat menentukan arah dan kekuatan tren.
Sinyal beli dihasilkan ketika Voss melintasi hasil filter.
Sinyal jual dihasilkan ketika Voss melintasi hasil filter.
Sinyal perdagangan hanya diterima jika dikonfirmasi oleh indikator trendline. Ini menghindari sinyal yang salah dari filter Voss di pasar tren.
Risiko dapat dikurangi dengan:
Strategi dapat ditingkatkan dengan:
Strategi ini menggabungkan filter Voss dan indikator tren untuk secara efektif mengidentifikasi pergantian siklus di pasar. Dengan parameter dan pengendalian risiko yang dioptimalkan, strategi ini dapat menghasilkan sistem perdagangan kuantitatif yang kuat. Strategi ini dapat diterapkan secara luas pada instrumen yang menunjukkan pola siklus, seperti yang dibuktikan oleh hasil backtest yang baik. Secara keseluruhan, strategi ini memiliki kemampuan prediktif yang unik, dan potensi yang luas untuk peningkatan melalui optimasi multi-dimensi.
/*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()