You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
122 lines
3.3 KiB
122 lines
3.3 KiB
package bawssclient
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"github.com/shopspring/decimal"
|
|
"strings"
|
|
"wss-pool/logging/applogger"
|
|
"wss-pool/pkg/client/bawebsocketclientbase"
|
|
"wss-pool/pkg/model/market"
|
|
)
|
|
|
|
type BaTickerResponse struct {
|
|
E string `json:"e"`
|
|
Es int64 `json:"e"`
|
|
S string `json:"s"`
|
|
P string `json:"p"`
|
|
Ps string `json:"P"`
|
|
W string `json:"w"`
|
|
X string `json:"x"`
|
|
C string `json:"c"`
|
|
Qs string `json:"Q"`
|
|
B string `json:"b"`
|
|
Bs string `json:"B"`
|
|
A string `json:"a"`
|
|
As string `json:"A"`
|
|
O string `json:"o"`
|
|
H string `json:"h"`
|
|
L string `json:"l"`
|
|
V string `json:"v"`
|
|
Q string `json:"q"`
|
|
Os int64 `json:"O"`
|
|
Cs int64 `json:"c"`
|
|
F int64 `json:"f"`
|
|
Ls int64 `json:"L"`
|
|
N int `json:"n"`
|
|
}
|
|
|
|
// Responsible to handle Ticker data from WebSocket
|
|
type TickerWebSocketClient struct {
|
|
bawebsocketclientbase.WebSocketClientBase
|
|
}
|
|
|
|
// Initializer
|
|
func (p *TickerWebSocketClient) Init(host string) *TickerWebSocketClient {
|
|
p.WebSocketClientBase.Init(host)
|
|
return p
|
|
}
|
|
|
|
// Set callback handler
|
|
func (p *TickerWebSocketClient) SetHandler(
|
|
connectedHandler bawebsocketclientbase.ConnectedHandler,
|
|
responseHandler bawebsocketclientbase.ResponseHandler) {
|
|
p.WebSocketClientBase.SetHandler(connectedHandler, p.handleMessage, responseHandler)
|
|
}
|
|
|
|
// Request the full Ticker data according to specified criteria
|
|
|
|
// Subscribe Ticker data
|
|
func (p *TickerWebSocketClient) Subscribe(symbol string) {
|
|
topis := make([]string, 0)
|
|
sub := BaKLineParam{
|
|
Method: "SUBSCRIBE",
|
|
Params: append(topis, fmt.Sprintf("%susdt@ticker", symbol)),
|
|
ID: bawebsocketclientbase.Randomnumber(),
|
|
}
|
|
data, _ := json.Marshal(sub)
|
|
p.Send(data)
|
|
|
|
applogger.Info("WebSocket subscribed, clientId=%s", sub.ID)
|
|
}
|
|
|
|
// Unsubscribe Ticker data
|
|
func (p *TickerWebSocketClient) UnSubscribe(symbol string) {
|
|
topis := make([]string, 0)
|
|
sub := BaKLineParam{
|
|
Method: "UNSUBSCRIBE",
|
|
Params: append(topis, fmt.Sprintf("%susdt@ticker", symbol)),
|
|
ID: bawebsocketclientbase.Randomnumber(),
|
|
}
|
|
data, _ := json.Marshal(sub)
|
|
p.Send(data)
|
|
|
|
applogger.Info("WebSocket unsubscribed, clientId=%s", sub.ID)
|
|
}
|
|
|
|
func (p *TickerWebSocketClient) handleMessage(msg string) (interface{}, error) {
|
|
baRes := BaTickerResponse{}
|
|
err := json.Unmarshal([]byte(msg), &baRes)
|
|
//转火币数据结构
|
|
amount, _ := decimal.NewFromString(baRes.V)
|
|
open, _ := decimal.NewFromString(baRes.X) // 整整24小时之前,向前数的最后一次成交价格
|
|
close, _ := decimal.NewFromString(baRes.C)
|
|
low, _ := decimal.NewFromString(baRes.L)
|
|
high, _ := decimal.NewFromString(baRes.H)
|
|
Bid, _ := decimal.NewFromString(baRes.B)
|
|
BidSize, _ := decimal.NewFromString(baRes.Bs)
|
|
Ask, _ := decimal.NewFromString(baRes.A)
|
|
AskSize, _ := decimal.NewFromString(baRes.As)
|
|
LastPrice, _ := decimal.NewFromString(baRes.C)
|
|
LastSize, _ := decimal.NewFromString(baRes.Qs)
|
|
result := market.TickerWebsocketResponse{
|
|
Channel: fmt.Sprintf("market.%s.ticker", strings.ToLower(baRes.S)),
|
|
Timestamp: baRes.Es,
|
|
Tick: &market.TickR{
|
|
Open: open,
|
|
High: high,
|
|
Low: low,
|
|
Close: close,
|
|
Amount: amount,
|
|
Count: baRes.N,
|
|
Bid: Bid,
|
|
BidSize: BidSize,
|
|
Ask: Ask,
|
|
AskSize: AskSize,
|
|
LastPrice: LastPrice,
|
|
LastSize: LastSize,
|
|
IsBa: bawebsocketclientbase.BinAnce,
|
|
},
|
|
}
|
|
return result, err
|
|
}
|
|
|