Strategi ini menggabungkan penggunaan filter Voss Prediction dan indikator garis tren instan Ehlers untuk mengidentifikasi titik-titik perputaran pasar yang berkala dan mengonversi transaksi kuantitatif. Filter Voss dapat mengirim sinyal beli / jual lebih awal, sedangkan indikator garis tren instan digunakan untuk menentukan arah tren keseluruhan dan mengurangi kesalahan filter Voss dalam pasar yang sedang tren.
Voss memprediksikan filter dari John F. Ehlers dalam artikel A Peek Into The Future. Rumus perhitungan filter adalah sebagai berikut:
_filt = 0.5 * _s3 * _x1 + _f1 * _s2 * _filt[1] - _s1 * _filt[2]
_voss = _x2 * _filt - _sumC
Di antaranya,_x1 adalah selisih satu derajat harga;_x2 adalah faktor kelancaran;_s1、_s2、_s3 adalah parameter filter;_f1 adalah parameter periodik;_filt adalah hasil filter;_voss sebagai output akhir.
Filter ini dapat dianggap sebagai filter yang halus, yang menekankan informasi dari siklus saat ini dan beberapa siklus sebelumnya, sehingga mengirimkan sinyal beli / jual lebih awal. Karena keterlambatan grup yang melekat, filter ini dapat mengirimkan sinyal prediktif sebelum indikator lainnya, seperti siput yang melihat ke dalam siput masa depan.
Indikator garis tren instan dihitung dengan rumus 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])
Indikator ini secara real-time menggambar garis tren yang paling sesuai dengan harga, sehingga dapat menentukan arah dan kekuatan tren secara akurat.
Sebuah sinyal beli dihasilkan ketika Voss bergeser dari negatif ke kanan, dan melewati hasil filter.
Ketika Voss bergeser dari positif ke negatif, dan turun melalui hasil filter, ia menghasilkan sinyal jual.
Sementara itu, sinyal perdagangan hanya akan dikirim ketika indikator garis tren instan mengkonfirmasi arah tren. Ini dapat menyaring sinyal palsu yang mungkin dikirim oleh filter Voss di pasar tren.
Risiko dapat dikurangi dengan:
Strategi ini dapat dioptimalkan dengan:
Strategi ini mengintegrasikan filter Voss dan indikator tren, yang dapat secara efektif mengidentifikasi titik balik berkala di pasar. Dengan mengoptimalkan parameter, mengendalikan risiko, strategi ini dapat mencapai sistem perdagangan kuantitatif yang stabil. Ini dapat digunakan secara luas pada varietas dengan periodikitas yang jelas, yang telah menunjukkan hasil perdagangan yang baik dalam pengujian ulang. Secara keseluruhan, strategi ini memiliki kemampuan prediktif yang unik, dan dapat dioptimalkan melalui berbagai aspek, dengan prospek aplikasi yang luas.
/*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()