From 6d487e1bee281481cc0eca1f5bfa3dab66cc7b92 Mon Sep 17 00:00:00 2001 From: Adrian Gallagher Date: Mon, 30 Mar 2015 21:44:32 +1100 Subject: [PATCH] Added OKCoin response structs for ticker,trade and orderbook data. --- config_example.json | 2 +- okcoinhttp.go | 5 +++ okcoinwebsocket.go | 87 ++++++++++++++++++++++++++++++++++++++++++--- 3 files changed, 89 insertions(+), 5 deletions(-) diff --git a/config_example.json b/config_example.json index bfd780b5..e6c9724e 100644 --- a/config_example.json +++ b/config_example.json @@ -153,7 +153,7 @@ "BaseCurrencies": "USD", "Enabled": true, "Verbose": false, - "Websocket": false, + "Websocket": true, "PollingDelay": 10 } ] diff --git a/okcoinhttp.go b/okcoinhttp.go index 03ec44ea..e1779707 100644 --- a/okcoinhttp.go +++ b/okcoinhttp.go @@ -52,6 +52,11 @@ type OKCoinFuturesTicker struct { Unit_Amount float64 } +type OKCoinOrderbook struct { + Asks [][]float64 `json:"asks"` + Bids [][]float64 `json:"bids"` +} + type OKCoinFuturesTickerResponse struct { Date string Ticker OKCoinFuturesTicker diff --git a/okcoinwebsocket.go b/okcoinwebsocket.go index dcb22833..df43138d 100644 --- a/okcoinwebsocket.go +++ b/okcoinwebsocket.go @@ -5,9 +5,26 @@ import ( "net/http" "time" "fmt" + "strings" "github.com/gorilla/websocket" ) +type OKCoinWebsocketTicker struct { + Timestamp int64 `json:"timestamp,string"` + Vol string `json:"vol"` + Buy float64 `json:"buy,string"` + High float64 `json:"high,string"` + Last float64 `json:"last,string"` + Low float64 `json:"low,string"` + Sell float64 `json:"sell,string"` +} + +type OKCoinWebsocketOrderbook struct { + Asks [][]float64 `json:"asks"` + Bids [][]float64 `json:"bids"` + Timestamp int64 `json:"timestamp,string"` +} + type OKCoinWebsocketEvent struct { Event string `json:"event"` Channel string `json:"channel"` @@ -125,7 +142,6 @@ func (o *OKCoin) WebsocketClient(currencies []string) { return } - if o.Verbose { log.Printf("%s Connected to Websocket.", o.GetName()) log.Println(resp) @@ -141,11 +157,15 @@ func (o *OKCoin) WebsocketClient(currencies []string) { } o.AddChannelAuthenticated(okConn, currencyChan) - + klineValues := []string{"1min", "3min", "5min", "15min", "30min", "1hour", "2hour", "4hour", "6hour", "12hour", "day", "3day", "week"} for _, x := range currencies { o.AddChannel(okConn, fmt.Sprintf("ok_%s_ticker", x)) - o.AddChannel(okConn, fmt.Sprintf("ok_%s_depth", x)) + o.AddChannel(okConn, fmt.Sprintf("ok_%s_depth60", x)) o.AddChannel(okConn, fmt.Sprintf("ok_%s_trades", x)) + + for _, y := range klineValues { + o.AddChannel(okConn, fmt.Sprintf("ok_%s_kline_%s", x, y)) + } } for { @@ -156,7 +176,66 @@ func (o *OKCoin) WebsocketClient(currencies []string) { } switch msgType { case websocket.TextMessage: - log.Println("\n" + string(resp)) + response := []interface{}{} + err = JSONDecode(resp, &response) + + if err != nil { + log.Println(err) + break + } + + for _, y := range response { + z := y.(map[string]interface{}) + channel := z["channel"] + data := z["data"] + channelStr, ok := channel.(string) + + if !ok { + log.Println("Unable to convert channel to string") + continue + } + + dataJSON, err := JSONEncode(data) + + if err != nil { + log.Println(err) + continue + } + + switch true { + case strings.Contains(channelStr, "ticker"): + ticker := OKCoinWebsocketTicker{} + err = JSONDecode(dataJSON, &ticker) + + if err != nil { + log.Println(err) + continue + } + case strings.Contains(channelStr, "depth60"): + orderbook := OKCoinWebsocketOrderbook{} + err = JSONDecode(dataJSON, &orderbook) + + if err != nil { + log.Println(err) + continue + } + case strings.Contains(channelStr, "trades"): + type TradeResponse struct { + Data [][]string + } + + trades := TradeResponse{} + err = JSONDecode(dataJSON, &trades.Data) + + if err != nil { + log.Println(err) + continue + } + // to-do: convert from string array to trade struct + case strings.Contains(channelStr, "kline"): + // to-do + } + } } } okConn.Close()