Strategi ini menggabungkan penggunaan penapis ramalan Voss dan penunjuk garisan trend seketika Ehlers untuk mengenal pasti titik perubahan berkala di pasaran, untuk mencapai perdagangan kuantitatif. Penapis Voss boleh menghantar isyarat beli / jual lebih awal, manakala penunjuk garisan trend seketika digunakan untuk menentukan arah trend keseluruhan, mengurangkan penapis Voss yang keliru dalam pasaran yang sedang tren.
Voss meramalkan penapis dari John F. Ehlers dalam artikel A Peek Into The Future. Formula pengiraan penapis adalah sebagai berikut:
_filt = 0.5 * _s3 * _x1 + _f1 * _s2 * _filt[1] - _s1 * _filt[2]
_voss = _x2 * _filt - _sumC
Di antaranya,_x1 adalah satu darjah perbezaan harga;_x2 ialah faktor kelancaran;_s1、_s2、_s3 ialah parameter filter;_f1 ialah parameter kitaran;_filt ialah hasil penapisan;_voss untuk output akhir.
Penapis ini boleh dilihat sebagai penapis halus, yang menekankan maklumat mengenai kitaran semasa dan beberapa kitaran lalu, untuk menghantar isyarat beli / jual lebih awal. Oleh kerana kelewatan kumpulan yang tertanam, ia boleh menghantar isyarat ramalan sebelum indikator lain, seperti keldai melihat keldai masa depan.
Indeks garis trend seketika dikira dengan formula 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])
Penunjuk ini menggambar garis trend yang paling sesuai dengan harga dalam masa nyata, dan dapat menentukan arah dan kekuatan trend dengan tepat.
Voss menghasilkan isyarat beli apabila dialihkan dari negatif ke kanan, dan melalui penyaringan.
Voss menghasilkan isyarat jual apabila ia bertukar positif ke negatif, dan melalui penyaringan bawah.
Pada masa yang sama, isyarat dagangan hanya akan dikeluarkan apabila petunjuk garis trend seketika mengesahkan arah trend. Ini dapat menyaring isyarat salah yang mungkin dikeluarkan oleh penapis Voss dalam pasaran yang sedang tren.
Risiko boleh dikurangkan dengan:
Strategi ini boleh dioptimumkan dengan:
Strategi ini mengintegrasikan penapis Voss dan penunjuk trend, yang dapat mengenal pasti titik-titik perubahan berkala di pasaran. Dengan mengoptimumkan parameter, mengawal risiko, strategi ini dapat mencapai sistem perdagangan kuantitatif yang stabil. Ia boleh digunakan secara meluas untuk varieti yang jelas berkala, yang telah menunjukkan kesan perdagangan yang baik dalam pengesanan semula.
/*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()