Chiến lược này sử dụng tổng hợp các bộ lọc dự đoán Voss và các chỉ số đường xu hướng tức thời của Ehlers để xác định các điểm biến động định kỳ của thị trường và thực hiện giao dịch định lượng. Bộ lọc Voss có thể phát tín hiệu mua / bán trước, trong khi các chỉ số đường xu hướng tức thời được sử dụng để xác định hướng xu hướng tổng thể và giảm sự sai lệch của bộ lọc Voss trong thị trường xu hướng.
Voss dự đoán bộ lọc từ John F. Ehlers trong bài A Peek Into The Future. Công thức tính toán của bộ lọc là:
_filt = 0.5 * _s3 * _x1 + _f1 * _s2 * _filt[1] - _s1 * _filt[2]
_voss = _x2 * _filt - _sumC
Trong đó,_x1 là chênh lệch một bậc của giá;_x2 là nhân tố mài;_s1、_s2、_s3 là tham số filter wave;_f1 là tham số chu kỳ;_filt là kết quả lọc;_voss là kết quả cuối cùng.
Bộ lọc này có thể được coi là một loại bộ lọc trơn, nó nhấn mạnh thông tin của hiện tại và vài chu kỳ trước, do đó phát ra tín hiệu mua / bán sớm. Do sự chậm trễ của nhóm nội tại, nó có thể phát ra tín hiệu dự đoán trước các chỉ số khác, giống như con ốc nhìn vào ốc tương lai.
Chỉ số đường xu hướng tức thời được tính bằng công thức sau:
_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])
Chỉ số này vẽ một đường xu hướng phù hợp nhất với giá trong thời gian thực, cho phép xác định chính xác chiều hướng và sức mạnh của xu hướng.
Voss tạo ra một tín hiệu mua khi đi từ tiêu cực và đi qua kết quả lọc.
Voss tạo ra một tín hiệu bán khi chuyển từ tích cực sang âm, và kết quả lọc dưới.
Đồng thời, chỉ khi chỉ số đường xu hướng tức thời xác nhận xu hướng, tín hiệu giao dịch sẽ được phát ra. Điều này có thể lọc các tín hiệu sai mà bộ lọc Voss có thể phát ra trong thị trường xu hướng.
Bạn có thể làm giảm nguy cơ bằng cách:
Chiến lược này có thể được tối ưu hóa bằng cách:
Chiến lược này tích hợp bộ lọc Voss và chỉ số xu hướng, có thể xác định hiệu quả các điểm đảo ngược theo chu kỳ của thị trường. Bằng cách tối ưu hóa các tham số, kiểm soát rủi ro, chiến lược này có thể đạt được một hệ thống giao dịch định lượng ổn định. Nó có thể được áp dụng rộng rãi cho các giống có tính chu kỳ rõ ràng, đã cho thấy hiệu quả giao dịch tốt trong phản hồi.
/*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()