Strategi ini menggabungkan penapis ramalan Voss dan penunjuk garis trend segera Ehlers untuk mengenal pasti titik perubahan kitaran di pasaran untuk perdagangan kuantitatif. Penapis Voss memberikan isyarat beli / jual awal, sementara penunjuk trendline menentukan arah trend keseluruhan untuk mengelakkan kesesatan dari penapis Voss di pasaran trend. Strategi ini berfungsi dengan baik pada instrumen seperti Bitcoin yang menunjukkan corak kitaran, seperti yang dibuktikan oleh hasil backtest yang baik.
Penapis 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 perbezaan harga pesanan pertama; _x2 adalah faktor pelinciran; _s1, _s2, _s3 adalah parameter penapis; _f1 adalah parameter kitaran; _filt adalah output penapis; _voss adalah output akhir.
Penapis ini boleh dilihat sebagai penapis yang halus yang menekankan maklumat kitaran semasa dan masa lalu untuk menjana isyarat awal.
Penunjuk trendline dikira sebagai:
_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])
Ia memetakan garis trend dalam masa nyata yang sangat sesuai dengan tindakan harga, dengan tepat menentukan arah trend dan kekuatan.
Isyarat beli dihasilkan apabila Voss melintasi hasil penapis.
Isyarat jual dihasilkan apabila Voss melintasi hasil penapis.
Isyarat perdagangan hanya diterima jika disahkan oleh penunjuk trendline. Ini mengelakkan isyarat yang salah dari penapis Voss di pasaran trend.
Risiko boleh dikurangkan dengan:
Strategi ini boleh ditingkatkan dengan:
Strategi ini menggabungkan penapis Voss dan penunjuk trend untuk mengenal pasti giliran kitaran di pasaran dengan berkesan. Dengan parameter dan kawalan risiko yang dioptimumkan, ia boleh menghasilkan sistem perdagangan kuantitatif yang kukuh. Ia banyak digunakan untuk instrumen yang mempamerkan corak kitaran, seperti yang dibuktikan oleh hasil backtest yang baik. Secara keseluruhan, strategi ini mempunyai keupayaan ramalan yang unik, dan potensi yang luas untuk peningkatan melalui pengoptimuman pelbagai 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()