
[TOC] আমি 2020-এ উচ্চ-ফ্রিকোয়েন্সি কৌশলগুলি প্রবর্তন করে একটি নিবন্ধ লিখেছিলাম, https://www.fmz.com/digest-topic/6228৷ যদিও এটি অনেক মনোযোগ পেয়েছে, এটি গভীরভাবে লেখা হয়নি। দুই বছরেরও বেশি সময় পেরিয়ে গেছে, বাজারও বদলে গেছে। সেই নিবন্ধটি প্রকাশিত হওয়ার পরে, আমার উচ্চ-ফ্রিকোয়েন্সি কৌশল দীর্ঘ সময়ের জন্য স্থিরভাবে অর্থ উপার্জন করতে সক্ষম হয়েছিল, কিন্তু লাভ ধীরে ধীরে হ্রাস পেয়েছে এবং এমনকি কিছু সময়ের জন্য বন্ধ হয়ে গেছে। সাম্প্রতিক মাসগুলিতে, আমি এটিকে সংস্কার করার জন্য অনেক প্রচেষ্টা করেছি এবং আমি এখনও কিছু অল্প অর্থ উপার্জন করতে পারি। এই নিবন্ধটি আমার উচ্চ-ফ্রিকোয়েন্সি কৌশল এবং কিছু সরলীকৃত কোডের ধারণাগুলিকে আরও বিশদে উপস্থাপন করবে, যা একটি সূচনা বিন্দু হিসাবে কাজ করবে প্রত্যেককে প্রতিক্রিয়া বিনিময় করতে স্বাগতম।
রিবেট সহ অ্যাকাউন্টের জন্য, বর্তমানে মেকার রিবেট হল 5⁄100,000 ইউ, রিবেট হবে 5,000 U। অবশ্যই, গ্রহণকারীরা এখনও ভিআইপি হারের উপর নির্ভর করে, তাই যদি কৌশলটির জন্য অর্ডার নেওয়ার প্রয়োজন না হয়, তবে ভিআইপি স্তর উচ্চ-ফ্রিকোয়েন্সি কৌশলগুলির উপর সামান্য প্রভাব ফেলবে। সাধারণত, এক্সচেঞ্জের বিভিন্ন স্তরের বিভিন্ন রিবেট রেট থাকে এবং উচ্চতর লেনদেনের পরিমাণ বজায় রাখা প্রয়োজন। অনেক দিন আগে, যখন কিছু মুদ্রার বাজার মূল্য ব্যাপকভাবে ওঠানামা করেছিল, তখনও রিবেট ছাড়াই মুনাফা ছিল হার
গতি উচ্চ-ফ্রিকোয়েন্সি কৌশলটিকে উচ্চ-ফ্রিকোয়েন্সি বলা হয় কারণ এটি খুব দ্রুত। সর্বনিম্ন লেটেন্সি এবং সবচেয়ে স্থিতিশীল সংযোগ পেতে এক্সচেঞ্জ কোলো সার্ভারে যোগদান ইনভল্যুশনের অন্যতম শর্ত হয়ে উঠেছে। কৌশলটির অভ্যন্তরীণ সময় খরচ যতটা সম্ভব কম হওয়া উচিত এই নিবন্ধটি আমি যে ওয়েবসকেট ফ্রেমওয়ার্কটি ব্যবহার করি, সেটিকে একযোগে কার্যকর করা হয়।
সঠিক বাজার। উচ্চ-ফ্রিকোয়েন্সি ট্রেডিংকে পরিমাণগত ট্রেডিংয়ের মুক্তা বলা হয়, আমি বিশ্বাস করি যে অনেক প্রোগ্রাম ব্যবসায়ীরা এটি চেষ্টা করেছেন, কিন্তু বেশিরভাগ লোকই থামবে কারণ তারা অর্থ উপার্জন করতে পারে না এবং উন্নতির জন্য একটি দিক খুঁজে পায় না ট্রেডিং মার্কেটের ভুল খুঁজে বের করুন। কৌশলের প্রাথমিক পর্যায়ে, আপনি ট্রেডিংয়ের জন্য অর্থোপার্জনের জন্য তুলনামূলকভাবে সহজ বাজারগুলি খুঁজে পাবেন, এইভাবে লাভ এবং উন্নত প্রতিক্রিয়া থাকবে, যা কৌশলটির অগ্রগতির জন্য সহায়ক। আপনি যদি শুরু থেকেই সবচেয়ে প্রতিযোগিতামূলক বাজারে অনেক সম্ভাব্য প্রতিদ্বন্দ্বীর সাথে প্রতিদ্বন্দ্বিতা করেন, তাহলে আপনি যতই চেষ্টা করুন না কেন আপনি অর্থ হারাবেন এবং আপনি শীঘ্রই টিকে থাকতে পারবেন না। আমি নতুন চিরস্থায়ী চুক্তি ট্রেডিং জোড়ার পরামর্শ দিচ্ছি এই সময়ে খুব বেশি প্রতিযোগী নেই, বিশেষ করে যাদের ট্রেডিং ভলিউম এই সময়ে সবচেয়ে সহজ। BTC এবং ETH-এর সবচেয়ে বড় ট্রেডিং ভলিউম এবং সবচেয়ে সক্রিয় লেনদেন আছে, কিন্তু তাদের টিকে থাকাও সবচেয়ে কঠিন।
প্রতিযোগীতার মুখোমুখি। যেকোন ট্রেডিং স্ট্র্যাটেজি একবারে ঠিক করা যায় না এবং যখন আপনি এই মার্কেটে প্রবেশ করেন, তখন আপনি সবচেয়ে বুদ্ধিমান এবং পরিশ্রমী ট্রেডারদের সাথে প্রতিদ্বন্দ্বিতা করবেন। একটি শূন্য-সমষ্টি গেম বাজারে, আপনি যত বেশি উপার্জন করবেন, অন্যরা তত কম উপার্জন করবে। আপনি যত পরে প্রবেশ করবেন, তত বেশি অসুবিধা হবে যারা ইতিমধ্যেই বাজারে আছে তাদের উন্নতি অব্যাহত রাখতে হবে এবং যেকোন সময় দূর হতে পারে। তিন বা চার বছর আগে এটি হওয়া উচিত ছিল সাম্প্রতিককালে, ডিজিটাল মুদ্রা বাজারের সামগ্রিক কার্যকলাপ এখন উচ্চ-ফ্রিকোয়েন্সি ট্রেডিং শুরু করা খুবই কঠিন।
অনেক ধরনের উচ্চ-ফ্রিকোয়েন্সি কৌশল রয়েছে
আমার কৌশল হল প্রবণতা এবং বাজার প্রস্তুতকারকদের সংমিশ্রণ, তারপরে একটি অর্ডার দিন এবং লেনদেন শেষ হওয়ার সাথে সাথে আমি এটির সাথে পরিচয় করিয়ে দেব কৌশল কোড।
নিম্নলিখিত কোডটি Binance-এর চিরস্থায়ী চুক্তির মৌলিক কাঠামোর উপর ভিত্তি করে তৈরি করা হয়েছে এটি প্রধানত ওয়েবসকেটের গভীরতা অর্ডার ফ্লো ট্রেড মার্কেট এবং অবস্থানের তথ্যে সাবস্ক্রাইব করে। যেহেতু বাজার এবং অ্যাকাউন্টের তথ্য আলাদাভাবে সাবস্ক্রাইব করা হয়েছে, তাই আপনাকে ক্রমাগতভাবে রিড(-1) ব্যবহার করতে হবে যাতে একটি সরাসরি অসীম লুপ এড়াতে এবং সিস্টেমের বোঝা কমাতে সর্বশেষ তথ্য প্রাপ্ত হয় কিনা। ইভেন্টলুপ(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()
}
//需要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 সেকেন্ডের মধ্যে কার্যকর করা যেতে পারে। নতুন মুলতুবি অর্ডার বিবেচনা না করে, বিক্রয় অর্ডারের মূল্য সেই অবস্থানে সেট করা হয় যেখানে ১০টি কয়েনের ক্রয় অর্ডার আসবে। আপনাকে নির্দিষ্ট সময়সীমার আকার নিজেই সেট করতে হবে।
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()]})
*/