Type/to search
3
Follow
1507
Followers
উদ্ভাবক ডিজিটাল মুদ্রা পরিমাণগত প্ল্যাটফর্ম ওয়েবসকেট ব্যবহারের নির্দেশিকা (ডায়াল ফাংশন আপগ্রেডের পরে বিস্তারিত ব্যাখ্যা)
FAQ
Created 2019-04-01 11:06:09  Updated 2019-12-04 10:41:25
 5
 6273

মূলত সমস্ত ডিজিটাল মুদ্রা এক্সচেঞ্জগুলি ওয়েবসকেট প্রেরণকে সমর্থন করে, কিছু এক্সচেঞ্জ ওয়েবসকেট আপডেট অ্যাকাউন্টের তথ্য সমর্থন করে। রেস্ট এপিআইয়ের তুলনায়, ওয়েবসকেট সাধারণত কম বিলম্ব, উচ্চ ফ্রিকোয়েন্সি, প্ল্যাটফর্মের রেস্ট এপিআই ফ্রিকোয়েন্সি সীমাবদ্ধতা ছাড়াই আপনার সাথে থাকে, এর অসুবিধা হ'ল বিরতি সমস্যা এবং অপ্রত্যক্ষভাবে পরিচালনা করা হয়। ওয়েবসকেট সংক্ষিপ্তসার সম্পর্কে, আপনি আমার এই নিবন্ধটি দেখতে পারেনঃ
https://zhuanlan.zhihu.com/p/22693475

এই নিবন্ধটি মূলত এফএমজেড ইনভেন্টর কোয়ান্টিফিকেশন প্ল্যাটফর্মের সাথে সম্পর্কিত হবে, জাভাস্ক্রিপ্ট ভাষা ব্যবহার করে, প্ল্যাটফর্মের সাথে সংযুক্ত ডায়াল ফাংশন ব্যবহার করে, ডকুমেন্টেশনে বিশদ বিবরণ এবং প্যারামিটার, ডায়াল অনুসন্ধান করুন, বিভিন্ন কার্যকারিতা বাস্তবায়নের জন্য ডায়াল ফাংশনটি বেশ কয়েকবার আপডেট করা হয়েছে, এই নিবন্ধটি এটিকে কভার করবে, এবং ডাব্লুএসএস-ভিত্তিক ইভেন্ট-চালিত কৌশল এবং মাল্টি-এক্সচেঞ্জ সংযোগের বিষয়ে আলোচনা করবে।

1. ওয়েবসকেট সংযোগঃ

সাধারণত, সরাসরি সংযোগের মাধ্যমে, যেমন মুদ্রা সুরক্ষা টিকার প্রেরণঃ

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"]}')

2. websocket পাঠ করছে:

এই কোডটি নিম্নরূপঃ

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 এর বিভিন্ন প্যারামিটার রয়েছে, যা নীচের চিত্রের মতো জটিল বলে মনে হচ্ছে, তবে এটি প্রোগ্রামটিকে আরও নমনীয় করে তোলে।
img

3. একাধিক এক্সচেঞ্জের ওয়েবসকেট সংযুক্ত করুনঃ

এই ধরনের পরিস্থিতির জন্য সহজ 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 ডিকম্প্রেসড দিয়ে ডিকম্প্রেস করা হয়েছে।

Related Recommendations
Comment
All comments (5)

    wss连接运行一段时间后,报“ json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)”这个错误,请问大神要如何处理?已经设置了自动重连,需要再手动写一个重连么@小草

    4 years ago

    解析错误,把消息打印出来看看,做个容错就行

    4 years ago

    收到,谢谢

    4 years ago

    币安永续合约为什么 连接完,定阅账户信息变动,一分钟后 read 就返回空了

    6 years ago

    因为币安规定,只有账号信息有变动时才会推送信息。是这样吧?

    5 years ago
  • 1
Forums
PINE Language
Get the app
iPhone Download
© 2015 - ∞ INVENTOR PTE LTD (SG)