वोस फ़िल्टर और रुझान सूचक पर आधारित मात्रात्मक ट्रेडिंग रणनीति

लेखक:चाओझांग, दिनांक: 2023-09-19 16:59:10
टैगः

अवलोकन

यह रणनीति मात्रात्मक ट्रेडिंग के लिए बाजार में चक्रीय मोड़ बिंदुओं की पहचान करने के लिए वोस प्रेडिक्टिव फिल्टर और एहलर्स इंस्टैंट ट्रेंडलाइन संकेतक को जोड़ती है। वोस फिल्टर शुरुआती खरीद / बिक्री संकेत प्रदान करता है, जबकि ट्रेंडलाइन संकेतक ट्रेंडिंग बाजारों में वोस फिल्टर से भ्रामकता से बचने के लिए समग्र प्रवृत्ति दिशा निर्धारित करता है। यह रणनीति बिटकॉइन जैसे उपकरणों पर अच्छी तरह से काम करती है जो चक्रीय पैटर्न प्रदर्शित करते हैं, जैसा कि अच्छे बैकटेस्ट परिणामों से पता चलता है।

रणनीति तर्क

वोस पूर्वानुमान फ़िल्टर

वोस फ़िल्टर जॉन एफ. एहलर्स के लेख ए पीक इन द फ्यूचर से आता है। इसकी गणना इस प्रकार हैः

_filt = 0.5 * _s3 * _x1 + _f1 * _s2 * _filt[1] - _s1 * _filt[2] 
_voss = _x2 * _filt - _sumC

जहाँ _x1 प्रथम क्रम मूल्य अंतर है; _x2 एक चिकनाई कारक है; _s1, _s2, _s3 फ़िल्टर पैरामीटर हैं; _f1 चक्र पैरामीटर है; _filt फ़िल्टर आउटपुट है; _voss अंतिम आउटपुट है।

फ़िल्टर को एक चिकनी फ़िल्टर के रूप में देखा जा सकता है जो प्रारंभिक संकेत उत्पन्न करने के लिए वर्तमान और पिछले चक्र की जानकारी पर जोर देता है। अंतर्निहित समूह देरी के कारण, यह अन्य संकेतकों से पहले भविष्यवाणी संकेत उत्पन्न करने के लिए भविष्य में देखता है।

त्वरित ट्रेंडलाइन सूचक

प्रवृत्ति रेखा सूचक की गणना इस प्रकार की जाती हैः

_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]) 

यह वास्तविक समय में एक प्रवृत्ति रेखा को चित्रित करता है जो मूल्य कार्रवाई के करीब फिट बैठता है, सटीक रूप से प्रवृत्ति दिशा और शक्ति निर्धारित करता है।

रणनीति तर्क

खरीद संकेत तब उत्पन्न होता है जब वोस फ़िल्टर परिणाम के माध्यम से गुजरता है।

विक्रय संकेत तब उत्पन्न होता है जब वोस फ़िल्टर परिणाम के माध्यम से नीचे से गुजरता है।

ट्रेडिंग सिग्नल केवल तभी स्वीकार किए जाते हैं जब ट्रेंडलाइन इंडिकेटर द्वारा पुष्टि की जाती है। यह ट्रेंडिंग बाजारों में वोस फिल्टर से गलत संकेतों से बचता है।

लाभ

  • वोस फ़िल्टर चक्रीय मोड़ को पकड़ने के लिए प्रारंभिक पूर्वानुमान संकेत प्रदान करता है
  • ट्रेंडलाइन संकेतक गलत संकेतों से बचकर ट्रेंड दिशा को सटीक रूप से निर्धारित करता है
  • मापदंडों को विभिन्न चक्रों और बाजार वातावरण के लिए अनुकूलित किया जा सकता है
  • जोखिम को नियंत्रित करने के लिए स्टॉप जोड़े जा सकते हैं

जोखिम और न्यूनीकरण

  • रणनीति प्रारंभिक संकेतों पर निर्भर करती है, संभावित रूप से कुछ रुझानों को याद करती है
  • मजबूत रुझानों में विपरीत रुझान संकेत हो सकते हैं, जिससे नुकसान हो सकता है

जोखिमों को निम्न द्वारा कम किया जा सकता हैः

  • उपकरण चक्रों के लिए अनुकूलन अवधि पैरामीटर
  • झूठे संकेतों को कम करने के लिए फ़िल्टर बैंडविड्थ को कम करना
  • मजबूत रुझानों के खिलाफ संकेतों से बचने के लिए रुझान फ़िल्टर जोड़ना
  • ट्रेड प्रति हानि को नियंत्रित करने के लिए स्टॉप का उपयोग करना

बढ़ोतरी के अवसर

इस रणनीति में निम्नलिखित उपायों से सुधार किया जा सकता हैः

  • विभिन्न मूल्य स्रोतों जैसे बंद, चलती औसत आदि की कोशिश करना।
  • विशिष्ट उपकरण चक्रों के लिए फ़िल्टर अवधि को समायोजित करना
  • प्रवृत्ति का बेहतर पता लगाने के लिए प्रवृत्ति संकेतक मापदंडों का अनुकूलन
  • बेहतर संयोजन के लिए विभिन्न रुझान संकेतकों का प्रयोग करना
  • जोखिम नियंत्रण में सुधार के लिए स्टॉप और ट्रेलिंग स्टॉप जोड़ना
  • सर्वोत्तम पैरामीटर सेट के लिए पैरामीटर अनुकूलन

निष्कर्ष

यह रणनीति बाजार में चक्रीय मोड़ को प्रभावी ढंग से पहचानने के लिए वोस फिल्टर और प्रवृत्ति संकेतक को जोड़ती है। अनुकूलित मापदंडों और जोखिम नियंत्रण के साथ, यह एक मजबूत मात्रात्मक व्यापार प्रणाली का उत्पादन कर सकती है। यह अच्छी बैकटेस्ट परिणामों के रूप में चक्रीय पैटर्न प्रदर्शित करने वाले उपकरणों पर व्यापक रूप से लागू होती है। कुल मिलाकर, रणनीति में अद्वितीय भविष्य कहने की क्षमताएं हैं, और बहु-आयामी अनुकूलन के माध्यम से सुधार के लिए व्यापक क्षमता है।


/*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()


अधिक