발명자 디지털 화폐 정량화 플랫폼 websocket 사용 지침 (디얼 함수 업그레이드 후 자세한 설명)

저자:초목, 2019-04-01 11:06:09, 업데이트: 2019-12-04 10:41:25

기본적으로 모든 디지털 통화 거래소는 웹소켓 전송 시장을 지원하고 일부 거래소는 웹소켓 업데이트 계정 정보를 지원합니다. rest API와 비교하면 웹소켓은 일반적으로 지연이 낮고 빈도가 높으며 플랫폼 rest API의 빈도 제한이 없습니다.https://zhuanlan.zhihu.com/p/22693475

이 문서는 주로 FMZ의 발명자 양적 플랫폼, 자바스크립트 언어를 사용하는, 플랫폼에 포착된 다이얼 함수를 사용하는 연결, 문서에 설명 및 매개 변수를 사용하는, 다이얼을 검색하는, 다양한 기능을 구현하기 위해 다이얼 함수가 여러 번 업데이트 된 것을 설명합니다. 이 문서는 이것을 다루고 있으며, wss 기반의 이벤트 드라이브 전략을 소개하고 여러 거래소를 연결하는 문제를 설명합니다.

1.websocket连接:

일반적으로 직접 연결할 수 있습니다.

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

반환된 데이터는 압축된 형식으로, 연결이 필요한 경우 압축된 형식을 지정하고, mode는 연결된 OKEX와 같은 압축이 필요한 데이터를 전송하는 것을 나타냅니다.

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

다이얼 함수는 재결합을 지원하며, 기본 언어인 Go에서 수행되며, 검출된 연결이 끊어지고 재결합이 됩니다. 요청된 데이터의 내용이 이미 url에 있는 경우, 예를 들어, 위안의 경우, 매우 편리하며, 사용이 권장됩니다.

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

WSS 메시지를 구독하고, 일부 거래소의 요청은 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 ((() 는 변수를 추가하지 않으면 가장 오래된 데이터를 반환하고 데이터가 없을 때 반환을 차단합니다. 최신 데이터를 원한다면 클라이언트.read (((-2) 를 사용하여 최신 데이터를 즉시 반환할 수 있지만 데이터가 없을 때 null을 반환하고 다시 참조해야 합니다.

캐시된 오래된 데이터를 어떻게 처리하는지, 그리고 데이터가 없을 때 막히는지에 따라, read에는 다른 매개 변수가 있습니다.img

3. 여러 거래소 웹소켓을 연결:

이 경우의 절차는 명백히 단순한 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
    }
}

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.总结:

각 거래소의 웹소켓의 연결 방식, 데이터 전송 방식, 구독 가능한 내용, 데이터 형식은 종종 다릅니다. 따라서 플랫폼은 포장이 없으며, 다이얼 기능을 사용하여 자동 연결이 필요합니다. 이 문서에서는 기본적으로 몇 가지 기본적인 주의 사항을 다루고 있습니다.

PS. 일부 거래소는 웹소켓 시장을 제공하지 않지만 실제로 로그인 웹 사이트의 모드 기능을 사용하여 웹소켓 추진을 사용한다는 것을 발견합니다.


관련

더 많은

xaifer48wss 연결이 실행된 지 얼마 지나지 않아서, json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) 에 대한 오류가 발생했습니다.

하오하오왜 바이오인 상시 계약에 연결, 확인 계정 정보 변경, 1 분 후 읽기 빈으로 돌아갑니다

xaifer48수신, 감사합니다.

초목오류를 해결하고, 메시지를 인쇄해보고, 실수를 허용하는 것이 좋습니다.

노력하는 양성이 모든 것은 비엔안의 규정에 따라 계정 정보가 변경될 때만 전송되기 때문입니다.