diff --git a/README.md b/README.md index 73e35519..8e9495e4 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ A cryptocurrency trading bot supporting multiple exchanges written in Golang. | Exchange | REST API | Streaming API | FIX API | |----------|------|-----------|-----| -| Alphapoint | Yes | No | NA | +| Alphapoint | Yes | Yes | NA | | ANXPRO | Yes | No | NA | | Bitfinex | Yes | NA | NA | | Bitstamp | Yes | Yes | NA | diff --git a/alphapointhttp.go b/alphapointhttp.go index cc926d2a..13f17a9f 100644 --- a/alphapointhttp.go +++ b/alphapointhttp.go @@ -4,6 +4,7 @@ import ( "bytes" "errors" "fmt" + "github.com/gorilla/websocket" "log" "strconv" "time" @@ -33,6 +34,12 @@ const ( ) type Alphapoint struct { + WebsocketConn *websocket.Conn + WebsocketURL string + ExchangeName string + ExchangeEnanbled bool + WebsocketEnabled bool + Verbose bool APIUrl, APIKey, UserID, APISecret string } @@ -178,6 +185,7 @@ type AlphapointDepositAddresses struct { func (a *Alphapoint) SetDefaults() { a.APIUrl = ALPHAPOINT_DEFAULT_API_URL + a.WebsocketURL = ALPHAPOINT_DEFAULT_WEBSOCKET_URL } func (a *Alphapoint) GetTicker(symbol string) (AlphapointTicker, error) { diff --git a/alphapointwebsocket.go b/alphapointwebsocket.go new file mode 100644 index 00000000..e6e35cff --- /dev/null +++ b/alphapointwebsocket.go @@ -0,0 +1,87 @@ +package main + +import ( + "github.com/gorilla/websocket" + "log" + "net/http" +) + +const ( + ALPHAPOINT_DEFAULT_WEBSOCKET_URL = "wss://sim3.alphapoint.com:8401/v1/GetTicker/" +) + +type AlphapointWebsocketTicker struct { + MessageType string `json:"messageType"` + ProductPair string `json:"prodPair"` + High float64 `json:"high"` + Low float64 `json:"low"` + Last float64 `json:"last"` + Volume float64 `json:"volume"` + Volume24Hrs float64 `json:"volume24hrs"` + Volume24HrsProduct2 float64 `json:"volume24hrsProduct2"` + Total24HrQtyTraded float64 `json:"Total24HrQtyTraded"` + Total24HrProduct2Traded float64 `json:"Total24HrProduct2Traded"` + Total24HrNumTrades float64 `json:"Total24HrNumTrades"` + Bid float64 `json:"bid"` + Ask float64 `json:"ask"` + BuyOrderCount int `json:"buyOrderCount"` + SellOrderCount int `json:"sellOrderCount"` +} + +func (a *Alphapoint) WebsocketClient() { + for a.ExchangeEnanbled && a.WebsocketEnabled { + var Dialer websocket.Dialer + var err error + a.WebsocketConn, _, err = Dialer.Dial(a.WebsocketURL, http.Header{}) + + if err != nil { + log.Printf("%s Unable to connect to Websocket. Error: %s\n", a.ExchangeName, err) + continue + } + + if a.Verbose { + log.Printf("%s Connected to Websocket.\n", a.ExchangeName) + } + + err = a.WebsocketConn.WriteMessage(websocket.TextMessage, []byte(`{"messageType": "logon"}`)) + + if err != nil { + log.Println(err) + return + } + + for a.ExchangeEnanbled && a.WebsocketEnabled { + msgType, resp, err := a.WebsocketConn.ReadMessage() + if err != nil { + log.Println(err) + break + } + + switch msgType { + case websocket.TextMessage: + type MsgType struct { + MessageType string `json:"messageType"` + } + + msgType := MsgType{} + err := JSONDecode(resp, &msgType) + if err != nil { + log.Println(err) + continue + } + + switch msgType.MessageType { + case "Ticker": + ticker := AlphapointWebsocketTicker{} + err = JSONDecode(resp, &ticker) + if err != nil { + log.Println(err) + continue + } + } + } + } + a.WebsocketConn.Close() + log.Printf("%s Websocket client disconnected.", a.ExchangeName) + } +}