Type/to search
3
Follow
1507
Followers
Inventor デジタル通貨定量プラットフォーム Websocket 使用ガイド(ダイヤル機能アップグレード後の詳細説明)
FAQ
Created 2019-04-01 11:06:09  Updated 2019-12-04 10:41:25
 5
 6273

基本的にはすべての仮想通貨取引所がwebsocketの送付行情をサポートしており,一部の取引所ではwebsocketの更新アカウント情報をサポートしている.rest APIと比較して,websocketは一般的に遅延が低く,頻度が高く,プラットフォームrest APIの頻度制限などから解放されている.欠点は,中断の問題があり,処理は直感的ではない.websocketの概要については,以前この記事を参照してください:
https://zhuanlan.zhihu.com/p/22693475

この記事では,主にFMZの発明者による量化プラットフォーム,JavaScript言語,プラットフォームの封装されたDial関数を使用して接続する,詳細とパラメータをドキュメントで,検索Dial,様々な機能を実現するために,Dial関数は何度か更新されました.この記事は,この点をカバーし,wssベースのイベント駆動の戦略,および複数の取引所の接続の問題について説明します.

1. ウェブソケット接続:

コインのセキュリティティッカーの推送など,一般的には直接接続できます.

var client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr")

返されるデータが圧縮形式である場合,接続時に指定する必要があります.compressは圧縮形式を指定し,modeは返されるデータを送信するときに圧縮される必要があります.例えば,接続OKEX:

var client = Dial("wss://real.okex.com:10441/websocket?compress=true|compress=gzip_raw&mode=recv")

Dial関数は再接続をサポートし,底層のGo言語で完了し,検出された接続断絶会再接続,リクエストデータコンテンツが既にurlにある場合,例えば今度のBinanceの例のように,便利で,使用が推奨されます. メッセージを送信する必要がある場合,再接続メカニズムを自分で維持できます.

var client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr|reconnect=true")

コインベース (coinbase) のようなチャンネルは,自己登録の必要性がある:

client = Dial("wss://ws-feed.pro.coinbase.com", 60) client.write('{"type": "subscribe","product_ids": ["BTC-USD"],"channels": ["ticker","heartbeat"]}')

2 ウェブソケットが表示する:

このコードは,通常,デッドループで読み取れます.

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のデータプッシュは高速で,Goの底層はすべてのデータをキューブに保存し,等プログラムがreadを呼び出すとき,次々に返します。そして,ロボットの下位命令のような操作は,遅延をもたらし,データの蓄積を引き起こす可能性があります。交付プッシュ,アカウントプッシュ,深度挿入値プッシュなどの情報には,歴史データが必要で,実態データについては,ほとんどの場合,最新のデータだけを気にせず,歴史データに関心を持たない。

read() が参数加えなければ,最も古いデータが返され,データがない場合は返されるまでブロックされます。最新データが必要な場合は,client.read(-2) ですぐに最新のデータが返され,データがない場合はnullが返され,判断して再引用する必要があります。

read は,キャッシュされた古いデータをどのように扱うか,また,データがないときにブロックされるかどうかによって,異なるパラメータを持つ.具体的には,以下の図のように,複雑に見えますが,プログラムをより柔軟にします.
img

3. 複数の取引所のWebSocketに接続する:

このような場合,単純に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 } }

4. 断線再接続の問題:

この部分では処理が面倒であるため,推送データは中断したり,推送遅延が非常に高く,ハートビットを受信してもデータが推送されているわけではない.イベント間隔を設定し,更新が受信されていない間隔を超えた場合は再接続し,しばらくの間,restと返された結果と比較してデータの正確さを確認する.この特殊なケースでは,直接自動再接続を設定できます.

5. websocket を使う一般的なプログラムフレームワーク:

推送データを使用しているため,プログラムも自然にイベントドライブに書き込む必要があります. 推送データの頻度に注意し,過度の要求によって封鎖されないように注意してください. 一般的に次のように書き込むことができます.

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) } }

6. 結論:

各取引所のwebsocketの接続方法,データ送信方法,購読可能なコンテンツ,データフォーマットは,しばしば異なっています.したがって,プラットフォームはパッケージ化されず,ダイアル関数を使用して自主接続する必要があります.この文章は,基本的にはいくつかの基本的な注意事項をカバーしています.もし疑問があれば,質問をお願いします.

PS.一部の取引所はWebSocketの行方を提供していないが,実際にWebSocketの設定機能を利用したサイトにアクセスすると,WebSocketの推送が使用されていることがわかります.調べてみると,サブスクリプションフォーマットと返却フォーマットが見られます.

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)