मैंने 2020 में उच्च आवृत्ति व्यापार रणनीतियों का परिचय देने वाला एक लेख लिखा था (https://www.fmz.com/digest-topic/6228) हालांकि इसने कुछ ध्यान आकर्षित किया, लेकिन यह बहुत गहरा नहीं था। तब से ढाई साल बीत चुके हैं, और बाजार बदल गया है। उस लेख को प्रकाशित करने के बाद, मेरी उच्च आवृत्ति रणनीति लंबे समय तक स्थिर लाभ कमाने में सक्षम थी, लेकिन लाभ धीरे-धीरे गिर गया और एक बिंदु पर भी रुक गया। हाल के महीनों में, मैंने इसे नवीनीकृत करने में समय बिताया है, और यह अभी भी कुछ छोटे लाभ कमा सकता है। यह लेख मेरी उच्च आवृत्ति व्यापार रणनीति और कुछ सरलीकृत कोड का अधिक विस्तृत परिचय प्रदान करेगा, जो चर्चा और प्रतिक्रिया के लिए एक प्रारंभिक बिंदु के रूप में कार्य करता है।
आयोग के छूट खातों
उदाहरण के तौर पर बाइनेंस का उपयोग करते हुए, वर्तमान में प्रति 100,000 यूनिट ट्रेड किए जाने पर 0.05% की मेकर छूट की पेशकश करते हैं। यदि दैनिक ट्रेडिंग वॉल्यूम 100 मिलियन यू है, तो छूट 5,000 यू है। बेशक, लेने वाला शुल्क अभी भी वीआईपी दर पर निर्भर करता है, इसलिए यदि रणनीति को ऑर्डर लेने की आवश्यकता नहीं है, तो वीआईपी स्तर का उच्च आवृत्ति रणनीति पर बहुत कम प्रभाव पड़ता है। विभिन्न एक्सचेंजों पर कमीशन की छूट के विभिन्न स्तर उपलब्ध हैं, जिसके लिए उच्च ट्रेडिंग वॉल्यूम की आवश्यकता होती है। शुरुआती दिनों में, अभी भी छूट के बिना लाभ कमाया जा सकता था, लेकिन जैसे-जैसे प्रतिस्पर्धा तेज हुई, छूट लाभ का एक बड़ा अनुपात के लिए जिम्मेदार थी, और उच्च आवृत्ति वाले व्यापारियों ने शीर्ष दरों का पीछा किया।
गति
उच्च आवृत्ति व्यापार को इसकी तेज गति के कारण ऐसा कहा जाता है। एक ट्रेडिंग एक्सचेंज के कोलोकेशन सर्वर से जुड़ना और सबसे कम विलंबता और सबसे स्थिर कनेक्शन प्राप्त करना प्रतिस्पर्धा की शर्तों में से एक बन गया है। रणनीति का आंतरिक प्रसंस्करण समय भी कम से कम होना चाहिए। यह लेख मेरे द्वारा उपयोग किए गए वेबसॉकेट फ्रेमवर्क का परिचय देगा, जो समवर्ती निष्पादन का उपयोग करता है।
उपयुक्त बाजार
उच्च आवृत्ति व्यापार को मात्रात्मक व्यापार के मुकुट में रत्न माना जाता है, और मेरा मानना है कि कई एल्गोरिथम व्यापारियों ने इसे आजमाया है, लेकिन अधिकांश लोगों को रोकना चाहिए था क्योंकि वे पैसा नहीं बना सके और सुधार का कोई तरीका नहीं ढूंढ सके। मुख्य कारण शायद इसलिए है क्योंकि उन्होंने गलत ट्रेडिंग बाजार चुना। रणनीति के प्रारंभिक चरण में, लाभ कमाने और सुधार के लिए प्रतिक्रिया प्राप्त करने के लिए अपेक्षाकृत आसान बाजारों को व्यापार के लिए लक्षित किया जाना चाहिए, जो रणनीति की प्रगति के लिए अनुकूल है। यदि आप सबसे अधिक प्रतिस्पर्धी बाजार में शुरू करते हैं और कई विरोधियों के साथ प्रतिस्पर्धा करते हैं, तो आप चाहे जितना भी प्रयास करें, पैसे खो देंगे, और आप जल्दी से हार जाएंगे। मैं नए लॉन्च किए गए स्थायी अनुबंध ट्रेडिंग जोड़े के साथ शुरू करने की सलाह देता हूं, जहां कम प्रतियोगी हैं, विशेष रूप से अपेक्षाकृत बड़ी ट्रेडिंग मात्रा वाले, जिससे व्यापार करना आसान हो जाता है। BTC और ETH में सबसे अधिक मात्रा और सबसे अधिक सक्रियता है, लेकिन वे जीवित रहने में भी सबसे कठिन हैं।
प्रतिस्पर्धा का सामना करें
किसी भी ट्रेडिंग के लिए बाजार लगातार बदल रहा है, और कोई भी ट्रेडिंग रणनीति एक बार का समाधान नहीं हो सकती है। यह उच्च आवृत्ति व्यापार में और भी स्पष्ट है, जहां बाजार में प्रवेश करने का मतलब है सबसे स्मार्ट और सबसे मेहनती व्यापारियों के साथ सीधे प्रतिस्पर्धा करना। शून्य-समुच्चय गेम बाजार में, जितना अधिक आप कमाते हैं, उतना ही अन्य कमाते हैं। जितना बाद में आप प्रवेश करते हैं, उतना ही कठिन होता है, और जो पहले से ही बाजार में हैं उन्हें लगातार सुधार करना पड़ता है और किसी भी समय समाप्त किया जा सकता है। तीन या चार साल पहले शायद सबसे अच्छा अवसर था, लेकिन डिजिटल मुद्रा बाजार में गतिविधि में हालिया समग्र गिरावट के साथ, शुरुआती लोगों के लिए उच्च आवृत्ति व्यापार करना शुरू करना बहुत मुश्किल हो गया है।
कई उच्च आवृत्ति ट्रेडिंग रणनीतियाँ हैं, जैसे कि उच्च आवृत्ति आर्बिट्रेज, जिसमें इस या अन्य एक्सचेंजों के माध्यम से आर्बिट्रेज के अवसरों को खोजना शामिल है, दूसरों से पहले ऑर्डर खाने और गति लाभ के साथ लाभ कमाने का अवसर लेना; उच्च आवृत्ति प्रवृत्ति व्यापार, जिसमें अल्पकालिक रुझानों से लाभ प्राप्त करना शामिल है; और बाजार निर्माण, जिसमें खरीद और बिक्री ट्रेडों के दोनों पक्षों पर ऑर्डर देना शामिल है, पदों को अच्छी तरह से नियंत्रित करना और कमीशन छूट के माध्यम से लाभ कमाना शामिल है। मेरी रणनीति प्रवृत्ति और बाजार निर्माण को जोड़ती है, पहले रुझानों की पहचान करना और फिर ऑर्डर देना, निष्पादन के तुरंत बाद बेचना और स्टॉक पदों को नहीं रखना। नीचे रणनीति कोड का परिचय है।
निम्नलिखित कोड बाइनेंस स्थायी अनुबंध के बुनियादी वास्तुकला पर आधारित है और मुख्य रूप से वेबसॉकेट गहराई ऑर्डर प्रवाह ट्रेडों और स्थिति की जानकारी की सदस्यता लेता है। चूंकि बाजार डेटा और खाता जानकारी को अलग से सदस्यता ली जाती है, इसलिए नवीनतम जानकारी प्राप्त की गई है या नहीं यह निर्धारित करने के लिए लगातार पढ़ने (-1) का उपयोग करने की आवश्यकता है। यहां, इवेंटलूप (1000) का उपयोग प्रत्यक्ष मृत लूप से बचने और सिस्टम लोड को कम करने के लिए किया जाता है। इवेंटलूप (1000) तब तक ब्लॉक करता है जब तक कि 1000ms के टाइमआउट के साथ wss या समवर्ती कार्य वापसी न हो।
var datastream = null
var tickerstream = null
var update_listenKey_time = 0
function ConncetWss(){
if (Date.now() - update_listenKey_time < 50*60*1000) {
return
}
if(datastream || tickerstream){
datastream.close()
tickerstream.close()
}
// need APIKEY
let req = HttpQuery(Base+'/fapi/v1/listenKey', {method: 'POST',data: ''}, null, 'X-MBX-APIKEY:' + APIKEY)
let listenKey = JSON.parse(req).listenKey
datastream = Dial("wss://fstream.binance.com/ws/" + listenKey + '|reconnect=true', 60)
// Symbols is the pair of symbol
let trade_symbols_string = Symbols.toLowerCase().split(',')
let wss_url = "wss://fstream.binance.com/stream?streams="+trade_symbols_string.join(Quote.toLowerCase()+"@aggTrade/")+Quote.toLowerCase()+"@aggTrade/"+trade_symbols_string.join(Quote.toLowerCase()+"@depth20@100ms/")+Quote.toLowerCase()+"@depth20@100ms"
tickerstream = Dial(wss_url+"|reconnect=true", 60)
update_listenKey_time = Date.now()
}
function ReadWss(){
let data = datastream.read(-1)
let ticker = tickerstream.read(-1)
while(data){
data = JSON.parse(data)
if (data.e == 'ACCOUNT_UPDATE') {
updateWsPosition(data)
}
if (data.e == 'ORDER_TRADE_UPDATE'){
updateWsOrder(data)
}
data = datastream.read(-1)
}
while(ticker){
ticker = JSON.parse(ticker).data
if(ticker.e == 'aggTrade'){
updateWsTrades(ticker)
}
if(ticker.e == 'depthUpdate'){
updateWsDepth(ticker)
}
ticker = tickerstream.read(-1)
}
makerOrder()
}
function main() {
while(true){
ConncetWss()
ReadWss()
worker()
updateStatus()
EventLoop(1000)
}
}
जैसा कि पहले उल्लेख किया गया है, मेरी उच्च आवृत्ति रणनीति को पहले खरीद और बिक्री ट्रेडों को निष्पादित करने से पहले रुझानों की पहचान करने की आवश्यकता होती है। अल्पकालिक रुझानों का न्याय मुख्य रूप से लेनदेन डेटा पर आधारित होता है, अर्थात, एगट्रेड सब्सक्राइब किया जाता है, जिसमें दिशा, मूल्य, मात्रा और लेनदेन का समय शामिल होता है। खरीद और बिक्री ट्रेड मुख्य रूप से गहराई और लेनदेन की मात्रा को संदर्भित करते हैं। निम्नलिखित विस्तृत संकेतक हैं जिन पर विचार करने की आवश्यकता है, जिनमें से अधिकांश को खरीद और बिक्री के लिए दो समूहों में विभाजित किया जाता है और गतिशील रूप से एक निश्चित समय खिड़की के भीतर गिना जाता है। मेरी रणनीति की समय खिड़की 10 सेकंड के भीतर है।
let bull = last_sell_price > avg_sell_price && last_buy_price > avg_buy_price &&
avg_buy_amount / avg_buy_time > avg_sell_amount / avg_sell_time;
let bear = last_sell_price < avg_sell_price && last_buy_price < avg_buy_price &&
avg_buy_amount / avg_buy_time < avg_sell_amount / avg_sell_time;
यदि अंतिम ऑर्डर मूल्य औसत ऑर्डर मूल्य से अधिक है और अंतिम ऑर्डर मूल्य औसत ऑर्डर मूल्य से अधिक है और खरीद आदेश का मूल्य एक निश्चित अंतराल पर बिक्री आदेश के मूल्य से अधिक है, तो यह एक अल्पकालिक तेजी वाला बाजार माना जाता है। मंदी वाले बाजारों के लिए विपरीत सच है।
function updatePrice(depth, bid_amount, ask_amount) {
let buy_price = 0
let sell_price = 0
let acc_bid_amount = 0
let acc_ask_amount = 0
for (let i = 0; i < Math.min(depth.asks.length, depth.bids.length); i++) {
acc_bid_amount += parseFloat(depth.bids[i][1])
acc_ask_amount += parseFloat(depth.asks[i][1])
if (acc_bid_amount > bid_amount && buy_price == 0) {
buy_price = parseFloat(depth.bids[i][0]) + tick_size
}
if (acc_ask_amount > ask_amount && sell_price == 0) {
sell_price = parseFloat(depth.asks[i][0]) - tick_size
}
if (buy_price > 0 && sell_price > 0) {
break
}
}
return [buy_price, sell_price]
}
यहां, आवश्यक मात्रा में पुनरावृत्ति गहराई का पुराना तरीका अभी भी उपयोग किया जाता है। यह मानते हुए कि एक खरीद आदेश जो 1 सेकंड के भीतर 10 सिक्कों के लिए निष्पादित किया जा सकता है और नए आदेशों की स्थिति पर विचार किए बिना, बिक्री मूल्य को उस स्थिति पर सेट किया जाता है जहां खरीद आदेश
10 सिक्कों की मात्रा के साथ हिट कर सकते हैं। विशिष्ट समय खिड़की का आकार स्वयं से सेट करने की जरूरत है।
let buy_amount = Ratio * avg_sell_amount / avg_sell_time
let sell_amount = Ratio * avg_buy_amount / avg_buy_time
यह अनुपात अंतिम बिक्री आदेश मात्रा का एक निश्चित अनुपात है, जो अंतिम बिक्री आदेश मात्रा के एक निश्चित अनुपात के रूप में खरीद आदेश मात्रा का प्रतिनिधित्व करता है। यह रणनीति को वर्तमान खरीद और बिक्री गतिविधि के अनुसार आदेश आकार को समायोजित करने की अनुमति देता है।
if(bull && (sell_price-buy_price) > N * avg_diff) {
trade('buy', buy_price, buy_amount)
}else if(position.amount < 0){
trade('buy', buy_price, -position.amount)
}
if(bear && (sell_price-buy_price) > N * avg_diff) {
trade('sell', sell_price, sell_amount)
}else if(position.amount > 0){
trade('sell', sell_price, position.amount)
}
उनमें से, avg_diff स्प्रेड में औसत अंतर है, और केवल जब ऑर्डर लगाने में खरीद और बिक्री अंतर इस मूल्य के एक निश्चित गुणक से अधिक होता है और बाजार तेजी से होता है तो एक खरीद ऑर्डर रखा जाएगा। यदि एक छोटी स्थिति को पकड़ना है, तो स्थिति को लंबे समय तक रखने से बचने के लिए स्थिति को भी बंद कर दिया जाएगा। ऑर्डर भरने के लिए केवल निर्माता ऑर्डर रखे जा सकते हैं, और कस्टम ऑर्डर आईडी का उपयोग ऑर्डर रिटर्न की प्रतीक्षा करने से बचने के लिए किया जा सकता है।
var tasks = []
var jobs = []
function worker(){
let new_jobs = []
for(let i=0; i<tasks.length; i++){
let task = tasks[i]
jobs.push(exchange.Go.apply(this, task.param))
}
_.each(jobs, function(t){
let ret = t.wait(-1)
if(ret === undefined){
new_jobs.push(t)//未返回的任务下次继续等待
}
})
jobs = new_jobs
tasks = []
}
/*
tasks.push({'type':'order','param': ["IO", "api", "POST","/fapi/v1/order",
"symbol="+symbol+Quote+"&side="+side+"&type=LIMIT&timeInForce=GTX&quantity="+
amount+"&price="+price+"&newClientOrderId=" + UUID() +"×tamp="+Date.now()]})
*/