diff --git a/bitstampwebsocket.go b/bitstampwebsocket.go index 721d7265..e85ae0ee 100644 --- a/bitstampwebsocket.go +++ b/bitstampwebsocket.go @@ -6,66 +6,66 @@ import ( ) type BitstampPusherOrderbook struct { - Asks[][] string `json:"asks"` - Bids[][] string `json:"bids"` + Asks [][]string `json:"asks"` + Bids [][]string `json:"bids"` } type BitstampPusherTrade struct { - Price float64 `json:"price"` + Price float64 `json:"price"` Amount float64 `json:"amount"` - ID int64 `json:"id"` + ID int64 `json:"id"` } const ( - BITSTAMP_PUSHER_KEY = "de504dc5763aeef9ff52" + BITSTAMP_PUSHER_KEY = "de504dc5763aeef9ff52" ) func (b *Bitstamp) PusherClient() { - pusherClient, err := pusher.NewClient(BITSTAMP_PUSHER_KEY) - if err != nil { - log.Fatalln(err) - return - } + for b.Enabled && b.Websocket { + pusherClient, err := pusher.NewClient(BITSTAMP_PUSHER_KEY) + if err != nil { + log.Printf("%s Unable to connect to Websocket. Error: %s\n", b.GetName(), err) + continue + } - err = pusherClient.Subscribe("live_trades") - if err != nil { - log.Println("Subscription error : ", err) - return - } + err = pusherClient.Subscribe("live_trades") + if err != nil { + log.Printf("%s Websocket Trade subscription error: %s\n", b.GetName(), err) + } - err = pusherClient.Subscribe("order_book") - if err != nil { - log.Println("Subscription error : ", err) - return - } + err = pusherClient.Subscribe("order_book") + if err != nil { + log.Printf("%s Websocket Trade subscription error: %s\n", b.GetName(), err) + } - dataChannelTrade, err := pusherClient.Bind("data") - if err != nil { - log.Println("Bind error: ", err) - return - } - tradeChannelTrade, err := pusherClient.Bind("trade") - if err != nil { - log.Println("Bind error: ", err) - return - } + dataChannelTrade, err := pusherClient.Bind("data") + if err != nil { + log.Printf("%s Websocket Bind error: ", b.GetName(), err) + continue + } + tradeChannelTrade, err := pusherClient.Bind("trade") + if err != nil { + log.Printf("%s Websocket Bind error: ", b.GetName(), err) + continue + } - log.Printf("%s Pusher client ready.\n", b.GetName()) + log.Printf("%s Pusher client connected.\n", b.GetName()) - for b.Websocket { - select { - case data := <-dataChannelTrade: - result := BitstampPusherOrderbook{} - err := JSONDecode([]byte(data.Data), &result) - if err != nil { - log.Println(err) + for b.Websocket { + select { + case data := <-dataChannelTrade: + result := BitstampPusherOrderbook{} + err := JSONDecode([]byte(data.Data), &result) + if err != nil { + log.Println(err) + } + case trade := <-tradeChannelTrade: + result := BitstampPusherTrade{} + err := JSONDecode([]byte(trade.Data), &result) + if err != nil { + log.Println(err) + } + log.Printf("%s Pusher trade: Price: %f Amount: %f\n", b.GetName(), result.Price, result.Amount) } - case trade := <-tradeChannelTrade: - result := BitstampPusherTrade{} - err := JSONDecode([]byte(trade.Data), &result) - if err != nil { - log.Println(err) - } - log.Printf("%s Pusher trade: Price: %f Amount: %f\n", b.GetName(), result.Price, result.Amount) } } -} \ No newline at end of file +} diff --git a/btcchinawebsocket.go b/btcchinawebsocket.go index 316a3381..95e27c1d 100644 --- a/btcchinawebsocket.go +++ b/btcchinawebsocket.go @@ -1,9 +1,9 @@ package main import ( - "log" "fmt" "github.com/thrasher-/socketio" + "log" ) const ( @@ -11,38 +11,38 @@ const ( ) type BTCChinaWebsocketOrder struct { - Price float64 `json:"price"` + Price float64 `json:"price"` TotalAmount float64 `json:"totalamount"` - Type string `json:"type"` + Type string `json:"type"` } type BTCChinaWebsocketGroupOrder struct { - Asks []BTCChinaWebsocketOrder `json:"ask"` - Bids []BTCChinaWebsocketOrder `json:"bid"` - Market string `json:"market"` + Asks []BTCChinaWebsocketOrder `json:"ask"` + Bids []BTCChinaWebsocketOrder `json:"bid"` + Market string `json:"market"` } type BTCChinaWebsocketTrade struct { - Amount float64 `json:"amount,string"` - Date float64 `json:"date"` - Market string `json:"market"` - Price float64 `json:"price,string"` + Amount float64 `json:"amount,string"` + Date float64 `json:"date"` + Market string `json:"market"` + Price float64 `json:"price,string"` TradeID float64 `json:"trade_id"` - Type string `json:"type"` + Type string `json:"type"` } type BTCChinaWebsocketTicker struct { - Buy float64 `json:"buy"` - Date float64 `json:"date"` - High float64 `json:"high"` - Last float64 `json:"last"` - Low float64 `json:"low"` - Market string`json:"market"` - Open float64 `json:"open"` + Buy float64 `json:"buy"` + Date float64 `json:"date"` + High float64 `json:"high"` + Last float64 `json:"last"` + Low float64 `json:"low"` + Market string `json:"market"` + Open float64 `json:"open"` PrevClose float64 `json:"prev_close"` - Sell float64 `json:"sell"` - Volume float64 `json:"vol"` - Vwap float64 `json:"vwap"` + Sell float64 `json:"sell"` + Volume float64 `json:"vol"` + Vwap float64 `json:"vwap"` } var BTCChinaSocket *socketio.SocketIO @@ -125,19 +125,20 @@ func (b *BTCChina) WebsocketClient() { events["trade"] = b.OnTrade BTCChinaSocket = &socketio.SocketIO{ - Version: 1, - OnConnect: b.OnConnect, - OnEvent: events, - OnError: b.OnError, - OnMessage: b.OnMessage, + Version: 1, + OnConnect: b.OnConnect, + OnEvent: events, + OnError: b.OnError, + OnMessage: b.OnMessage, OnDisconnect: b.OnDisconnect, } - err := socketio.ConnectToSocket(BTCCHINA_SOCKETIO_ADDRESS, BTCChinaSocket) - if err != nil { - log.Println(err) - } - - log.Printf("%s Websocket client disconnected.. Reconnecting.", b.GetName()) - b.WebsocketClient() -} \ No newline at end of file + for b.Enabled && b.Websocket { + err := socketio.ConnectToSocket(BTCCHINA_SOCKETIO_ADDRESS, BTCChinaSocket) + if err != nil { + log.Printf("%s Unable to connect to Websocket. Err: %s\n", err) + continue + } + log.Printf("%s Disconnected from Websocket.") + } +} diff --git a/coinbasewebsocket.go b/coinbasewebsocket.go index 7136b28b..41dcc867 100644 --- a/coinbasewebsocket.go +++ b/coinbasewebsocket.go @@ -1,9 +1,9 @@ package main import ( + "github.com/gorilla/websocket" "log" "net/http" - "github.com/gorilla/websocket" ) const ( @@ -11,160 +11,164 @@ const ( ) type CoinbaseWebsocketSubscribe struct { - Type string `json:"type"` + Type string `json:"type"` ProductID string `json:"product_id"` } type CoinbaseWebsocketReceived struct { - Type string `json:"type"` - Time string `json:"time"` - Sequence int `json:"sequence"` - OrderID string `json:"order_id"` - Size float64 `json:"size,string"` - Price float64 `json:"price,string"` - Side string `json:"side"` + Type string `json:"type"` + Time string `json:"time"` + Sequence int `json:"sequence"` + OrderID string `json:"order_id"` + Size float64 `json:"size,string"` + Price float64 `json:"price,string"` + Side string `json:"side"` } type CoinbaseWebsocketOpen struct { - Type string `json:"type"` - Time string `json:"time"` - Sequence int `json:"sequence"` - OrderID string `json:"order_id"` - Price float64 `json:"price,string"` + Type string `json:"type"` + Time string `json:"time"` + Sequence int `json:"sequence"` + OrderID string `json:"order_id"` + Price float64 `json:"price,string"` RemainingSize float64 `json:"remaining_size,string"` - Side string `json:"side"` + Side string `json:"side"` } type CoinbaseWebsocketDone struct { - Type string `json:"type"` - Time string `json:"time"` - Sequence int `json:"sequence"` - Price float64 `json:"price,string"` - OrderID string `json:"order_id"` - Reason string `json:"reason"` - Side string `json:"side"` + Type string `json:"type"` + Time string `json:"time"` + Sequence int `json:"sequence"` + Price float64 `json:"price,string"` + OrderID string `json:"order_id"` + Reason string `json:"reason"` + Side string `json:"side"` RemainingSize float64 `json:"remaining_size,string"` } type CoinbaseWebsocketMatch struct { - Type string `json:"type"` - TradeID int `json:"trade_id"` - Sequence int `json:"sequence"` - MakerOrderID string `json:"maker_order_id"` - TakerOrderID string `json:"taker_order_id"` - Time string `json:"time"` - Size float64 `json:"size,string"` - Price float64 `json:"price,string"` - Side string `json:"side"` + Type string `json:"type"` + TradeID int `json:"trade_id"` + Sequence int `json:"sequence"` + MakerOrderID string `json:"maker_order_id"` + TakerOrderID string `json:"taker_order_id"` + Time string `json:"time"` + Size float64 `json:"size,string"` + Price float64 `json:"price,string"` + Side string `json:"side"` } type CoinbaseWebsocketChange struct { - Type string `json:"type"` - Time string `json:"time"` - Sequence int `json:"sequence"` - OrderID string `json:"order_id"` - NewSize float64 `json:"new_size,string"` - OldSize float64 `json:"old_size,string"` - Price float64 `json:"price,string"` - Side string `json:"side"` + Type string `json:"type"` + Time string `json:"time"` + Sequence int `json:"sequence"` + OrderID string `json:"order_id"` + NewSize float64 `json:"new_size,string"` + OldSize float64 `json:"old_size,string"` + Price float64 `json:"price,string"` + Side string `json:"side"` } -func (c *Coinbase) WebsocketClient() { - var Dialer websocket.Dialer - conn, resp, err := Dialer.Dial(COINBASE_WEBSOCKET_URL, http.Header{}) - - if err != nil { - log.Println(err) - return - } - - if c.Verbose { - log.Printf("%s Connected to Websocket.", c.GetName()) - log.Println(resp) - } - +func (c *Coinbase) WebsocketSubscribe(product string, conn *websocket.Conn) error { subscribe := CoinbaseWebsocketSubscribe{"subscribe", "BTC-USD"} json, err := JSONEncode(subscribe) if err != nil { - log.Println(err) - conn.Close() - return + return err } err = conn.WriteMessage(websocket.TextMessage, json) if err != nil { - log.Println(err) - conn.Close() - return + return err } + return nil +} - if c.Verbose { - log.Printf("%s Subscribed to product messages.", c.GetName()) - } +func (c *Coinbase) WebsocketClient() { + for c.Enabled && c.Websocket { + var Dialer websocket.Dialer + conn, _, err := Dialer.Dial(COINBASE_WEBSOCKET_URL, http.Header{}) - for { - msgType, resp, err := conn.ReadMessage() if err != nil { - log.Println(err) - break + log.Printf("%s Unable to connect to Websocket. Error: %s\n", c.GetName(), err) + continue } - switch msgType { - case websocket.TextMessage: - type MsgType struct { - Type string `json:"type"` - } + log.Printf("%s Connected to Websocket.\n", c.GetName()) - msgType := MsgType{} - err := JSONDecode(resp, &msgType) + err = c.WebsocketSubscribe("BTC-USD", conn) + if err != nil { + log.Printf("%s Websocket subscription error: %s\n", c.GetName(), err) + continue + } + + if c.Verbose { + log.Printf("%s Subscribed to product messages.", c.GetName()) + } + + for c.Enabled && c.Websocket { + msgType, resp, err := conn.ReadMessage() if err != nil { log.Println(err) - continue + break } - switch msgType.Type { - case "error": - log.Println(string(resp)) - break - case "received": - received := CoinbaseWebsocketReceived{} - err := JSONDecode(resp, &received) + switch msgType { + case websocket.TextMessage: + type MsgType struct { + Type string `json:"type"` + } + + msgType := MsgType{} + err := JSONDecode(resp, &msgType) if err != nil { log.Println(err) continue } - case "open": - open := CoinbaseWebsocketOpen{} - err := JSONDecode(resp, &open) - if err != nil { - log.Println(err) - continue - } - case "done": - done := CoinbaseWebsocketDone{} - err := JSONDecode(resp, &done) - if err != nil { - log.Println(err) - continue - } - case "match": - match := CoinbaseWebsocketMatch{} - err := JSONDecode(resp, &match) - if err != nil { - log.Println(err) - continue - } - case "change": - change := CoinbaseWebsocketChange{} - err := JSONDecode(resp, &change) - if err != nil { - log.Println(err) - continue + + switch msgType.Type { + case "error": + log.Println(string(resp)) + break + case "received": + received := CoinbaseWebsocketReceived{} + err := JSONDecode(resp, &received) + if err != nil { + log.Println(err) + continue + } + case "open": + open := CoinbaseWebsocketOpen{} + err := JSONDecode(resp, &open) + if err != nil { + log.Println(err) + continue + } + case "done": + done := CoinbaseWebsocketDone{} + err := JSONDecode(resp, &done) + if err != nil { + log.Println(err) + continue + } + case "match": + match := CoinbaseWebsocketMatch{} + err := JSONDecode(resp, &match) + if err != nil { + log.Println(err) + continue + } + case "change": + change := CoinbaseWebsocketChange{} + err := JSONDecode(resp, &change) + if err != nil { + log.Println(err) + continue + } } } } + conn.Close() + log.Printf("%s Websocket client disconnected.", c.GetName()) } - conn.Close() - log.Printf("%s Websocket client disconnected.", c.GetName()) -} \ No newline at end of file +} diff --git a/cryptsywebsocket.go b/cryptsywebsocket.go index eb7bdcac..12d3f56a 100644 --- a/cryptsywebsocket.go +++ b/cryptsywebsocket.go @@ -2,91 +2,93 @@ package main import ( "github.com/toorop/go-pusher" - "strings" "log" + "strings" ) type CryptsyPusherTrade struct { Channel string `json:"channel"` - Trade struct { - Datetime string `json:"datetime"` - MarketID string `json:"marketid"` - MarketName string `json:"marketname"` - Price float64 `json:"price,string"` - Quantity float64 `json:"quantity,string"` - Timestamp int64 `json:"timestamp"` - Total string `json:"total"` - Type string `json:"type"` + Trade struct { + Datetime string `json:"datetime"` + MarketID string `json:"marketid"` + MarketName string `json:"marketname"` + Price float64 `json:"price,string"` + Quantity float64 `json:"quantity,string"` + Timestamp int64 `json:"timestamp"` + Total string `json:"total"` + Type string `json:"type"` } `json:"trade"` } type CryptsyPusherTicker struct { Channel string `json:"channel"` - Trade struct { - Datetime string `json:"datetime"` - MarketID string `json:"marketid"` - Timestamp int64 `json:"timestamp"` - TopBuy struct { - Price float64 `json:"price,string"` + Trade struct { + Datetime string `json:"datetime"` + MarketID string `json:"marketid"` + Timestamp int64 `json:"timestamp"` + TopBuy struct { + Price float64 `json:"price,string"` Quantitiy float64 `json:"quantity,string"` } `json:"topbuy"` TopSell struct { - Price float64 `json:"price,string"` + Price float64 `json:"price,string"` Quantity float64 `json:"quantity,string"` } `json:"topsell"` } `json:"trade"` } const ( - CRYPTSY_PUSHER_KEY = "cb65d0a7a72cd94adf1f" + CRYPTSY_PUSHER_KEY = "cb65d0a7a72cd94adf1f" ) -func (c *Cryptsy) PusherClient(marketID[] string) { - pusherClient, err := pusher.NewClient(CRYPTSY_PUSHER_KEY) - if err != nil { - log.Fatalln(err) - return - } - - for i := 0; i < len(marketID); i++ { - err = pusherClient.Subscribe("trade." + marketID[i]) - +func (c *Cryptsy) PusherClient(marketID []string) { + for c.Enabled && c.Websocket { + pusherClient, err := pusher.NewClient(CRYPTSY_PUSHER_KEY) if err != nil { - log.Println("Trade subscription error : ", err) + log.Printf("%s Unable to connect to Websocket. Error: %s\n", c.GetName(), err) + continue } - err = pusherClient.Subscribe("ticker." + marketID[i]) - if err != nil { - log.Println("Ticker subscription error : ", err) + for i := 0; i < len(marketID); i++ { + err = pusherClient.Subscribe("trade." + marketID[i]) + + if err != nil { + log.Printf("%s Websocket Trade subscription error: %s\n", c.GetName(), err) + } + + err = pusherClient.Subscribe("ticker." + marketID[i]) + if err != nil { + log.Printf("%s Websocket Trade subscription error: %s\n", c.GetName(), err) + } } - } - dataChannel, err := pusherClient.Bind("message") - if err != nil { - log.Println("Bind error: ", err) - return - } - log.Printf("%s Pusher client ready.\n", c.GetName()) + dataChannel, err := pusherClient.Bind("message") + if err != nil { + log.Printf("%s Websocket Bind error: ", c.GetName(), err) + continue + } + log.Printf("%s Pusher client connected.\n", c.GetName()) - for c.Websocket { - select { - case data := <-dataChannel: - if strings.Contains(data.Data, "topbuy") { - result := CryptsyPusherTicker{} - err := JSONDecode([]byte(data.Data), &result) - if err != nil { - log.Println(err) - continue + for c.Enabled && c.Websocket { + select { + case data := <-dataChannel: + if strings.Contains(data.Data, "topbuy") { + result := CryptsyPusherTicker{} + err := JSONDecode([]byte(data.Data), &result) + if err != nil { + log.Println(err) + continue + } + } else { + result := CryptsyPusherTrade{} + err := JSONDecode([]byte(data.Data), &result) + if err != nil { + log.Println(err) + continue + } + log.Printf("%s Pusher trade - market %s - Price %f Amount %f Type %s\n", c.GetName(), result.Channel, result.Trade.Price, result.Trade.Quantity, result.Trade.Type) } - } else { - result := CryptsyPusherTrade{} - err := JSONDecode([]byte(data.Data), &result) - if err != nil { - log.Println(err) - continue - } - log.Printf("%s Pusher trade - market %s - Price %f Amount %f Type %s\n", c.GetName(), result.Channel, result.Trade.Price, result.Trade.Quantity, result.Trade.Type) } } } -} \ No newline at end of file +} diff --git a/huobiwebsocket.go b/huobiwebsocket.go index 2827fad3..44115988 100644 --- a/huobiwebsocket.go +++ b/huobiwebsocket.go @@ -1,107 +1,106 @@ package main import ( - "fmt" - "log" "github.com/thrasher-/socketio" + "log" ) const ( HUOBI_SOCKETIO_ADDRESS = "https://hq.huobi.com:443" //Service API - HUOBI_SOCKET_REQ_SYMBOL_LIST = "reqSymbolList" + HUOBI_SOCKET_REQ_SYMBOL_LIST = "reqSymbolList" HUOBI_SOCKET_REQ_SYMBOL_DETAIL = "reqSymbolDetail" - HUOBI_SOCKET_REQ_SUBSCRIBE = "reqMsgSubscribe" - HUOBI_SOCKET_REQ_UNSUBSCRIBE = "reqMsgUnsubscribe" + 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_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" + 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_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" + HUOBI_SOCKET_REQ_MARKET_DETAIL = "reqMarketDetail" ) var HuobiSocket *socketio.SocketIO type HuobiDepth struct { - SymbolID string `json:"symbolId"` - Time float64 `json:"time"` - Version float64 `json:"version"` - BidName string `json:"bidName"` - BidPrice []float64 `json:"bidPrice"` - BidTotal []float64 `json:"bidTotal"` + SymbolID string `json:"symbolId"` + Time float64 `json:"time"` + Version float64 `json:"version"` + BidName string `json:"bidName"` + BidPrice []float64 `json:"bidPrice"` + BidTotal []float64 `json:"bidTotal"` BidAmount []float64 `json:"bidAmount"` - AskName string `json:"askName"` - AskPrice []float64 `json:"askPrice"` - AskTotal []float64 `json:"askTotal"` + AskName string `json:"askName"` + AskPrice []float64 `json:"askPrice"` + AskTotal []float64 `json:"askTotal"` AskAmount []float64 `json:"askAmount"` } type HuobiWebsocketTrade struct { - Price []float64 `json:"price"` - Level []float64 `json:"level"` - Amount []float64 `json:"amount"` + Price []float64 `json:"price"` + Level []float64 `json:"level"` + Amount []float64 `json:"amount"` AccuAmount []float64 `json:"accuAmount"` } type HuobiWebsocketTradeDetail struct { - SymbolID string `json:"symbolId"` - TradeID []int64 `json:"tradeId"` - Price []float64 `json:"price"` - Time []int64 `json:"time"` - Amount []float64 `json:"amount"` - TopBids []HuobiWebsocketTrade `json:"topBids"` - TopAsks []HuobiWebsocketTrade `json:"topAsks"` + SymbolID string `json:"symbolId"` + TradeID []int64 `json:"tradeId"` + Price []float64 `json:"price"` + Time []int64 `json:"time"` + Amount []float64 `json:"amount"` + TopBids []HuobiWebsocketTrade `json:"topBids"` + TopAsks []HuobiWebsocketTrade `json:"topAsks"` } 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"` + 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 HuobiWebsocketLastTimeline struct { - ID int64 `json:"_id"` - SymbolID string `json:"symbolId"` - Time int64 `json:"time"` + ID int64 `json:"_id"` + SymbolID string `json:"symbolId"` + Time int64 `json:"time"` LastPrice float64 `json:"priceLast"` - Amount float64 `json:"amount"` - Volume float64 `json:"volume"` - Count int64 `json:"count"` + Amount float64 `json:"amount"` + Volume float64 `json:"volume"` + Count int64 `json:"count"` } type HuobiResponse struct { - Version int `json:"version"` - MsgType string `json:"msgType"` - RequestIndex int64 `json:"requestIndex"` - RetCode int64 `json:"retCode"` - RetMessage string `json:"retMsg"` - Payload map[string]interface{} `json:"payload"` + Version int `json:"version"` + MsgType string `json:"msgType"` + RequestIndex int64 `json:"requestIndex"` + RetCode int64 `json:"retCode"` + RetMessage string `json:"retMsg"` + Payload map[string]interface{} `json:"payload"` } -func (h *HUOBI) BuildHuobiWebsocketRequest(msgType string, requestIndex int64, symbolRequest []string) (map[string]interface{}) { +func (h *HUOBI) BuildHuobiWebsocketRequest(msgType string, requestIndex int64, symbolRequest []string) map[string]interface{} { request := map[string]interface{}{} request["version"] = 1 request["msgType"] = msgType @@ -117,7 +116,7 @@ func (h *HUOBI) BuildHuobiWebsocketRequest(msgType string, requestIndex int64, s return request } -func (h *HUOBI) BuildHuobiWebsocketRequestExtra(msgType string, requestIndex int64, symbolIdList interface{}) (interface{}) { +func (h *HUOBI) BuildHuobiWebsocketRequestExtra(msgType string, requestIndex int64, symbolIdList interface{}) interface{} { request := map[string]interface{}{} request["version"] = 1 request["msgType"] = msgType @@ -130,7 +129,7 @@ func (h *HUOBI) BuildHuobiWebsocketRequestExtra(msgType string, requestIndex int return request } -func (h *HUOBI) BuildHuobiWebsocketParamsList(objectName, currency, pushType, period, count, from, to, percentage string) (interface{}) { +func (h *HUOBI) BuildHuobiWebsocketParamsList(objectName, currency, pushType, period, count, from, to, percentage string) interface{} { list := map[string]interface{}{} list["symbolId"] = currency list["pushType"] = pushType @@ -169,7 +168,7 @@ func (h *HUOBI) OnConnect(output chan socketio.Message) { if err != nil { log.Println(err) } - output <- socketio.CreateMessageEvent("request", string(result), nil, HuobiSocket.Version) + output <- socketio.CreateMessageEvent("request", string(result), nil, HuobiSocket.Version) msg = h.BuildHuobiWebsocketRequestExtra(HUOBI_SOCKET_REQ_SUBSCRIBE, 100, h.BuildHuobiWebsocketParamsList(HUOBI_SOCKET_MARKET_OVERVIEW, "ltccny", "pushLong", "", "", "", "", "")) result, err = JSONEncode(msg) @@ -206,18 +205,19 @@ func (h *HUOBI) WebsocketClient() { events["message"] = h.OnMessage HuobiSocket = &socketio.SocketIO{ - Version: 0.9, - OnConnect: h.OnConnect, - OnEvent: events, - OnError: h.OnError, + Version: 0.9, + OnConnect: h.OnConnect, + OnEvent: events, + OnError: h.OnError, OnDisconnect: h.OnDisconnect, } - err := socketio.ConnectToSocket(HUOBI_SOCKETIO_ADDRESS, HuobiSocket) - if err != nil { - fmt.Println(err) - } - - log.Printf("%s Websocket client disconnected.. Reconnecting.", h.GetName()) - h.WebsocketClient() -} \ No newline at end of file + for h.Enabled && h.Websocket { + err := socketio.ConnectToSocket(HUOBI_SOCKETIO_ADDRESS, HuobiSocket) + if err != nil { + log.Printf("%s Unable to connect to Websocket. Err: %s\n", err) + continue + } + log.Printf("%s Disconnected from Websocket.") + } +} diff --git a/lakebtcwebsocket.go b/lakebtcwebsocket.go index 03bac44c..665e05e6 100644 --- a/lakebtcwebsocket.go +++ b/lakebtcwebsocket.go @@ -2,9 +2,9 @@ package main import ( "fmt" + "github.com/gorilla/websocket" "log" "net/http" - "github.com/gorilla/websocket" ) const ( @@ -42,78 +42,77 @@ func WSRailsPong(id string, conn *websocket.Conn) { } func (l *LakeBTC) WebsocketClient() { - var Dialer websocket.Dialer - conn, resp, err := Dialer.Dial(LAKEBTC_WEBSOCKET_URL, http.Header{}) - - if err != nil { - log.Println(err) - return - } - - if l.Verbose { - log.Printf("%s Connected to Websocket.", l.GetName()) - log.Println(resp) - } - - for { - msgType, resp, err := conn.ReadMessage() - if err != nil { - log.Println(err) - break - } - - response := [][]interface{}{} - err = JSONDecode(resp, &response) + for l.Enabled && l.Websocket { + var Dialer websocket.Dialer + conn, _, err := Dialer.Dial(LAKEBTC_WEBSOCKET_URL, http.Header{}) if err != nil { - log.Println(err) - break + log.Printf("%s Unable to connect to Websocket. Error: %s\n", l.GetName(), err) + continue } - if msgType == websocket.TextMessage { - event := response[0][0] - data := response[0][1] + log.Printf("%s Connected to Websocket.\n", l.GetName()) - switch event { - case "client_connected": - WSRailsSubscribe("ticker", conn) - WSRailsSubscribe("orderbook_CNY", conn) - WSRailsSubscribe("orderbook_USD", conn) - case "websocket_rails.subscribe": - case "websocket_rails.ping": - WSRailsPong("null", conn) - case "update": - update := data.(map[string]interface{}) - channel := update["channel"] - data = update["data"] - dataJSON, err := JSONEncode(data) + for l.Enabled && l.Websocket { + msgType, resp, err := conn.ReadMessage() + if err != nil { + log.Println(err) + break + } - if err != nil { - log.Println(err) - continue - } + response := [][]interface{}{} + err = JSONDecode(resp, &response) - switch channel { - case "ticker": - ticker := LakeBTCTickerResponse{} - err = JSONDecode(dataJSON, &ticker) + if err != nil { + log.Println(err) + break + } + + if msgType == websocket.TextMessage { + event := response[0][0] + data := response[0][1] + + switch event { + case "client_connected": + WSRailsSubscribe("ticker", conn) + WSRailsSubscribe("orderbook_CNY", conn) + WSRailsSubscribe("orderbook_USD", conn) + case "websocket_rails.subscribe": + case "websocket_rails.ping": + WSRailsPong("null", conn) + case "update": + update := data.(map[string]interface{}) + channel := update["channel"] + data = update["data"] + dataJSON, err := JSONEncode(data) if err != nil { log.Println(err) continue } - case "orderbook_USD", "orderbook_CNY": - orderbook := LakeBTCOrderbook{} - err = JSONDecode(dataJSON, &orderbook) - if err != nil { - log.Println(err) - continue + switch channel { + case "ticker": + ticker := LakeBTCTickerResponse{} + err = JSONDecode(dataJSON, &ticker) + + if err != nil { + log.Println(err) + continue + } + case "orderbook_USD", "orderbook_CNY": + orderbook := LakeBTCOrderbook{} + err = JSONDecode(dataJSON, &orderbook) + + if err != nil { + log.Println(err) + continue + } } } } } + conn.Close() + log.Printf("%s Websocket client disconnected.\n", l.GetName()) } - conn.Close() - log.Printf("%s Websocket client disconnected.", l.GetName()) -} \ No newline at end of file +} diff --git a/okcoinwebsocket.go b/okcoinwebsocket.go index 088ebbf3..c69de0b6 100644 --- a/okcoinwebsocket.go +++ b/okcoinwebsocket.go @@ -1,74 +1,74 @@ -package main +package main import ( + "fmt" + "github.com/gorilla/websocket" "log" "net/http" "net/url" - "time" - "fmt" - "strings" "strconv" - "github.com/gorilla/websocket" + "strings" + "time" ) var OKConnWebsocket *websocket.Conn const ( - OKCOIN_WEBSOCKET_USD_REALTRADES = "ok_usd_realtrades" - OKCOIN_WEBSOCKET_CNY_REALTRADES = "ok_cny_realtrades" - OKCOIN_WEBSOCKET_SPOTUSD_TRADE = "ok_spotusd_trade" - OKCOIN_WEBSOCKET_SPOTCNY_TRADE = "ok_spotcny_trade" + OKCOIN_WEBSOCKET_USD_REALTRADES = "ok_usd_realtrades" + OKCOIN_WEBSOCKET_CNY_REALTRADES = "ok_cny_realtrades" + OKCOIN_WEBSOCKET_SPOTUSD_TRADE = "ok_spotusd_trade" + OKCOIN_WEBSOCKET_SPOTCNY_TRADE = "ok_spotcny_trade" OKCOIN_WEBSOCKET_SPOTUSD_CANCEL_ORDER = "ok_spotusd_cancel_order" OKCOIN_WEBSOCKET_SPOTCNY_CANCEL_ORDER = "ok_spotcny_cancel_order" - OKCOIN_WEBSOCKET_SPOTUSD_USERINFO = "ok_spotusd_userinfo" - OKCOIN_WEBSOCKET_SPOTCNY_USERINFO = "ok_spotcny_userinfo" - OKCOIN_WEBSOCKET_SPOTUSD_ORDER_INFO = "ok_spotusd_order_info" - OKCOIN_WEBSOCKET_SPOTCNY_ORDER_INFO = "ok_spotcny_order_info" - OKCOIN_WEBSOCKET_FUTURES_TRADE = "ok_futuresusd_trade" + OKCOIN_WEBSOCKET_SPOTUSD_USERINFO = "ok_spotusd_userinfo" + OKCOIN_WEBSOCKET_SPOTCNY_USERINFO = "ok_spotcny_userinfo" + OKCOIN_WEBSOCKET_SPOTUSD_ORDER_INFO = "ok_spotusd_order_info" + OKCOIN_WEBSOCKET_SPOTCNY_ORDER_INFO = "ok_spotcny_order_info" + OKCOIN_WEBSOCKET_FUTURES_TRADE = "ok_futuresusd_trade" OKCOIN_WEBSOCKET_FUTURES_CANCEL_ORDER = "ok_futuresusd_cancel_order" - OKCOIN_WEBSOCKET_FUTURES_REALTRADES = "ok_usd_future_realtrades" - OKCOIN_WEBSOCKET_FUTURES_USERINFO = "ok_futureusd_userinfo" - OKCOIN_WEBSOCKET_FUTURES_ORDER_INFO = "ok_futureusd_order_info" + OKCOIN_WEBSOCKET_FUTURES_REALTRADES = "ok_usd_future_realtrades" + OKCOIN_WEBSOCKET_FUTURES_USERINFO = "ok_futureusd_userinfo" + OKCOIN_WEBSOCKET_FUTURES_ORDER_INFO = "ok_futureusd_order_info" ) type OKCoinWebsocketFutureIndex struct { FutureIndex float64 `json:"futureIndex"` - Timestamp int64 `json:"timestamp,string"` + Timestamp int64 `json:"timestamp,string"` } 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"` + 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 OKCoinWebsocketFuturesTicker struct { - Buy float64 `json:"buy"` - ContractID string `json:"contractId"` - High float64 `json:"high"` + Buy float64 `json:"buy"` + ContractID string `json:"contractId"` + High float64 `json:"high"` HoldAmount float64 `json:"hold_amount"` - Last float64 `json:"last,string"` - Low float64 `json:"low"` - Sell float64 `json:"sell"` + Last float64 `json:"last,string"` + Low float64 `json:"low"` + Sell float64 `json:"sell"` UnitAmount float64 `json:"unitAmount"` - Volume float64 `json:"vol,string"` + Volume float64 `json:"vol,string"` } type OKCoinWebsocketOrderbook struct { - Asks [][]float64 `json:"asks"` - Bids [][]float64 `json:"bids"` - Timestamp int64 `json:"timestamp,string"` + Asks [][]float64 `json:"asks"` + Bids [][]float64 `json:"bids"` + Timestamp int64 `json:"timestamp,string"` } type OKCoinWebsocketUserinfo struct { Info struct { Funds struct { Asset struct { - Net float64 `json:"net,string"` + Net float64 `json:"net,string"` Total float64 `json:"total,string"` } `json:"asset"` Free struct { @@ -89,122 +89,122 @@ type OKCoinWebsocketUserinfo struct { } type OKCoinWebsocketFuturesContract struct { - Available float64 `json:"available"` - Balance float64 `json:"balance"` - Bond float64 `json:"bond"` - ContractID float64 `json:"contract_id"` - ContractType string `json:"contract_type"` - Frozen float64 `json:"freeze"` - Profit float64 `json:"profit"` - Loss float64 `json:"unprofit"` + Available float64 `json:"available"` + Balance float64 `json:"balance"` + Bond float64 `json:"bond"` + ContractID float64 `json:"contract_id"` + ContractType string `json:"contract_type"` + Frozen float64 `json:"freeze"` + Profit float64 `json:"profit"` + Loss float64 `json:"unprofit"` } type OKCoinWebsocketFuturesUserInfo struct { Info struct { BTC struct { - Balance float64 `json:"balance"` + Balance float64 `json:"balance"` Contracts []OKCoinWebsocketFuturesContract `json:"contracts"` - Rights float64 `json:"rights"` + Rights float64 `json:"rights"` } `json:"btc"` LTC struct { - Balance float64 `json:"balance"` + Balance float64 `json:"balance"` Contracts []OKCoinWebsocketFuturesContract `json:"contracts"` - Rights float64 `json:"rights"` + Rights float64 `json:"rights"` } `json:"ltc"` } `json:"info"` Result bool `json:"result"` } type OKCoinWebsocketOrder struct { - Amount float64 `json:"amount"` - AvgPrice float64 `json:"avg_price"` + Amount float64 `json:"amount"` + AvgPrice float64 `json:"avg_price"` DateCreated float64 `json:"create_date"` TradeAmount float64 `json:"deal_amount"` - OrderID float64 `json:"order_id"` - OrdersID float64 `json:"orders_id"` - Price float64 `json:"price"` - Status int64 `json:"status"` - Symbol string `json:"symbol"` - OrderType string `json:"type"` + OrderID float64 `json:"order_id"` + OrdersID float64 `json:"orders_id"` + Price float64 `json:"price"` + Status int64 `json:"status"` + Symbol string `json:"symbol"` + OrderType string `json:"type"` } type OKCoinWebsocketFuturesOrder struct { - Amount float64 `json:"amount"` - ContractName string `json:"contract_name"` - DateCreated float64 `json:"createdDate"` - TradeAmount float64 `json:"deal_amount"` - Fee float64 `json:"fee"` - LeverageAmount int `json:"lever_rate"` - OrderID float64 `json:"order_id"` - Price float64 `json:"price"` - AvgPrice float64 `json:"avg_price"` - Status int `json:"status"` - Symbol string `json:"symbol"` - TradeType int `json:"type"` - UnitAmount float64 `json:"unit_amount"` + Amount float64 `json:"amount"` + ContractName string `json:"contract_name"` + DateCreated float64 `json:"createdDate"` + TradeAmount float64 `json:"deal_amount"` + Fee float64 `json:"fee"` + LeverageAmount int `json:"lever_rate"` + OrderID float64 `json:"order_id"` + Price float64 `json:"price"` + AvgPrice float64 `json:"avg_price"` + Status int `json:"status"` + Symbol string `json:"symbol"` + TradeType int `json:"type"` + UnitAmount float64 `json:"unit_amount"` } type OKCoinWebsocketRealtrades struct { - AveragePrice float64 `json:"averagePrice,string"` + AveragePrice float64 `json:"averagePrice,string"` CompletedTradeAmount float64 `json:"completedTradeAmount,string"` - DateCreated float64 `json:"createdDate"` - ID float64 `json:"id"` - OrderID float64 `json:"orderId"` - SigTradeAmount float64 `json:"sigTradeAmount,string"` - SigTradePrice float64 `json:"sigTradePrice,string"` - Status int64 `json:"status"` - Symbol string `json:"symbol"` - TradeAmount float64 `json:"tradeAmount,string"` - TradePrice float64 `json:"buy,string"` - TradeType string `json:"tradeType"` - TradeUnitPrice float64 `json:"tradeUnitPrice,string"` - UnTrade float64 `json:"unTrade,string"` + DateCreated float64 `json:"createdDate"` + ID float64 `json:"id"` + OrderID float64 `json:"orderId"` + SigTradeAmount float64 `json:"sigTradeAmount,string"` + SigTradePrice float64 `json:"sigTradePrice,string"` + Status int64 `json:"status"` + Symbol string `json:"symbol"` + TradeAmount float64 `json:"tradeAmount,string"` + TradePrice float64 `json:"buy,string"` + TradeType string `json:"tradeType"` + TradeUnitPrice float64 `json:"tradeUnitPrice,string"` + UnTrade float64 `json:"unTrade,string"` } type OKCoinWebsocketFuturesRealtrades struct { - Amount float64 `json:"amount,string"` - ContractID float64 `json:"contract_id,string"` - ContractName string `json:"contract_name"` - ContractType string `json:"contract_type"` - TradeAmount float64 `json:"deal_amount,string"` - Fee float64 `json:"fee,string"` - OrderID float64 `json:"orderid"` - Price float64 `json:"price,string"` - AvgPrice float64 `json:"price_avg,string"` - Status int `json:"status,string"` - TradeType int `json:"type,string"` - UnitAmount float64 `json:"unit_amount,string"` - LeverageAmount int `json:"lever_rate,string"` + Amount float64 `json:"amount,string"` + ContractID float64 `json:"contract_id,string"` + ContractName string `json:"contract_name"` + ContractType string `json:"contract_type"` + TradeAmount float64 `json:"deal_amount,string"` + Fee float64 `json:"fee,string"` + OrderID float64 `json:"orderid"` + Price float64 `json:"price,string"` + AvgPrice float64 `json:"price_avg,string"` + Status int `json:"status,string"` + TradeType int `json:"type,string"` + UnitAmount float64 `json:"unit_amount,string"` + LeverageAmount int `json:"lever_rate,string"` } type OKCoinWebsocketEvent struct { - Event string `json:"event"` + Event string `json:"event"` Channel string `json:"channel"` } type OKCoinWebsocketResponse struct { - Channel string `json:"channel"` - Data interface{} `json:"data"` + Channel string `json:"channel"` + Data interface{} `json:"data"` } type OKCoinWebsocketEventAuth struct { - Event string `json:"event"` - Channel string `json:"channel"` + Event string `json:"event"` + Channel string `json:"channel"` Parameters map[string]string `json:"parameters"` } type OKCoinWebsocketEventAuthRemove struct { - Event string `json:"event"` - Channel string `json:"channel"` + Event string `json:"event"` + Channel string `json:"channel"` Parameters map[string]string `json:"parameters"` } type OKCoinWebsocketTradeOrderResponse struct { OrderID int64 `json:"order_id,string"` - Result bool `json:"result,string"` + Result bool `json:"result,string"` } -func (o *OKCoin) PingHandler(message string) (error) { +func (o *OKCoin) PingHandler(message string) error { err := OKConnWebsocket.WriteControl(websocket.PingMessage, []byte("{'event':'ping'}"), time.Now().Add(time.Second)) if err != nil { @@ -212,7 +212,7 @@ func (o *OKCoin) PingHandler(message string) (error) { return err } return nil -} +} func (o *OKCoin) AddChannel(channel string) { event := OKCoinWebsocketEvent{"addChannel", channel} @@ -233,7 +233,7 @@ func (o *OKCoin) AddChannel(channel string) { } } -func (o* OKCoin) RemoveChannel(channel string) { +func (o *OKCoin) RemoveChannel(channel string) { event := OKCoinWebsocketEvent{"removeChannel", channel} json, err := JSONEncode(event) if err != nil { @@ -330,7 +330,7 @@ func (o *OKCoin) WebsocketFuturesOrderInfo(symbol, contractType string, orderID o.AddChannelAuthenticated(OKCOIN_WEBSOCKET_FUTURES_ORDER_INFO, values) } -func (o *OKCoin) ConvertToURLValues(values map[string]string) (url.Values) { +func (o *OKCoin) ConvertToURLValues(values map[string]string) url.Values { urlVals := url.Values{} for i, x := range values { urlVals.Set(i, x) @@ -338,7 +338,7 @@ func (o *OKCoin) ConvertToURLValues(values map[string]string) (url.Values) { return urlVals } -func (o *OKCoin) WebsocketSign(values map[string]string) (string) { +func (o *OKCoin) WebsocketSign(values map[string]string) string { values["api_key"] = o.PartnerID urlVals := o.ConvertToURLValues(values) return strings.ToUpper(HexEncodeToString(GetMD5([]byte(urlVals.Encode() + "&secret_key=" + o.SecretKey)))) @@ -390,261 +390,253 @@ func (o *OKCoin) WebsocketClient(currencies []string) { return } - var Dialer websocket.Dialer - var err error - var resp *http.Response - OKConnWebsocket, resp, err = Dialer.Dial(o.WebsocketURL, http.Header{}) + for o.Enabled && o.Websocket { + var Dialer websocket.Dialer + var err error + OKConnWebsocket, _, err = Dialer.Dial(o.WebsocketURL, http.Header{}) - if err != nil { - log.Println(err) - return - } - - if o.Verbose { - log.Printf("%s Connected to Websocket.", o.GetName()) - log.Println(resp) - } - - OKConnWebsocket.SetPingHandler(o.PingHandler) - - if o.Verbose { - log.Printf("%s Websocket: Collecting user information.\n", o.GetName()) - } - - currencyChan, userinfoChan := "", "" - futuruesContractValues := []string{"this_week", "next_week", "quarter"} - klineValues := []string{"1min", "3min", "5min", "15min", "30min", "1hour", "2hour", "4hour", "6hour", "12hour", "day", "3day", "week"} - - if o.WebsocketURL == OKCOIN_WEBSOCKET_URL_CHINA { - currencyChan = OKCOIN_WEBSOCKET_CNY_REALTRADES - userinfoChan = OKCOIN_WEBSOCKET_SPOTCNY_USERINFO - o.WebsocketSpotOrderInfo("btc_cny", -1) - o.WebsocketSpotOrderInfo("ltc_cny", -1) - } else { - currencyChan = OKCOIN_WEBSOCKET_USD_REALTRADES - userinfoChan = OKCOIN_WEBSOCKET_SPOTUSD_USERINFO - o.WebsocketSpotOrderInfo("btc_usd", -1) - o.WebsocketSpotOrderInfo("ltc_usd", -1) - o.AddChannelAuthenticated(OKCOIN_WEBSOCKET_FUTURES_REALTRADES, map[string]string{}) - o.AddChannelAuthenticated(OKCOIN_WEBSOCKET_FUTURES_USERINFO, map[string]string{}) - - // get all unfilled futures orders for both currencies - for _, y := range futuruesContractValues { - o.WebsocketFuturesOrderInfo("btc_usd", y, -1, 1, 1, 50) - o.WebsocketFuturesOrderInfo("ltc_usd", y, -1, 1, 1, 50) + if err != nil { + log.Printf("%s Unable to connect to Websocket. Error: %s\n", o.GetName(), err) + continue } - } - o.AddChannelAuthenticated(currencyChan, map[string]string{}) - o.AddChannelAuthenticated(userinfoChan, map[string]string{}) - //spot - for _, x := range currencies { - o.AddChannel(fmt.Sprintf("ok_%s_ticker", x)) - o.AddChannel(fmt.Sprintf("ok_%s_depth60", x)) - o.AddChannel(fmt.Sprintf("ok_%s_trades_v1", x)) - for _, y := range klineValues { - o.AddChannel(fmt.Sprintf("ok_%s_kline_%s", x, y)) - } - } + log.Printf("%s Connected to Websocket.\n", o.GetName()) + OKConnWebsocket.SetPingHandler(o.PingHandler) + currencyChan, userinfoChan := "", "" + futuruesContractValues := []string{"this_week", "next_week", "quarter"} + klineValues := []string{"1min", "3min", "5min", "15min", "30min", "1hour", "2hour", "4hour", "6hour", "12hour", "day", "3day", "week"} - //futures - for _, x := range currencies { - o.AddChannel(fmt.Sprintf("ok_%s_future_index", x)) - for _, y := range futuruesContractValues { - o.AddChannel(fmt.Sprintf("ok_%s_future_ticker_%s", x,y)) - o.AddChannel(fmt.Sprintf("ok_%s_future_depth_%s_60", x,y)) - o.AddChannel(fmt.Sprintf("ok_%s_future_trade_v1_%s", x,y)) - for _, z := range klineValues { - o.AddChannel(fmt.Sprintf("ok_future_%s_kline_%s_%s", x,y,z)) + if o.WebsocketURL == OKCOIN_WEBSOCKET_URL_CHINA { + currencyChan = OKCOIN_WEBSOCKET_CNY_REALTRADES + userinfoChan = OKCOIN_WEBSOCKET_SPOTCNY_USERINFO + o.WebsocketSpotOrderInfo("btc_cny", -1) + o.WebsocketSpotOrderInfo("ltc_cny", -1) + } else { + currencyChan = OKCOIN_WEBSOCKET_USD_REALTRADES + userinfoChan = OKCOIN_WEBSOCKET_SPOTUSD_USERINFO + o.WebsocketSpotOrderInfo("btc_usd", -1) + o.WebsocketSpotOrderInfo("ltc_usd", -1) + o.AddChannelAuthenticated(OKCOIN_WEBSOCKET_FUTURES_REALTRADES, map[string]string{}) + o.AddChannelAuthenticated(OKCOIN_WEBSOCKET_FUTURES_USERINFO, map[string]string{}) + + // get all unfilled futures orders for both currencies + for _, y := range futuruesContractValues { + o.WebsocketFuturesOrderInfo("btc_usd", y, -1, 1, 1, 50) + o.WebsocketFuturesOrderInfo("ltc_usd", y, -1, 1, 1, 50) } } - } + o.AddChannelAuthenticated(currencyChan, map[string]string{}) + o.AddChannelAuthenticated(userinfoChan, map[string]string{}) + //spot + for _, x := range currencies { + o.AddChannel(fmt.Sprintf("ok_%s_ticker", x)) + o.AddChannel(fmt.Sprintf("ok_%s_depth60", x)) + o.AddChannel(fmt.Sprintf("ok_%s_trades_v1", x)) - for { - msgType, resp, err := OKConnWebsocket.ReadMessage() - if err != nil { - log.Println(err) - break + for _, y := range klineValues { + o.AddChannel(fmt.Sprintf("ok_%s_kline_%s", x, y)) + } } - switch msgType { - case websocket.TextMessage: - response := []interface{}{} - err = JSONDecode(resp, &response) + //futures + for _, x := range currencies { + o.AddChannel(fmt.Sprintf("ok_%s_future_index", x)) + for _, y := range futuruesContractValues { + o.AddChannel(fmt.Sprintf("ok_%s_future_ticker_%s", x, y)) + o.AddChannel(fmt.Sprintf("ok_%s_future_depth_%s_60", x, y)) + o.AddChannel(fmt.Sprintf("ok_%s_future_trade_v1_%s", x, y)) + for _, z := range klineValues { + o.AddChannel(fmt.Sprintf("ok_future_%s_kline_%s_%s", x, y, z)) + } + } + } + + for o.Enabled && o.Websocket { + msgType, resp, err := OKConnWebsocket.ReadMessage() if err != nil { log.Println(err) break } - - for _, y := range response { - z := y.(map[string]interface{}) - channel := z["channel"] - data := z["data"] - success := z["success"] - errorcode := z["errorcode"] - channelStr, ok := channel.(string) - - if !ok { - log.Println("Unable to convert channel to string") - continue - } - - if success != "true" && success != nil { - errorCodeStr, ok := errorcode.(string) - if !ok { - log.Printf("%s Websocket: Unable to convert errorcode to string.\n", o .GetName) - log.Printf("%s Websocket: channel %s error code: %s.\n", o.GetName(), channelStr, errorcode) - } else { - log.Printf("%s Websocket: channel %s error: %s.\n", o.GetName(), channelStr, o.WebsocketErrors[errorCodeStr]) - } - continue - } - - dataJSON, err := JSONEncode(data) + switch msgType { + case websocket.TextMessage: + response := []interface{}{} + err = JSONDecode(resp, &response) if err != nil { log.Println(err) continue } - switch true { - case strings.Contains(channelStr, "ticker") && !strings.Contains(channelStr, "future"): - ticker := OKCoinWebsocketTicker{} - err = JSONDecode(dataJSON, &ticker) + for _, y := range response { + z := y.(map[string]interface{}) + channel := z["channel"] + data := z["data"] + success := z["success"] + errorcode := z["errorcode"] + channelStr, ok := channel.(string) + + if !ok { + log.Println("Unable to convert channel to string") + continue + } + + if success != "true" && success != nil { + errorCodeStr, ok := errorcode.(string) + if !ok { + log.Printf("%s Websocket: Unable to convert errorcode to string.\n", o.GetName) + log.Printf("%s Websocket: channel %s error code: %s.\n", o.GetName(), channelStr, errorcode) + } else { + log.Printf("%s Websocket: channel %s error: %s.\n", o.GetName(), channelStr, o.WebsocketErrors[errorCodeStr]) + } + continue + } + + dataJSON, err := JSONEncode(data) if err != nil { log.Println(err) continue } - case strings.Contains(channelStr, "ticker") && strings.Contains(channelStr, "future"): - ticker := OKCoinWebsocketFuturesTicker{} - err = JSONDecode(dataJSON, &ticker) - if err != nil { - log.Println(err) - continue - } - case strings.Contains(channelStr, "depth"): - orderbook := OKCoinWebsocketOrderbook{} - err = JSONDecode(dataJSON, &orderbook) + switch true { + case strings.Contains(channelStr, "ticker") && !strings.Contains(channelStr, "future"): + ticker := OKCoinWebsocketTicker{} + err = JSONDecode(dataJSON, &ticker) - if err != nil { - log.Println(err) - continue - } - case strings.Contains(channelStr, "trades_v1") || strings.Contains(channelStr, "trade_v1"): - type TradeResponse struct { - Data [][]string - } + if err != nil { + log.Println(err) + continue + } + case strings.Contains(channelStr, "ticker") && strings.Contains(channelStr, "future"): + ticker := OKCoinWebsocketFuturesTicker{} + err = JSONDecode(dataJSON, &ticker) - trades := TradeResponse{} - err = JSONDecode(dataJSON, &trades.Data) + if err != nil { + log.Println(err) + continue + } + case strings.Contains(channelStr, "depth"): + orderbook := OKCoinWebsocketOrderbook{} + err = JSONDecode(dataJSON, &orderbook) - if err != nil { - log.Println(err) - continue - } - // to-do: convert from string array to trade struct - case strings.Contains(channelStr, "kline"): - klines := []interface{}{} - err := JSONDecode(dataJSON, &klines) + if err != nil { + log.Println(err) + continue + } + case strings.Contains(channelStr, "trades_v1") || strings.Contains(channelStr, "trade_v1"): + type TradeResponse struct { + Data [][]string + } - if err != nil { - log.Println(err) - continue - } - case strings.Contains(channelStr, "spot") && strings.Contains(channelStr, "realtrades"): - if string(dataJSON) == "null" { - continue - } - realtrades := OKCoinWebsocketRealtrades{} - err := JSONDecode(dataJSON, &realtrades) + trades := TradeResponse{} + err = JSONDecode(dataJSON, &trades.Data) - if err != nil { - log.Println(err) - continue - } - case strings.Contains(channelStr, "future") && strings.Contains(channelStr, "realtrades"): - if string(dataJSON) == "null" { - continue - } - realtrades := OKCoinWebsocketFuturesRealtrades{} - err := JSONDecode(dataJSON, &realtrades) + if err != nil { + log.Println(err) + continue + } + // to-do: convert from string array to trade struct + case strings.Contains(channelStr, "kline"): + klines := []interface{}{} + err := JSONDecode(dataJSON, &klines) - if err != nil { - log.Println(err) - continue - } - case strings.Contains(channelStr, "spot") && strings.Contains(channelStr, "trade") || strings.Contains(channelStr, "futures") && strings.Contains(channelStr, "trade"): - tradeOrder := OKCoinWebsocketTradeOrderResponse{} - err := JSONDecode(dataJSON, &tradeOrder) + if err != nil { + log.Println(err) + continue + } + case strings.Contains(channelStr, "spot") && strings.Contains(channelStr, "realtrades"): + if string(dataJSON) == "null" { + continue + } + realtrades := OKCoinWebsocketRealtrades{} + err := JSONDecode(dataJSON, &realtrades) - if err != nil { - log.Println(err) - continue - } - case strings.Contains(channelStr, "cancel_order"): - cancelOrder := OKCoinWebsocketTradeOrderResponse{} - err := JSONDecode(dataJSON, &cancelOrder) + if err != nil { + log.Println(err) + continue + } + case strings.Contains(channelStr, "future") && strings.Contains(channelStr, "realtrades"): + if string(dataJSON) == "null" { + continue + } + realtrades := OKCoinWebsocketFuturesRealtrades{} + err := JSONDecode(dataJSON, &realtrades) - if err != nil { - log.Println(err) - continue - } - case strings.Contains(channelStr, "spot") && strings.Contains(channelStr, "userinfo"): - userinfo := OKCoinWebsocketUserinfo{} - err = JSONDecode(dataJSON, &userinfo) + if err != nil { + log.Println(err) + continue + } + case strings.Contains(channelStr, "spot") && strings.Contains(channelStr, "trade") || strings.Contains(channelStr, "futures") && strings.Contains(channelStr, "trade"): + tradeOrder := OKCoinWebsocketTradeOrderResponse{} + err := JSONDecode(dataJSON, &tradeOrder) - if err != nil { - log.Println(err) - continue - } - case strings.Contains(channelStr, "futureusd_userinfo"): - userinfo := OKCoinWebsocketFuturesUserInfo{} - err = JSONDecode(dataJSON, &userinfo) + if err != nil { + log.Println(err) + continue + } + case strings.Contains(channelStr, "cancel_order"): + cancelOrder := OKCoinWebsocketTradeOrderResponse{} + err := JSONDecode(dataJSON, &cancelOrder) - if err != nil { - log.Println(err) - continue - } - case strings.Contains(channelStr, "spot") && strings.Contains(channelStr, "order_info"): - type OrderInfoResponse struct { - Result bool `json:"result"` - Orders []OKCoinWebsocketOrder `json:"orders"` - } - var orders OrderInfoResponse - err := JSONDecode(dataJSON, &orders) + if err != nil { + log.Println(err) + continue + } + case strings.Contains(channelStr, "spot") && strings.Contains(channelStr, "userinfo"): + userinfo := OKCoinWebsocketUserinfo{} + err = JSONDecode(dataJSON, &userinfo) - if err != nil { - log.Println(err) - continue - } - case strings.Contains(channelStr, "futureusd_order_info"): - type OrderInfoResponse struct { - Result bool `json:"result"` - Orders []OKCoinWebsocketFuturesOrder`json:"orders"` - } - var orders OrderInfoResponse - err := JSONDecode(dataJSON, &orders) + if err != nil { + log.Println(err) + continue + } + case strings.Contains(channelStr, "futureusd_userinfo"): + userinfo := OKCoinWebsocketFuturesUserInfo{} + err = JSONDecode(dataJSON, &userinfo) - if err != nil { - log.Println(err) - continue - } - case strings.Contains(channelStr, "future_index"): - index := OKCoinWebsocketFutureIndex{} - err = JSONDecode(dataJSON, &index) + if err != nil { + log.Println(err) + continue + } + case strings.Contains(channelStr, "spot") && strings.Contains(channelStr, "order_info"): + type OrderInfoResponse struct { + Result bool `json:"result"` + Orders []OKCoinWebsocketOrder `json:"orders"` + } + var orders OrderInfoResponse + err := JSONDecode(dataJSON, &orders) - if err != nil { - log.Println(err) - continue + if err != nil { + log.Println(err) + continue + } + case strings.Contains(channelStr, "futureusd_order_info"): + type OrderInfoResponse struct { + Result bool `json:"result"` + Orders []OKCoinWebsocketFuturesOrder `json:"orders"` + } + var orders OrderInfoResponse + err := JSONDecode(dataJSON, &orders) + + if err != nil { + log.Println(err) + continue + } + case strings.Contains(channelStr, "future_index"): + index := OKCoinWebsocketFutureIndex{} + err = JSONDecode(dataJSON, &index) + + if err != nil { + log.Println(err) + continue + } } } } } + OKConnWebsocket.Close() + log.Printf("%s Websocket client disconnected.", o.GetName()) } - OKConnWebsocket.Close() - log.Printf("%s Websocket client disconnected.", o.GetName()) } func (o *OKCoin) SetWebsocketErrorDefaults() { @@ -691,5 +683,3 @@ func (o *OKCoin) SetWebsocketErrorDefaults() { "20025": "Leverage rate error", } } - -