Files
gocryptotrader/exchanges/binance/binance_websocket.go
Ermal Guni 42ea6ba598 Binance websocket (#143)
* optimize dockerfile to not invalidate layers

* added binance websocket

* added binance websocket types

* loading exchanges from the codebase

* Setting Binance websocket to Yes

* revert import naming

* binance websocket was missing

* added gorilla websocket
2018-07-16 10:03:11 +10:00

98 lines
3.0 KiB
Go

package binance
import (
"log"
"net/http"
"strings"
"time"
"github.com/gorilla/websocket"
"github.com/thrasher-/gocryptotrader/common"
)
const (
binanceDefaultWebsocketURL = "wss://stream.binance.com:9443"
binancePingPeriod = 20 * time.Second
)
func (b *Binance) WebsocketClient() {
for b.Enabled && b.Websocket {
var Dialer websocket.Dialer
var err error
// myenabledPairs := strings.ToLower(strings.Replace(strings.Join(b.EnabledPairs, "@ticker/"), "-", "", -1)) + "@trade"
myenabledPairsTicker := strings.ToLower(strings.Replace(strings.Join(b.EnabledPairs, "@ticker/"), "-", "", -1)) + "@ticker"
myenabledPairsTrade := strings.ToLower(strings.Replace(strings.Join(b.EnabledPairs, "@trade/"), "-", "", -1)) + "@trade"
myenabledPairsKline := strings.ToLower(strings.Replace(strings.Join(b.EnabledPairs, "@kline_1m/"), "-", "", -1)) + "@kline_1m"
wsurl := b.WebsocketURL + "/stream?streams=" + myenabledPairsTicker + "/" + myenabledPairsTrade + "/" + myenabledPairsKline
// b.WebsocketConn, _, err = Dialer.Dial(binanceDefaultWebsocketURL+myenabledPairs, http.Header{})
b.WebsocketConn, _, err = Dialer.Dial(wsurl, http.Header{})
if err != nil {
log.Printf("%s Unable to connect to Websocket. Error: %s\n", b.Name, err)
continue
}
if b.Verbose {
log.Printf("%s Connected to Websocket.\n", b.Name)
}
for b.Enabled && b.Websocket {
msgType, resp, err := b.WebsocketConn.ReadMessage()
if err != nil {
log.Println(err)
break
}
switch msgType {
case websocket.TextMessage:
multiStreamData := MultiStreamData{}
err := common.JSONDecode(resp, &multiStreamData)
if err != nil {
log.Println("Could not load multi stream data.", string(resp))
continue
}
if strings.Contains(multiStreamData.Stream, "trade") {
trade := TradeStream{}
err := common.JSONDecode(multiStreamData.Data, &trade)
if err != nil {
log.Println("Could not convert to a TradeStream structure")
continue
}
log.Println("Trade received", trade.Symbol, trade.TimeStamp, trade.TradeID, trade.Price, trade.Quantity)
} else if strings.Contains(multiStreamData.Stream, "ticker") {
ticker := TickerStream{}
err := common.JSONDecode(multiStreamData.Data, &ticker)
if err != nil {
log.Println("Could not convert to a TickerStream structure")
continue
}
log.Println("Ticker received", ticker.Symbol, ticker.EventTime, ticker.TotalTradedVolume, ticker.LastTradeID)
} else if strings.Contains(multiStreamData.Stream, "kline") {
kline := KlineStream{}
err := common.JSONDecode(multiStreamData.Data, &kline)
if err != nil {
log.Println("Could not convert to a KlineStream structure")
continue
}
log.Println("Kline received", kline.Symbol, kline.EventTime, kline.Kline.HighPrice, kline.Kline.LowPrice)
}
type MsgType struct {
MessageType string `json:"messageType"`
}
}
}
b.WebsocketConn.Close()
log.Printf("%s Websocket client disconnected.", b.Name)
}
}