基本的にはすべての仮想通貨取引所がwebsocketの送信市場をサポートし,一部の取引所がwebsocketのアカウント情報を更新することをサポートしている. rest APIと比較して,websocketは一般的に遅延が低く,周波数が高く,プラットフォームrest APIの周波数制限などに制限されない.https://zhuanlan.zhihu.com/p/22693475
この記事では主にFMZの発明者による量化プラットフォーム,JavaScript言語を使用し,プラットフォームに包まれたDial関数を使用して接続,文書に詳細な説明とパラメータ,Dial検索,さまざまな機能を実現するためにDial関数にいくつかの更新が実施されていることを説明し,wssベースのイベント駆動戦略,および複数の取引所に接続する問題を説明します.
簡単に簡単に接続できるのは,コインのセキュリティティッカーを押す方法です.
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"]}')
死亡サイクルでは,通常,このコードは次のように読み続けられます.
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には異なるパラメータがあり,具体的には以下の図のように,複雑に見えるが,プログラムをより柔軟にする.
このケースでは,単純に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
}
}
この部分は,プッシュデータが中断される可能性があるため,またはプッシュの遅延が非常に高いため,この部分は処理が困難である.ハートビットを受信してもデータがまだプッシュされていることを意味しない場合でも,イベント間隔を設定し,間隔を超えると更新が受信されない場合は再接続し,データが正確かどうかを確認するために,時間間隔とrestを比較することが好ましい.この特殊なケースでは,自動的に再接続を直接設定できます.
プッシュデータは既に使用されているため,プログラムは自然にイベントドライバとして書き,データを頻繁にプッシュするように注意し,過剰なリクエストが封鎖につながらないようにしてください.
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)
}
}
各取引所のウェブソケットの接続方法,データ送信方法,サブスクリプション可能な内容,データ形式はしばしば異なるため,プラットフォームはパッケージ化されていないため,Dial関数で自動的に接続する必要があります.この記事は基本的にいくつかの基本的な注意事項をカバーしています.
PS.いくつかの取引所は,websocketの市場を提供していないが,実際に登入サイトを調節機能を使用している場合,Websocket推送を使用していることがわかります. 調べてみると,サブスクリプション形式とリターン形式が表示されます.
サイファー48wss接続が実行されてしばらくすると,報報 json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) このエラーを表示します.
ハオハオなぜBinanceの永続契約は 接続後,アカウント情報が変更され,1分後にreadが空に戻るのか?
サイファー48受け取った ありがとう
小草間違いを処理して メッセージを印刷して 間違いを許すことができます
努力して量化ツイッターでは,Binanceは,アカウント情報が変更された場合にのみメッセージを送信することを規定しています.