ほとんどの仮想通貨取引所はWebSocket経由で市場データを送信することをサポートしており,一部の取引所はWebSocket経由でアカウント情報を更新することもサポートしている.REST APIと比較して,WebSocketは一般的に遅延が低く,周波数が高く,プラットフォームの休憩APIの制限の対象ではない.しかし,潜在的な中断と直感的な処理が少ないという欠点がある.
この記事では主に,JavaScript言語を使用してFMZ量子プラットフォームにカプセル化されたDial関数の使用を紹介する.特定の指示とパラメータは,文書で
直接接続は通常十分で,例えばコインのセキュリティティッカーのプッシュを得る.
var client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr")
復元されたデータが圧縮形式にある場合,接続中に指定する必要があります.
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"]}')
一般的には,無限のループで連続的に読み取れます.コードは以下の通りです:
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 を返します.参照する前に判断する必要があります.
古いキャッシュされたデータを処理する方法や,データがないときにブロックされるかどうかに依存して,下記の表で示されているように,
この場合は,単に"読み込み"を用いると,プログラムでは機能しないことが明らかです.なぜなら,あるプラットフォームは待機しているメッセージをブロックし,別のプラットフォームは新しいメッセージがあるとしても受信しないからです.一般的な処理方法は:
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
}
}
プッシュデータは中断される可能性があるため,またはプッシュ遅延が非常に長いため,処理のこの部分はより面倒です.心臓の鼓動が受信されても,データがまだプッシュされていることを意味しません.イベント間隔を設定できます.間隔後に更新が受信されない場合は,再接続します.データが正確かどうかを確認するために,期間後に
プッシュデータが使用されているため,プログラムは自然にイベントトリガーで記述されます. プッシュデータの周波数に注意してください. 高周波のリクエストがブロックされるので,一般的に,次のように書くことができます:
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)
}
}
接続方法,データ送信方法,サブスクリプションコンテンツ,各プラットフォームのウェブソケットのデータフォーマットはしばしば異なるため,プラットフォームはそれをカプセル化せず,自己接続のためにダイヤル機能を使用する必要があります.この記事は基本的にいくつかの基本的な注意事項をカバーしています.質問がある場合は,気軽に尋ねてください.
PS: Webソケット引用文は提供されていないプラットフォームもありますが,デバッグ機能を使用するためにWebサイトにログインすると,すべて Webソケットプッシュを使用していることがわかります. 調べた後に,一部のサブスクリプションフォーマットとリターンフォーマットが暗号化されていることがわかります.