Made Websocket always reconnect whilst its enabled.

This commit is contained in:
Adrian Gallagher
2015-05-01 13:08:58 +10:00
parent e38fbe078a
commit 54a7110f31
7 changed files with 699 additions and 703 deletions

View File

@@ -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)
}
}
}
}

View File

@@ -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()
}
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.")
}
}

View File

@@ -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())
}
}

View File

@@ -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)
}
}
}
}
}

View File

@@ -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()
}
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.")
}
}

View File

@@ -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())
}
}

View File

@@ -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",
}
}