Chiến lược giao dịch định lượng dựa trên bộ lọc Voss và chỉ báo xu hướng


Ngày tạo: 2023-09-19 16:59:10 sửa đổi lần cuối: 2023-09-19 16:59:10
sao chép: 2 Số nhấp chuột: 900
1
tập trung vào
1617
Người theo dõi

Tổng quan

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.

Nguyên tắc chiến lược

Voss dự đoán bộ lọc

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

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.

Chiến lược Logic

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.

Lợi thế chiến lược

  • Bộ lọc Voss có thể phát tín hiệu dự đoán trước để bắt được các điểm đảo ngược định kỳ
  • Chỉ số đường xu hướng tức thời có thể xác định chính xác hướng xu hướng, tránh tín hiệu sai do bộ lọc phát ra trước
  • Các tham số có thể được cấu hình để tối ưu hóa cho các chu kỳ khác nhau và môi trường thị trường
  • Có thể thêm chiến lược kiểm soát rủi ro

Rủi ro chiến lược và giải pháp

  • Chiến lược này dựa trên các bộ lọc để phát tín hiệu trước và có thể bỏ qua một số xu hướng.
  • Trong một xu hướng mạnh, có thể có tín hiệu giao dịch phản tác động, dẫn đến tổn thất

Bạn có thể làm giảm nguy cơ bằng cách:

  • Tối ưu hóa các tham số chu kỳ để phù hợp với chu kỳ của các giống khác nhau
  • Điều chỉnh tham số băng thông, giảm cường độ của sóng, giảm tín hiệu sai lệch
  • Tăng bộ lọc xu hướng để tránh tín hiệu sai trong xu hướng mạnh
  • Thiết lập chiến lược dừng lỗ, kiểm soát tổn thất đơn lẻ

Hướng tối ưu hóa chiến lược

Chiến lược này có thể được tối ưu hóa bằng cách:

  • Thử các nguồn giá khác nhau, chẳng hạn như giá đóng cửa, đường trung bình, để có được đầu vào tốt hơn
  • Điều chỉnh tham số chu kỳ của bộ lọc để phù hợp với chu kỳ của một giống cụ thể
  • Tối ưu hóa các tham số chỉ số xu hướng để có được phán đoán xu hướng chính xác hơn
  • Thử các chỉ số xu hướng khác nhau để tìm ra sự kết hợp phù hợp hơn
  • Thêm chiến lược dừng lỗ, trailing stop, kiểm soát rủi ro tốt hơn
  • Tối ưu hóa tham số, tìm kiếm sự kết hợp tham số tốt nhất

Tóm tắt

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.

Mã nguồn chiến lược
/*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()