মূলত সমস্ত ডিজিটাল মুদ্রা এক্সচেঞ্জগুলি ওয়েবসকেট প্রেরণকে সমর্থন করে, কিছু এক্সচেঞ্জ ওয়েবসকেট আপডেট অ্যাকাউন্টের তথ্য সমর্থন করে। রেস্ট এপিআইয়ের তুলনায়, ওয়েবসকেট সাধারণত কম বিলম্ব, উচ্চ ফ্রিকোয়েন্সি, প্ল্যাটফর্মের রেস্ট এপিআই ফ্রিকোয়েন্সি সীমাবদ্ধতা ছাড়াই আপনার সাথে থাকে, এর অসুবিধা হ’ল বিরতি সমস্যা এবং অপ্রত্যক্ষভাবে পরিচালনা করা হয়। ওয়েবসকেট সংক্ষিপ্তসার সম্পর্কে, আপনি আমার এই নিবন্ধটি দেখতে পারেনঃ https://zhuanlan.zhihu.com/p/22693475
এই নিবন্ধটি মূলত এফএমজেড ইনভেন্টর কোয়ান্টিফিকেশন প্ল্যাটফর্মের সাথে সম্পর্কিত হবে, জাভাস্ক্রিপ্ট ভাষা ব্যবহার করে, প্ল্যাটফর্মের সাথে সংযুক্ত ডায়াল ফাংশন ব্যবহার করে, ডকুমেন্টেশনে বিশদ বিবরণ এবং প্যারামিটার, ডায়াল অনুসন্ধান করুন, বিভিন্ন কার্যকারিতা বাস্তবায়নের জন্য ডায়াল ফাংশনটি বেশ কয়েকবার আপডেট করা হয়েছে, এই নিবন্ধটি এটিকে কভার করবে, এবং ডাব্লুএসএস-ভিত্তিক ইভেন্ট-চালিত কৌশল এবং মাল্টি-এক্সচেঞ্জ সংযোগের বিষয়ে আলোচনা করবে।
সাধারণত, সরাসরি সংযোগের মাধ্যমে, যেমন মুদ্রা সুরক্ষা টিকার প্রেরণঃ
var client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr")
রিটার্ন ডেটা কম্প্রেশন ফরম্যাটের জন্য, সংযোগটি নির্দিষ্ট করা প্রয়োজন, কম্প্রেস কম্প্রেশন ফরম্যাটটি নির্দিষ্ট করুন, মোডটি রিটার্ন ডেটা প্রেরণের জন্য প্রতিনিধিত্ব করে যা সংক্ষেপণের প্রয়োজন, যেমন সংযোগ OKEx:
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")
কিছু এক্সচেঞ্জের অনুরোধগুলি url-এ রয়েছে, এবং কিছু চ্যানেলের জন্য তাদের নিজস্ব সাবস্ক্রিপশন প্রয়োজন, যেমন 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) //把json字符串解析为可引用的object
// 处理data数据
}
}
wss ডেটা ধাক্কা খুব দ্রুত, গো এর নীচের স্তরটি সমস্ত ডেটা ক্যুতে সংরক্ষণ করে, যেমন প্রোগ্রামটি পড়ার জন্য কল করে এবং তারপরে ফিরে আসে। এবং রোবটের কমান্ডিংয়ের মতো ক্রিয়াকলাপগুলি বিলম্বের কারণ হতে পারে, যা ডেটা জমে থাকতে পারে। লেনদেনের ধাক্কা, অ্যাকাউন্টের ধাক্কা, গভীরতার ইনপুট ধাক্কা ইত্যাদির জন্য আমাদের historicalতিহাসিক ডেটা প্রয়োজন, বাস্তবসম্মত ডেটার জন্য, আমরা বেশিরভাগ ক্ষেত্রে কেবলমাত্র সাম্প্রতিকতম সম্পর্কে উদ্বিগ্ন, historicalতিহাসিক ডেটা সম্পর্কে চিন্তা করি না।
read() যদি কোনো প্যারামিটার না থাকে, তবে সবচেয়ে পুরনো ডাটা রিটার্ন করা হবে, ডাটা না থাকলে রিটার্নের জন্য ব্লক করা হবে। যদি আপনি সর্বশেষ ডাটা চান, তাহলে আপনি client.read(-2) ব্যবহার করে অবিলম্বে সর্বশেষ ডাটা রিটার্ন করতে পারেন, কিন্তু ডাটা না থাকলে null রিটার্ন করতে হবে।
ক্যাশে থাকা পুরানো ডেটা কীভাবে ব্যবহার করা হয় এবং ডেটা না থাকলে এটি আটকে যায় কিনা তার উপর নির্ভর করে, read এর বিভিন্ন প্যারামিটার রয়েছে, যা নীচের চিত্রের মতো জটিল বলে মনে হচ্ছে, তবে এটি প্রোগ্রামটিকে আরও নমনীয় করে তোলে।

এই ধরনের পরিস্থিতির জন্য সহজ read () পদ্ধতি ব্যবহার করা যায় না, কারণ একটি এক্সচেঞ্জ অপেক্ষা বার্তা ব্লক করবে, অন্যদিকে অন্য এক্সচেঞ্জ নতুন বার্তা প্রাপ্ত করতে পারবে না। সাধারণ পদ্ধতি হলঃ
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) // 参数-1代表无数据立即返回null,不会阻塞到有数据返回
var msgCoinbase = coinbase.read(-1)
if(msgBinance){
// 此时币安有数据返回
}
if(msgCoinbase){
// 此时coinbase有数据返回
}
Sleep(1) // 可以休眠1ms
}
}
এই অংশটি পরিচালনা করা বেশ ঝামেলাজনক, কারণ ধাক্কা দেওয়া ডেটা বাধাগ্রস্ত হতে পারে, বা ধাক্কা দেওয়া বিলম্ব খুব বেশি, এমনকি যদি হার্টবিট গ্রহণ করা হয় তবে ডেটা এখনও ধাক্কা দেওয়া হচ্ছে না, আপনি একটি ইভেন্টের ব্যবধান সেট করতে পারেন, যদি আপডেট না পাওয়া যায় তবে পুনরায় সংযোগ করুন, এবং কিছু সময়ের পরে বিশ্রামের সাথে ফিরে আসা ফলাফলের তুলনা করে দেখুন যে ডেটা সঠিক কিনা। এই বিশেষ পরিস্থিতির জন্য, সরাসরি স্বয়ংক্রিয় পুনরায় সংযোগ স্থাপন করা যেতে পারে।
যেহেতু পুশ ডেটা ব্যবহার করা হয়েছে, তাই প্রোগ্রামটি ইভেন্ট ড্রাইভ হিসাবেও লিখতে হবে, তবে সতর্কতা অবলম্বন করুন যে পুশ ডেটা প্রায়শই থাকে, খুব বেশি অনুরোধ না করে ব্লক করা হয়, সাধারণত এটি লিখতে পারেঃ
var tradeTime = Date.now()
var accountTime = Date.now()
function trade(data){
if(Date.now() - tradeTime > 2000){//这里即限制了2s内只交易一次
tradeTime = Date.now()
//交易逻辑
}
}
function GetAccount(){
if(Date.now() - accountTime > 5000){//这里即限制了5s内只获取账户一次
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. কিছু এক্সচেঞ্জ যদিও ওয়েবসকেট ফর্ম্যাট দেয় না, কিন্তু আসলে তারা ডিকম্প্রেসড ফাংশন ব্যবহার করে এবং তারা ওয়েবসকেট প্রেরণ ব্যবহার করে। আপনি সাবস্ক্রিপশন ফর্ম্যাট এবং রিটার্ন ফর্ম্যাট খুঁজে পেতে পারেন। কিছু কিছু দেখতে এনক্রিপ্ট করা হয়েছে এবং এটি base64 ডিকম্প্রেসড দিয়ে ডিকম্প্রেস করা হয়েছে।