বেশিরভাগ ক্রিপ্টোকারেন্সি এক্সচেঞ্জ ওয়েবসকেট এর মাধ্যমে মার্কেট ডেটা পাঠাতে সমর্থন করে এবং কিছু এক্সচেঞ্জ ওয়েবসকেট এর মাধ্যমে অ্যাকাউন্টের তথ্য আপডেট করতেও সমর্থন করে। REST API এর তুলনায়, ওয়েবসকেটের সাধারণত কম লেটেন্সি, উচ্চতর ফ্রিকোয়েন্সি থাকে এবং প্ল্যাটফর্মের বিশ্রাম API হারের সীমা সাপেক্ষে নয়। তবে, এটিতে সম্ভাব্য বাধা এবং কম স্বজ্ঞাত হ্যান্ডলিংয়ের অসুবিধা রয়েছে।
এই নিবন্ধটি প্রধানত ডায়াল ফাংশনের ব্যবহারের পরিচয় করিয়ে দেবে, যা জাভাস্ক্রিপ্ট ভাষা ব্যবহার করে এফএমজেড কোয়ান্ট প্ল্যাটফর্মে ক্যাপসুল করা হয়েছে।
একটি সরাসরি সংযোগ সাধারণত যথেষ্ট, যেমন একটি মুদ্রা নিরাপত্তা টিকার চাপ পেতেঃ
var client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr")
যখন ফিরে আসা ডেটা সংকুচিত বিন্যাসে থাকে, তখন সংযোগের সময় এটি নির্দিষ্ট করা প্রয়োজন। সংকোচনের বিন্যাস নির্দিষ্ট করতে
var client = Dial("wss://real.okex.com:10441/websocket?compress=true|compress=gzip_raw&mode=recv")
ডায়াল ফাংশন পুনরায় সংযোগ সমর্থন করে, যা অন্তর্নিহিত গো ভাষা দ্বারা পরিচালিত হয়। সংযোগটি সংযোগ বিচ্ছিন্ন হওয়ার জন্য সনাক্ত করা হলে এটি স্বয়ংক্রিয়ভাবে পুনরায় সংযোগ স্থাপন করে। যেখানে অনুরোধের ডেটা ইতিমধ্যে ইউআরএলে অন্তর্ভুক্ত রয়েছে, যেমন বাইনারেন্সের সাথে পূর্ববর্তী উদাহরণে, এটি ব্যবহার করা খুব সুবিধাজনক এবং প্রস্তাবিত। তবে, যেখানে সাবস্ক্রিপশন বার্তা প্রেরণের প্রয়োজন হয় সেই ক্ষেত্রে, পুনরায় সংযোগ প্রক্রিয়াটি ম্যানুয়ালি বজায় রাখার পরামর্শ দেওয়া হয়।
var client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr|reconnect=true")
wss বার্তাগুলিতে সাবস্ক্রাইব করুন, কিছু এক্সচেঞ্জের ইউআরএলে অনুরোধ রয়েছে, এবং এমন চ্যানেলও রয়েছে যেখানে আপনাকে আপনার নিজস্ব সাবস্ক্রিপশন পাঠাতে হবে, যেমন coinbase:
client = Dial("wss://ws-feed.pro.coinbase.com", 60)
client.write('{"type": "subscribe","product_ids": ["BTC-USD"],"channels": ["ticker","heartbeat"]}')
সাধারণভাবে, এটি একটি অসীম লুপে অবিচ্ছিন্নভাবে পড়তে পারে। কোডটি নিম্নরূপঃ
function main() {
var client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr");
while (true) {
var msg = client.read()
var data = JSON.parse(msg) // Parse json strings into quotable objects
// Process data
}
}
ডাব্লুএসএস ডেটা পুশ গতি খুব দ্রুত। গোলং এর আন্ডারলেয়ারটি সারিতে থাকা সমস্ত ডেটা ক্যাশে করবে, এবং যখন প্রোগ্রাম কলগুলি পড়বে, তখন ডেটা পাল্টা ফিরে আসবে। তবে, বটে অর্ডার দেওয়ার মতো ক্রিয়াকলাপগুলি বিলম্বের কারণ হবে, যার ফলে ডেটা জমা হতে পারে। ট্রেডিং এক্সিকিউশন পুশ, অ্যাকাউন্ট পুশ এবং গভীরতা অন্তর্ভুক্তি পুশের মতো তথ্যের জন্য, আমাদের ইতিহাসের ডেটা দরকার। কোট মার্কেট ডেটার জন্য, বেশিরভাগ ক্ষেত্রে, আমরা কেবলমাত্র সর্বশেষ ডেটা নিয়ে চিন্তা করি, ইতিহাসের ডেটা নয়।
যদি read() কোন প্যারামিটার যোগ না করে, এটি পুরোনো ডেটা ফেরত দেবে, এবং কোনও ডেটা না থাকলে ফেরত না আসা পর্যন্ত ব্লক করবে। যদি আপনি সর্বশেষ ডেটা চান, আপনি ক্লায়েন্ট.read(-2) ব্যবহার করে অবিলম্বে সর্বশেষ ডেটা ফেরত দিতে পারেন, কিন্তু যখন কোনও ডেটা নেই, এটি null ফেরত দেবে, যা রেফারেন্সের আগে বিচার করা দরকার।
পুরানো ক্যাশেড ডেটা কীভাবে মোকাবেলা করা যায় এবং কোনও ডেটা না থাকলে এটি ব্লক করা হয় কিনা তার উপর নির্ভর করে,
এই ক্ষেত্রে, এটি স্পষ্ট যে কেবলমাত্র
function main() {
var binance = Dial("wss://stream.binance.com:9443/ws/!ticker@arr");
var coinbase = Dial("wss://ws-feed.pro.coinbase.com", 60)
coinbase.write('{"type": "subscribe","product_ids": ["BTC-USD"],"channels": ["ticker","heartbeat"]}')
while (true) {
var msgBinance = binance.read(-1) // Parameter -1 represents no data and return null immediately; it will not occur that being blocked before there is data to be returned
var msgCoinbase = coinbase.read(-1)
if(msgBinance){
// at this time, Binance has data to return
}
if(msgCoinbase){
// at this time, coinbase has data to return
}
Sleep(1) // Sleep for 1 millisecond
}
}
প্রসেসিংয়ের এই অংশটি আরও ঝামেলাজনক, কারণ পুশ ডেটা বাধাগ্রস্ত হতে পারে, বা পুশ বিলম্ব অত্যন্ত দীর্ঘ। এমনকি যদি হার্টবিটটি গ্রহণ করা যায় তবে এর অর্থ এই নয় যে ডেটা এখনও চাপানো হচ্ছে। আপনি একটি ইভেন্ট অন্তরাল সেট করতে পারেন; যদি অন্তরালের পরে কোনও আপডেট না পাওয়া যায় তবে পুনরায় সংযোগ করুন; ডেটা সঠিক কিনা তা দেখতে কিছু সময়ের পরে
Push ডেটা ব্যবহার করা হয়েছে, প্রোগ্রামটি স্বাভাবিকভাবেই ইভেন্ট-ট্রিগার হিসাবে লেখা হবে; তথ্য চাপার ফ্রিকোয়েন্সিতে মনোযোগ দিন, কারণ উচ্চ-ফ্রিকোয়েন্সি অনুরোধগুলি ব্লক হওয়ার কারণ হবে; সাধারণত আপনি লিখতে পারেনঃ
var tradeTime = Date.now()
var accountTime = Date.now()
function trade(data){
if(Date.now() - tradeTime > 2000){//Here it limits only one trade in 2 seconds
tradeTime = Date.now()
// Trading logic
}
}
function GetAccount(){
if(Date.now() - accountTime > 5000){//Here it limits GetAccount only once in 5 seconds
accountTime = Date.now()
return exchange.GetAccount()
}
}
function main() {
var client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr|reconnect=true");
while (true) {
var msg = client.read()
var data = JSON.parse(msg)
var account = GetAccount()
trade(data)
}
}
সংযোগ পদ্ধতি, ডেটা ট্রান্সমিশন পদ্ধতি, সাবস্ক্রাইব করা সামগ্রী এবং প্রতিটি প্ল্যাটফর্মের ওয়েবসকেটের ডেটা ফর্ম্যাট প্রায়শই পৃথক হয়, তাই প্ল্যাটফর্মটি এটিকে ক্যাপসুল করে না এবং নিজের দ্বারা সংযোগ স্থাপনের জন্য ডায়াল ফাংশনটি ব্যবহার করতে হবে। এই নিবন্ধটি মূলত কিছু প্রাথমিক সতর্কতা কভার করে। আপনার যদি আরও প্রশ্ন থাকে তবে দয়া করে জিজ্ঞাসা করতে দ্বিধা করবেন না।
PS: যদিও কিছু প্ল্যাটফর্ম ওয়েবসকেট উদ্ধৃতি প্রদান করে না, আসলে, যখন আপনি ডিবাগিং ফাংশন ব্যবহার করার জন্য ওয়েবসাইটে লগ ইন করেন, তখন আপনি দেখতে পাবেন যে তারা সবাই ওয়েবসকেট ধাক্কা ব্যবহার করছে। অনুসন্ধানের পরে, আপনি দেখতে পাবেন যে কিছু সাবস্ক্রিপশন ফর্ম্যাট এবং রিটার্ন ফর্ম্যাটগুলি এনক্রিপ্ট করা বলে মনে হচ্ছে, যা বেস 64 দিয়ে ডিকোডিং এবং ডিকম্প্রেসিং দ্বারা দেখা যেতে পারে।