
[TOC] मैंने 2020 में उच्च आवृत्ति रणनीतियों का परिचय देते हुए एक लेख लिखा था, https://www.fmz.com/digest-topic/6228. यद्यपि इसे काफी ध्यान मिला, फिर भी इसे गहराई से नहीं लिखा गया। दो वर्ष से अधिक समय बीत चुका है और बाजार बदल चुका है। उस लेख के प्रकाशित होने के बाद, मेरी उच्च आवृत्ति रणनीति लंबे समय तक लगातार पैसा बनाने में सक्षम थी, लेकिन लाभ धीरे-धीरे कम हो गया और एक बिंदु पर भी रुक गया। हाल के महीनों में, मैंने नवीनीकरण पर बहुत प्रयास किया है और अब मैं कुछ पैसे कमाने में सक्षम हूँ। यह लेख उच्च आवृत्ति रणनीतियों और कुछ सरलीकृत कोडों के लिए मेरे विचारों को अधिक विस्तार से पेश करेगा, जो चर्चा के लिए एक प्रारंभिक बिंदु के रूप में काम कर सकता है। संवाद करने और प्रतिक्रिया देने के लिए सभी का स्वागत है।
छूट पाने वाले खातों के लिए, उदाहरण के तौर पर Binance को लेते हुए, मौजूदा मेकर छूट 100,000 का 0.5% है। अगर दैनिक लेनदेन की मात्रा 100 मिलियन U है, तो छूट 5,000 U होगी। बेशक, लेने वाला शुल्क अभी भी वीआईपी दर पर आधारित है, इसलिए यदि रणनीति को ऑर्डर लेने की आवश्यकता नहीं है, तो वीआईपी स्तर का उच्च आवृत्ति रणनीतियों पर बहुत कम प्रभाव पड़ेगा। सामान्यतः, विभिन्न स्तरों के एक्सचेंजों में अलग-अलग छूट दरें होती हैं, तथा उच्चतर लेनदेन मात्रा बनाए रखने की आवश्यकता होती है। बहुत समय पहले, जब कुछ मुद्राओं के बाजार में बहुत उतार-चढ़ाव होता था, तब भी छूट के बिना भी लाभ होता था। आंतरिक परिसंचरण की तीव्रता के साथ, छूट ने लाभ का एक बड़ा हिस्सा बना लिया, और यहां तक कि पूरी तरह से छूट पर निर्भर हो गए। उच्च आवृत्ति वाले व्यापारी शीर्ष दरें.
रफ़्तार। उच्च आवृत्ति रणनीति को उच्च आवृत्ति इसलिए कहा जाता है क्योंकि यह बहुत तेज़ होती है। न्यूनतम विलंबता और सर्वाधिक स्थिर कनेक्शन प्राप्त करने के लिए एक्सचेंज के कोलो सर्वर से जुड़ना भी आंतरिक संचलन के लिए शर्तों में से एक बन गया है। रणनीति की आंतरिक समय खपत भी यथासंभव कम होनी चाहिए। यह लेख मेरे द्वारा उपयोग किए जाने वाले वेबसोकेट फ्रेमवर्क का परिचय देगा, जो समवर्ती निष्पादन का उपयोग करता है।
सही बाजार. हाई-फ़्रीक्वेंसी ट्रेडिंग को क्वांटिटेटिव ट्रेडिंग का रत्न माना जाता है। मेरा मानना है कि कई प्रोग्रामेटिक ट्रेडर्स ने इसे आज़माया है, लेकिन ज़्यादातर लोग शायद इसलिए रुक जाते हैं क्योंकि वे पैसे नहीं कमा पाते और सुधार का कोई तरीका नहीं खोज पाते। इसका मुख्य कारण शायद यह है वे गलत रास्ता खोज रहे हैं। व्यापार बाजार। किसी रणनीति के प्रारंभिक चरण में, व्यक्ति को व्यापार करके पैसा कमाने के लिए अपेक्षाकृत आसान बाजारों की तलाश करनी चाहिए, ताकि लाभ हो और सुधार पर प्रतिक्रिया मिले, जो रणनीति की उन्नति के लिए अनुकूल होगी। यदि आप सबसे अधिक प्रतिस्पर्धी बाजार में शुरुआत करते हैं और कई संभावित प्रतिद्वंद्वियों के साथ प्रतिस्पर्धा करते हैं, तो आप चाहे कितनी भी कोशिश कर लें, पैसा खो देंगे और आप इसे और अधिक समय तक रोक नहीं पाएंगे। मैं नए सूचीबद्ध सतत अनुबंध ट्रेडिंग जोड़े की सलाह देता हूं। इस समय, इतने सारे प्रतिस्पर्धी नहीं हैं, खासकर जब ट्रेडिंग वॉल्यूम अपेक्षाकृत बड़ा है। यह पैसा बनाने का सबसे आसान समय है। बीटीसी और ईटीएच में सबसे अधिक ट्रेडिंग वॉल्यूम और सबसे अधिक सक्रिय लेनदेन होते हैं, लेकिन इनका अस्तित्व बनाये रखना भी सबसे कठिन होता है।
प्रतिस्पर्धा का सीधे सामना करें। कोई भी ट्रेडिंग मार्केट गतिशील रूप से बदल रहा है। कोई भी ट्रेडिंग रणनीति एक बार में ही काम नहीं आ सकती। हाई-फ़्रीक्वेंसी ट्रेडिंग में यह और भी स्पष्ट है। इस मार्केट में प्रवेश करने का मतलब है सबसे चतुर और सबसे मेहनती व्यापारियों के समूह के साथ सीधे प्रतिस्पर्धा करना। शून्य-योग बाज़ार में, जितना अधिक आप कमाते हैं, उतना ही कम अन्य लोग कमाते हैं। आप जितनी देर से प्रवेश करेंगे, यह उतना ही कठिन होगा। जो पहले से ही बाजार में हैं, उन्हें भी सुधार करते रहना चाहिए क्योंकि उन्हें कभी भी बाहर किया जा सकता है। तीन या चार साल पहले सबसे अच्छा अवसर होना चाहिए था। हाल ही में, डिजिटल मुद्रा बाजार की समग्र गतिविधि में गिरावट आई है, और अब नौसिखियों के लिए उच्च आवृत्ति व्यापार में संलग्न होना बहुत मुश्किल है।
उच्च आवृत्ति रणनीतियों के कई प्रकार हैं
मेरी रणनीति ट्रेंड और मार्केट मेकर का संयोजन है। मैं पहले ट्रेंड निर्धारित करता हूं, फिर ऑर्डर देता हूं, और लेनदेन पूरा होने के तुरंत बाद एक सेल ऑर्डर देता हूं। मैं इन्वेंट्री पोजीशन नहीं रखता। रणनीति कोड नीचे प्रस्तुत किया गया है।
निम्नलिखित कोड Binance सतत अनुबंधों की बुनियादी वास्तुकला पर आधारित है, और मुख्य रूप से वेबसोकेट गहराई आदेश प्रवाह ट्रेडों बाजार की जानकारी और स्थिति की जानकारी की सदस्यता लेता है। चूँकि बाजार की जानकारी और खाता जानकारी अलग-अलग सब्सक्राइब की जाती है, इसलिए यह निर्धारित करने के लिए कि क्या नवीनतम जानकारी प्राप्त हुई है, read(-1) का लगातार उपयोग करना आवश्यक है। सीधे अनंत लूप से बचने और सिस्टम के बोझ को कम करने के लिए यहाँ EventLoop(1000) का उपयोग किया जाता है। EventLoop(1000) को तब तक अवरुद्ध रखा जाएगा जब तक कि wss या समवर्ती कार्य वापस नहीं आ जाते, 1000ms की समय-सीमा के साथ।
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()
}
//需要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是设定的交易对
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)
}
}
जैसा कि पहले बताया गया है, मेरी उच्च आवृत्ति रणनीति में खरीद और बिक्री करने से पहले प्रवृत्ति का निर्धारण करना आवश्यक है। अल्पकालिक प्रवृत्ति को मुख्य रूप से प्रत्येक लेनदेन के लेनदेन डेटा के आधार पर आंका जाता है, अर्थात सदस्यता में aggTrade, जिसमें लेनदेन की दिशा, मूल्य, मात्रा, लेनदेन का समय आदि शामिल हैं। खरीदने और बेचने के लिए मुख्य संदर्भ गहराई और ट्रेडिंग वॉल्यूम हैं। निम्नलिखित उन संकेतकों का विस्तृत परिचय है जिन पर ध्यान देने की आवश्यकता है। अधिकांश संकेतक दो समूहों में विभाजित हैं: खरीदें और बेचें, और एक निश्चित समय खिड़की में गतिशील रूप से गिने जाते हैं। मेरी रणनीति की समय खिड़की 10 सेकंड के भीतर है।
//bull代表短期看涨,bear短期看跌
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 औसत बाजार मूल्य का अंतर है। एक खरीद आदेश केवल तभी रखा जाएगा जब बोली-पूछो प्रसार इस मूल्य के एक निश्चित गुणक से अधिक हो और प्रवृत्ति तेजी की हो। यदि आप एक छोटा ऑर्डर रखते हैं, तो स्थिति ऑर्डर को लंबे समय तक रोके रखने से बचने के लिए इस समय इसे भी बंद रखा जाएगा। यह सुनिश्चित करने के लिए कि लंबित ऑर्डर निष्पादित हो, आप केवल-निर्माता ऑर्डर दे सकते हैं। और आप Binance की कस्टम ऑर्डर आईडी का उपयोग कर सकते हैं, इसलिए आपको ऑर्डर वापस आने का इंतजार नहीं करना पड़ेगा।
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 = []
}
/*
需要的任务参数写在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()]})
*/