আমি ২০২০ সালে একটি নিবন্ধ লিখেছিলাম উচ্চ-প্রবাহের কৌশল প্রবর্তন করে,https://www.fmz.com/bbs-topic/9750. যদিও এটি বেশ কিছুটা মনোযোগ পেয়েছে, তবে এটি খুব গভীর ছিল না। তার পর থেকে দুই বছরেরও বেশি সময় কেটে গেছে, এবং বাজারটি পরিবর্তিত হয়েছে। সেই নিবন্ধটি প্রকাশিত হওয়ার পরে, আমার উচ্চ-ফ্রিকোয়েন্সি কৌশলটি দীর্ঘ সময়ের জন্য স্থিতিশীল মুনাফা অর্জন করতে পারে, তবে ধীরে ধীরে, মুনাফা হ্রাস পেয়েছে এবং এমনকি এক পর্যায়ে বন্ধ হয়ে গেছে। সাম্প্রতিক মাসগুলিতে আমি এটি পুনর্নির্মাণের জন্য কিছু প্রচেষ্টা করেছি, এবং এখন এটি এখনও কিছু মুনাফা করতে পারে। এই নিবন্ধে, আমি আমার উচ্চ-ফ্রিকোয়েন্সি কৌশল ধারণাগুলির আরও বিশদ ভূমিকা এবং কিছু সরলীকৃত কোড বিতর্কের সূচনা পয়েন্ট হিসাবে সরবরাহ করব; এবং প্রতিক্রিয়াগুলি স্বাগত জানাই।
বিয়ানান্সকে উদাহরণ হিসাবে নিলে, এটির বর্তমানে 0.0005% এর নির্মাতা ছাড় রয়েছে। যদি দৈনিক লেনদেনের পরিমাণ 100 মিলিয়ন ইউ হয় তবে ছাড়টি 5000 ইউ হবে। অবশ্যই, গ্রহণকারী ফিগুলি এখনও ভিআইপি হারের উপর ভিত্তি করে, সুতরাং যদি কৌশলটি গ্রহণকারীদের প্রয়োজন না হয় তবে ভিআইপি স্তরের উচ্চ-ফ্রিকোয়েন্সি কৌশলগুলিতে সামান্য প্রভাব পড়ে। বিভিন্ন স্তরের এক্সচেঞ্জগুলির সাধারণত বিভিন্ন ছাড়ের হার থাকে এবং একটি উচ্চ লেনদেনের পরিমাণ বজায় রাখার প্রয়োজন হয়। প্রাথমিক সময়ে যখন কিছু মুদ্রা বাজার ব্যাপকভাবে ওঠানামা করে, তখন ছাড় ছাড়াইও মুনাফা ছিল। প্রতিযোগিতা তীব্র হওয়ার সাথে সাথে, ছাড়গুলি মুনাফার বৃহত্তর অংশের জন্য দায়ী ছিল বা এমনকি কেবল তাদের উপর নির্ভর করেছিল; উচ্চ-ফ্রিকোয়েন্সি ব্যবসায়ীরা শীর্ষ স্তরের ফি অনুসরণ করেছিল।
গতি। উচ্চ-ফ্রিকোয়েন্সি কৌশলগুলিকে উচ্চ-ফ্রিকোয়েন্সি বলা হয় কারণ তারা খুব দ্রুত। এক্সচেঞ্জের কালো সার্ভারে যোগদান, সর্বনিম্ন বিলম্ব এবং সবচেয়ে স্থিতিশীল সংযোগ অর্জন করা অভ্যন্তরীণ প্রতিযোগিতার শর্তগুলির মধ্যে একটি হয়ে উঠেছে। কৌশলটির অভ্যন্তরীণ খরচ সময় যতটা সম্ভব কম হওয়া উচিত এবং এই নিবন্ধটি আমি ব্যবহার করি এমন ওয়েবসকেট ফ্রেমওয়ার্কটি পরিচয় করিয়ে দেবে, যা সমান্তরাল সম্পাদন গ্রহণ করে।
উপযুক্ত বাজার। উচ্চ-ফ্রিকোয়েন্সি ট্রেডিংকে পরিমাণগত ব্যবসায়ের মুক্তা হিসাবে পরিচিত, এবং অনেক প্রোগ্রাম্যাটিক ট্রেডার এটি চেষ্টা করেছেন, তবে বেশিরভাগ লোক এটি বন্ধ করে দিয়েছে কারণ তারা লাভ করতে পারে না এবং উন্নতির দিক খুঁজে পায় না। প্রধান কারণটি হ'ল তারা ভুল ট্রেডিং বাজারটি বেছে নিয়েছে। কৌশল বিকাশের প্রাথমিক পর্যায়ে, ব্যবসায় লাভের জন্য তুলনামূলকভাবে সহজ বাজারগুলি বেছে নেওয়া উচিত যাতে লাভ এবং উন্নতির জন্য প্রতিক্রিয়া থাকে, যা কৌশলটির অগ্রগতির পক্ষে অনুকূল। আপনি যদি অনেক সম্ভাব্য প্রতিপক্ষের সাথে সর্বাধিক প্রতিযোগিতামূলক বাজারে প্রতিযোগিতা শুরু করেন তবে আপনি যতই চেষ্টা করুন না কেন, আপনি শীঘ্রই অর্থ হারাবেন এবং হাল ছেড়ে দেবেন। আমি নতুন চিরস্থায়ী চুক্তি ট্রেডিং জোড়া সুপারিশ করি যখন অনেক প্রতিযোগী নেই, বিশেষত তুলনামূলকভাবে বড় লেনদেনের পরিমাণযুক্ত; এই সময় লাভ করা সবচেয়ে সহজ। বিটিসি এবং ইটিএইচ-তে লেনদেনের পরিমাণ সবচেয়ে বেশি এবং সবচেয়ে সক্রিয় লেনদেনের পরিমাণ রয়েছে তবে বেঁচে থাকাও সবচেয়ে কঠিন।
প্রতিযোগিতার মুখোমুখি। যে কোনও লেনদেনের বাজার ক্রমাগত পরিবর্তিত হচ্ছে, এবং কোনও ট্রেডিং কৌশল চিরকাল স্থায়ী হতে পারে না, বিশেষত উচ্চ-ফ্রিকোয়েন্সি ট্রেডিংয়ে। এই বাজারে প্রবেশের অর্থ সরাসরি স্মার্ট এবং সবচেয়ে পরিশ্রমী ব্যবসায়ীদের সাথে প্রতিযোগিতা করা। শূন্য-সমাবেশ গেম বাজারে, আপনি যত বেশি উপার্জন করবেন, অন্যরা তত কম উপার্জন করবে। আপনি যত পরে প্রবেশ করবেন, ততই অসুবিধা বেশি হবে; ইতিমধ্যে বাজারে থাকা লোকদেরও ক্রমাগত উন্নতি করতে হবে। 3-4 বছর আগে সম্ভবত সেরা সুযোগ ছিল; সম্প্রতি, ডিজিটাল মুদ্রা বাজারে সামগ্রিক ক্রিয়াকলাপ হ্রাস পেয়েছে, যা নতুনদের জন্য এখন উচ্চ-ফ্রিকোয়েন্সি ট্রেডিং শুরু করা খুব কঠিন করে তুলেছে।
বিভিন্ন উচ্চ-ফ্রিকোয়েন্সি কৌশল রয়েছেঃ
নিম্নলিখিত কোডটি বাইনারেন্স চিরস্থায়ী চুক্তির প্রাথমিক কাঠামোর উপর ভিত্তি করে তৈরি করা হয়েছে, মূলত ওয়েবসকেট গভীরতা, গভীরতা অর্ডার প্রবাহের ট্রেড মার্কেট ডেটা এবং অবস্থান তথ্য সাবস্ক্রাইব করে। যেহেতু মার্কেট ডেটা এবং অ্যাকাউন্টের তথ্য আলাদাভাবে সাবস্ক্রাইব করা হয়, সর্বশেষ তথ্য পাওয়া গেছে কিনা তা নির্ধারণের জন্য অবিচ্ছিন্নভাবে পড়তে হবে। এখানে ইভেন্টলুপ (১০০০) সরাসরি অন্তহীন লুপ এড়াতে এবং সিস্টেমের লোড হ্রাস করতে ব্যবহৃত হয়। ইভেন্টলুপ (১০০০) অবরুদ্ধ হবে যতক্ষণ না 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()]})
*/