From 32c1252283d3fa27d46429ae6a545fd0af5ef512 Mon Sep 17 00:00:00 2001 From: Adrian Gallagher Date: Sat, 11 Apr 2015 20:58:28 +1000 Subject: [PATCH] Added Huobi Websocket API variables and channel subscription support. --- huobiwebsocket.go | 113 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 97 insertions(+), 16 deletions(-) diff --git a/huobiwebsocket.go b/huobiwebsocket.go index b63f8144..feb78499 100644 --- a/huobiwebsocket.go +++ b/huobiwebsocket.go @@ -8,23 +8,47 @@ import ( const ( HUOBI_SOCKETIO_ADDRESS = "https://hq.huobi.com:443" - HUOBI_SOCKET_SYMBOL_LIST = "reqSymbolList" - HUOBI_SOCKET_SYMBOL_DETAIL = "reqSymbolDetail" - HUOBI_SOCKET_SUBSCRIBE = "reqMsgSubscribe" - HUOBI_SOCKET_UNSUBSCRIBE = "reqMsgUnsubscribe" - HUOBI_SOCKET_TIMELINE = "reqTimeLine" - HUOBI_SOCKET_KLINE = "reqKLine" - HUOBI_SOCKET_DEPTH = "reqMarketDepth" - HUOBI_SOCKET_DEPTH_TOP = "reqMarketDepthTop" - HUOBI_SOCKET_TRADE_DETAIL_TOP = "reqTradeDetailTop" - HUOBI_SOCKET_MARKET_DETAIL = "reqMarketDetail" + + //Service API + HUOBI_SOCKET_REQ_SYMBOL_LIST = "reqSymbolList" + HUOBI_SOCKET_REQ_SYMBOL_DETAIL = "reqSymbolDetail" + HUOBI_SOCKET_REQ_SUBSCRIBE = "reqMsgSubscribe" + HUOBI_SOCKET_REQ_UNSUBSCRIBE = "reqMsgUnsubscribe" + + // Market data API + HUOBI_SOCKET_MARKET_DETAIL = "marketDetail" + HUOBI_SOCKET_TRADE_DETAIL = "tradeDetail" + HUOBI_SOCKET_MARKET_DEPTH_TOP = "marketDepthTop" + HUOBI_SOCKET_MARKET_DEPTH_TOP_SHORT = "marketDepthTopShort" + HUOBI_SOCKET_MARKET_DEPTH = "marketDepth" + HUOBI_SOCKET_MARKET_DEPTH_TOP_DIFF = "marketDepthTopDiff" + HUOBI_SOCKET_MARKET_DEPTH_DIFF = "marketDepthDiff" + HUOBI_SOCKET_MARKET_LAST_KLINE = "lastKLine" + HUOBI_SOCKET_MARKET_LAST_TIMELINE = "lastTimeLine" + HUOBI_SOCKET_MARKET_OVERVIEW = "marketOverview" + HUOBI_SOCKET_MARKET_STATIC = "marketStatic" + + // History data API + HUOBI_SOCKET_REQ_TIMELINE = "reqTimeLine" + HUOBI_SOCKET_REQ_KLINE = "reqKLine" + HUOBI_SOCKET_REQ_DEPTH_TOP = "reqMarketDepthTop" + HUOBI_SOCKET_REQ_DEPTH = "reqMarketDepth" + HUOBI_SOCKET_REQ_TRADE_DETAIL_TOP = "reqTradeDetailTop" + HUOBI_SOCKET_REQ_MARKET_DETAIL = "reqMarketDetail" ) var HuobiSocket *socketio.SocketIO -type HuobiRequest struct { - Version int `json:"version"` - MsgType string `json:"msgType"` +type HuobiWebsocketMarketOverview struct { + SymbolID string `json:"symbolId"` + Last float64 `json:"priceNew"` + Open float64 `json:"priceOpen"` + High float64 `json:"priceHigh"` + Low float64 `json:"priceLow"` + Ask float64 `json:"priceAsk"` + Bid float64 `json:"priceBid"` + Volume float64 `json:"totalVolume"` + TotalAmount float64 `json:"totalAmount"` } type HuobiResponse struct { @@ -36,16 +60,73 @@ type HuobiResponse struct { Payload map[string]interface{} `json:"payload"` } +func (h *HUOBI) BuildHuobiWebsocketRequest(msgType string, requestIndex int64, symbolRequest []string) (map[string]interface{}) { + request := map[string]interface{}{} + request["version"] = 1 + request["msgType"] = msgType + + if requestIndex != 0 { + request["requestIndex"] = requestIndex + } + + if len(symbolRequest) != 0 { + request["symbolIdList"] = symbolRequest + } + + return request +} + +func (h *HUOBI) BuildHuobiWebsocketRequestExtra(msgType string, requestIndex int64, symbolIdList interface{}) (interface{}) { + request := map[string]interface{}{} + request["version"] = 1 + request["msgType"] = msgType + + if requestIndex != 0 { + request["requestIndex"] = requestIndex + } + + request["symbolList"] = symbolIdList + return request +} + +func (h *HUOBI) BuildHuobiWebsocketParamsList(objectName, currency, pushType, period, percentage string) (interface{}) { + list := map[string]interface{}{} + list["symbolId"] = currency + list["pushType"] = pushType + + if period != "" { + list["period"] = period + } + if percentage != "" { + list["percentage"] = percentage + } + + listArray := []map[string]interface{}{} + listArray = append(listArray, list) + + listCompleted := make(map[string][]map[string]interface{}) + listCompleted[objectName] = listArray + return listCompleted +} + func (h *HUOBI) OnConnect(output chan socketio.Message) { if h.Verbose { log.Printf("%s Connected to Websocket.", h.GetName()) } - msg := HuobiRequest{1, HUOBI_SOCKET_SYMBOL_LIST} + + msg := h.BuildHuobiWebsocketRequestExtra(HUOBI_SOCKET_REQ_SUBSCRIBE, 100, h.BuildHuobiWebsocketParamsList(HUOBI_SOCKET_MARKET_OVERVIEW, "btccny", "pushLong", "", "")) result, err := JSONEncode(msg) if err != nil { log.Println(err) } output <- socketio.CreateMessageEvent("request", string(result), nil) + + msg = h.BuildHuobiWebsocketRequestExtra(HUOBI_SOCKET_REQ_SUBSCRIBE, 100, h.BuildHuobiWebsocketParamsList(HUOBI_SOCKET_MARKET_OVERVIEW, "ltccny", "pushLong", "", "")) + result, err = JSONEncode(msg) + if err != nil { + log.Println(err) + } + output <- socketio.CreateMessageEvent("request", string(result), nil) } func (h *HUOBI) OnDisconnect(output chan socketio.Message) { @@ -59,21 +140,21 @@ func (h *HUOBI) OnMessage(message []byte, output chan socketio.Message) { func (h *HUOBI) OnRequest(message []byte, output chan socketio.Message) { response := HuobiResponse{} + log.Println(string(message)) err := JSONDecode(message, &response) if err != nil { log.Println(err) } - log.Println(response) } func (h *HUOBI) WebsocketClient() { events := make(map[string]func(message []byte, output chan socketio.Message)) events["request"] = h.OnRequest + events["message"] = h.OnMessage HuobiSocket = &socketio.SocketIO{ OnConnect: h.OnConnect, OnDisconnect: h.OnDisconnect, - OnMessage: h.OnMessage, OnEvent: events, }