発明者 デジタル通貨量化プラットフォーム websocket ユーザーガイド (Dial関数アップグレード後詳細)

作者: リン・ハーン小草作成日: 2019-04-01 11:06:09, 更新日: 2019-12-04 10:41:25

基本的にはすべての仮想通貨取引所がwebsocketの送信市場をサポートし,一部の取引所がwebsocketのアカウント情報を更新することをサポートしている. rest APIと比較して,websocketは一般的に遅延が低く,周波数が高く,プラットフォームrest APIの周波数制限などに制限されない.https://zhuanlan.zhihu.com/p/22693475

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

1.websocket连接:

簡単に簡単に接続できるのは,コインのセキュリティティッカーを押す方法です.

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の中にあり,ちょうどBinanの例のように,非常に便利で,使用することが推奨される. メッセージを送信する必要のある人は,自己維持の再接続メカニズムを使用することができます.

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

WWSのメッセージへの購読,いくつかの取引所の要求は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データプッシュは高速で,Goの底層はすべてのデータをキューに遅らせ,プログラムがreadを呼び出すとき,順番に戻します. ロボットの下記の操作などの操作は遅延をもたらし,データの蓄積を引き起こす可能性があります. 取引プッシュ,アカウントプッシュ,深度プラグ値プッシュなどの情報には,歴史的なデータが必要です. 市場データについては,ほとんどの場合,私たちは最新のデータのみに関心があります.

read ((() は,パラメータを追加しない場合,最も古いデータを返し,データがない場合,返却をブロックします. 最新のデータを望む場合は,client.read (((-2) を使用して,すぐに最新のデータを返却できます. しかし,データがない場合は,null を返却します. 再引用を判断する必要があります.

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

3. 複数の取引所のWebソケットを接続する:

このケースでは,単純に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.总结:

各取引所のウェブソケットの接続方法,データ送信方法,サブスクリプション可能な内容,データ形式はしばしば異なるため,プラットフォームはパッケージ化されていないため,Dial関数で自動的に接続する必要があります.この記事は基本的にいくつかの基本的な注意事項をカバーしています.

PS.いくつかの取引所は,websocketの市場を提供していないが,実際に登入サイトを調節機能を使用している場合,Websocket推送を使用していることがわかります. 調べてみると,サブスクリプション形式とリターン形式が表示されます.


関連性

もっと

サイファー48wss接続が実行されてしばらくすると,報報 json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) このエラーを表示します.

ハオハオなぜBinanceの永続契約は 接続後,アカウント情報が変更され,1分後にreadが空に戻るのか?

サイファー48受け取った ありがとう

小草間違いを処理して メッセージを印刷して 間違いを許すことができます

努力して量化ツイッターでは,Binanceは,アカウント情報が変更された場合にのみメッセージを送信することを規定しています.