FMZ仮想通貨定量プラットフォーム WebSocket 使用ガイド (アップグレードされたダイヤル機能の詳細説明)

作者: リン・ハーンリディア作成日:2023-07-13 14:03:32 更新日:2024-01-03 21:05:36 更新日:2021-01-03 21:05:36 更新日:2021-01-03 21:05:36 更新日:2021-01-03 21:05:36 更新日:2020-01-03 21:05:36 更新日:2020-01-03 21:05:36 更新日:2020-01-03 21:05:36 更新日:2020-01-03 21:05:36 更新日:2020-01-03 21:05:36 更新日:2020-01-03 21:05:36 更新日:2020-01-03 21:05:36 更新日:2020-01-03 21:05:36

img

FMZ仮想通貨定量プラットフォーム WebSocket 使用ガイド (アップグレードされたダイヤル機能の詳細説明)

ほとんどの仮想通貨取引所はWebSocket経由で市場データを送信することをサポートしており,一部の取引所はWebSocket経由でアカウント情報を更新することもサポートしている.REST APIと比較して,WebSocketは一般的に遅延が低く,周波数が高く,プラットフォームの休憩APIの制限の対象ではない.しかし,潜在的な中断と直感的な処理が少ないという欠点がある.

この記事では主に,JavaScript言語を使用してFMZ量子プラットフォームにカプセル化されたDial関数の使用を紹介する.特定の指示とパラメータは,文書でDialを検索することによって見つけることができます.さまざまな機能を達成するために,Dial関数はいくつかの更新を受け,この記事で取り上げられます.さらに,WebSocket Secure (wss) をベースとしたイベント駆動戦略と複数の交換所に接続する問題についても議論します.

Webソケット接続:

直接接続は通常十分で,例えばコインのセキュリティティッカーのプッシュを得る.

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

ダイアル機能は,基礎となるGo言語によって処理される再接続をサポートする.接続が切断されると検出されたときに自動的に再接続する.要求データがすでにURLに含まれている場合,例えばBinanceの前の例のように,非常に便利で使用することが推奨される.しかし,サブスクリプションメッセージを送信する必要がある場合,再接続メカニズムを手動で維持することが推奨される.

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

コインベースのようなチャネルにもご利用いただけます. コインベースでは,

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

2. Webソケット 読み込み

一般的には,無限のループで連続的に読み取れます.コードは以下の通りです:

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

Wssデータプッシュスピードは非常に速い. Golangのサブレイヤーはキュー内のすべてのデータをキャッシュし,プログラムが呼び出せば,データは順番に返されます.しかし,ボットに注文を出すなどの操作は遅延を引き起こすため,データの蓄積につながる可能性があります.取引実行プッシュ,アカウントプッシュ,深度インターポレーションプッシュなどの情報には,履歴データが必要です. コート市場データについては,ほとんどの場合,我々は履歴データではなく最新のデータだけを気にします.

read() がパラメータを追加しない場合,最も古いデータを返し,データがない場合に返還するまでブロックします.最新のデータを欲しければ,クライアント.read(-2) を使用してすぐに最新のデータを返します.データがない場合は, null を返します.参照する前に判断する必要があります.

古いキャッシュされたデータを処理する方法や,データがないときにブロックされるかどうかに依存して,下記の表で示されているように,readには異なるパラメータがあります.これは複雑に見えますが,プログラムをより柔軟にします.

img

3. Websocket で複数のプラットフォームに接続する

この場合は,単に"読み込み"を用いると,プログラムでは機能しないことが明らかです.なぜなら,あるプラットフォームは待機しているメッセージをブロックし,別のプラットフォームは新しいメッセージがあるとしても受信しないからです.一般的な処理方法は:

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

4. 断線 と 再接続 の 問題

プッシュデータは中断される可能性があるため,またはプッシュ遅延が非常に長いため,処理のこの部分はより面倒です.心臓の鼓動が受信されても,データがまだプッシュされていることを意味しません.イベント間隔を設定できます.間隔後に更新が受信されない場合は,再接続します.データが正確かどうかを確認するために,期間後にrestによって返された結果を比較することが最善です.バイナンス特殊の場合,自動的に再接続を直接設定できます.

5. Websocket の 一般 プログラム フレーム を 使用 する

プッシュデータが使用されているため,プログラムは自然にイベントトリガーで記述されます. プッシュデータの周波数に注意してください. 高周波のリクエストがブロックされるので,一般的に,次のように書くことができます:

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

6. 結論

接続方法,データ送信方法,サブスクリプションコンテンツ,各プラットフォームのウェブソケットのデータフォーマットはしばしば異なるため,プラットフォームはそれをカプセル化せず,自己接続のためにダイヤル機能を使用する必要があります.この記事は基本的にいくつかの基本的な注意事項をカバーしています.質問がある場合は,気軽に尋ねてください.

PS: Webソケット引用文は提供されていないプラットフォームもありますが,デバッグ機能を使用するためにWebサイトにログインすると,すべて Webソケットプッシュを使用していることがわかります. 調べた後に,一部のサブスクリプションフォーマットとリターンフォーマットが暗号化されていることがわかります.


もっと