मैंने 2020 में एक लेख लिखा था जिसमें उच्च आवृत्ति रणनीतियों का परिचय दिया गया था,https://www.fmz.com/bbs-topic/9750. हालांकि इसने काफी ध्यान आकर्षित किया, लेकिन यह बहुत गहराई से नहीं था। तब से दो साल से अधिक समय बीत चुका है, और बाजार बदल गया है। उस लेख के प्रकाशित होने के बाद, मेरी उच्च आवृत्ति रणनीति लंबे समय तक स्थिर रूप से लाभ कमा सकती थी, लेकिन धीरे-धीरे, लाभ में गिरावट आई और एक बिंदु पर भी रुक गई। हाल के महीनों में मैंने इसे नवीनीकृत करने के लिए कुछ प्रयास किए हैं, और अब यह अभी भी कुछ लाभ कमा सकता है। इस लेख में, मैं अपने उच्च आवृत्ति रणनीति विचारों का अधिक विस्तृत परिचय प्रदान करूंगा और चर्चा के लिए एक प्रारंभिक बिंदु के रूप में कुछ सरलीकृत कोड; और प्रतिक्रियाओं का स्वागत है।
रिबेट खाते, उदाहरण के रूप में बिनेंस को लेते हुए, वर्तमान में इसमें 0.0005% की निर्माता छूट है। यदि दैनिक लेनदेन राशि 100 मिलियन यू है, तो छूट 5000 यू होगी। बेशक, लेने वाले शुल्क अभी भी वीआईपी दरों पर आधारित हैं, इसलिए यदि रणनीति में लेने वालों की आवश्यकता नहीं है, तो वीआईपी स्तर का उच्च आवृत्ति रणनीतियों पर बहुत कम प्रभाव पड़ता है। विभिन्न स्तरों के एक्सचेंजों में आम तौर पर अलग-अलग छूट दरें होती हैं और उच्च लेनदेन राशि बनाए रखने की आवश्यकता होती है। शुरुआती समय में जब कुछ मुद्रा बाजारों में भारी उतार-चढ़ाव होता था, तब भी छूट के बिना लाभ होते थे। जैसे-जैसे प्रतिस्पर्धा तेज हुई, छूट लाभ का एक बड़ा हिस्सा थी या यहां तक कि केवल उन पर निर्भर थी; उच्च आवृत्ति वाले व्यापारी शीर्ष स्तर की फीस का पीछा करते थे।
गति. उच्च आवृत्ति रणनीतियों को उच्च आवृत्ति कहा जाता है क्योंकि वे बहुत तेज़ हैं। एक्सचेंज के कोलो सर्वर से जुड़ना, सबसे कम विलंबता और सबसे स्थिर कनेक्शन प्राप्त करना भी आंतरिक प्रतिस्पर्धा की शर्तों में से एक बन गया है। रणनीति का आंतरिक खपत समय जितना संभव हो उतना कम होना चाहिए, और यह लेख मेरे द्वारा उपयोग किए जाने वाले वेबसॉकेट फ्रेमवर्क का परिचय देगा, जो समवर्ती निष्पादन को अपनाता है।
उपयुक्त बाजार। उच्च आवृत्ति व्यापार को मात्रात्मक व्यापार का मोती के रूप में जाना जाता है, और कई प्रोग्रामेटिक व्यापारियों ने इसे आज़माया है, लेकिन अधिकांश लोगों ने बंद कर दिया क्योंकि वे लाभ नहीं कमा सकते हैं और सुधार के लिए दिशा नहीं पा सकते हैं। मुख्य कारण यह होना चाहिए कि उन्होंने गलत ट्रेडिंग बाजार चुना है। रणनीति विकास के प्रारंभिक चरण में, व्यापार में लाभ कमाने के लिए अपेक्षाकृत आसान बाजारों का चयन किया जाना चाहिए ताकि लाभ और सुधार के लिए प्रतिक्रिया हो, जो रणनीति की प्रगति के लिए अनुकूल है। यदि आप कई संभावित विरोधियों के साथ सबसे अधिक प्रतिस्पर्धी बाजार में प्रतिस्पर्धा करना शुरू करते हैं, चाहे आप कितनी भी कोशिश करें, आप जल्द ही पैसा खो देंगे और हार जाएंगे। मैं नए स्थायी अनुबंध ट्रेडिंग जोड़े की सिफारिश करता हूं जब इतने सारे प्रतियोगी नहीं हैं, खासकर अपेक्षाकृत बड़ी लेनदेन राशि वाले; यह तब होता है जब लाभ कमाना सबसे आसान होता है। बीटीसी और ईटीएच में सबसे बड़ी लेनदेन राशि होती है और लेनदेन सबसे सक्रिय होते हैं लेकिन जीवित रहना भी सबसे मुश्किल होता है।
प्रतिस्पर्धा का सामना करना। किसी भी लेनदेन के लिए बाजार लगातार बदल रहा है, और कोई भी ट्रेडिंग रणनीति हमेशा के लिए नहीं रह सकती है, खासकर उच्च आवृत्ति व्यापार में। इस बाजार में प्रवेश करने का मतलब है सीधे सबसे स्मार्ट और सबसे मेहनती व्यापारियों के साथ प्रतिस्पर्धा करना। शून्य-समुच्चय गेम बाजार में, जितना अधिक आप कमाते हैं, उतना ही अन्य कमाते हैं। जितना बाद में आप प्रवेश करते हैं, उतना ही कठिनाई अधिक होती है; जो पहले से ही बाजार में हैं उन्हें भी लगातार सुधार करना चाहिए। 3-4 साल पहले शायद सबसे अच्छा अवसर था; हाल ही में, डिजिटल मुद्रा बाजारों में समग्र गतिविधि में गिरावट आई है, जिससे नए लोगों के लिए उच्च आवृत्ति व्यापार शुरू करना बहुत मुश्किल हो गया है।
विभिन्न उच्च आवृत्ति रणनीतियाँ हैंः
निम्नलिखित कोड बिनेंस स्थायी अनुबंधों के बुनियादी ढांचे पर आधारित है, मुख्य रूप से वेबसॉकेट गहराई, गहराई ऑर्डर प्रवाह ट्रेड बाजार डेटा और स्थिति की जानकारी की सदस्यता लेता है। चूंकि बाजार डेटा और खाता जानकारी को अलग से सदस्यता ली जाती है, इसलिए यह निर्धारित करने के लिए लगातार पढ़ना आवश्यक है कि क्या नवीनतम जानकारी प्राप्त की गई है। यहां इवेंटलूप (EventLoop) का उपयोग प्रत्यक्ष अंतहीन लूप से बचने और सिस्टम लोड को कम करने के लिए किया जाता है। इवेंटलूप (EventLoop) 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 are the set trading pairs
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 सेकंड के भीतर है।
//bull represents short-term bullish, bear represents short-term bearish
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]
}
यहाँ, हम अभी भी पुराने दृष्टिकोण को अपनाते हैं, आवश्यक गहराई तक पुनरावृत्ति करते हैं। यह मानते हुए कि 10 सिक्के 1 सेकंड में कारोबार किए जा सकते हैं, नए लंबित आदेशों पर विचार किए बिना, बिक्री मूल्य उस स्थिति पर निर्धारित किया जाता है जहां 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)//Unreturned tasks will continue to wait next time
}
})
jobs = new_jobs
tasks = []
}
/*
Write the required task parameters in param
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()]})
*/