mirror of
https://github.com/d0zingcat/gocryptotrader.git
synced 2026-05-13 15:09:42 +00:00
Made Websocket always reconnect whilst its enabled.
This commit is contained in:
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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.")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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())
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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.")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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())
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user