bbgo/pkg/exchange/kucoin/parse.go

105 lines
2.2 KiB
Go

package kucoin
import (
"encoding/json"
"strings"
"git.qtrade.icu/lychiyu/bbgo/pkg/types"
)
func parseWebSocketEvent(in []byte) (interface{}, error) {
var resp WebSocketEvent
var err = json.Unmarshal(in, &resp)
if err != nil {
return nil, err
}
switch resp.Type {
case WebSocketMessageTypeAck:
return &resp, nil
case WebSocketMessageTypeError:
resp.Object = string(resp.Data)
return &resp, nil
case WebSocketMessageTypeMessage:
switch resp.Subject {
case WebSocketSubjectOrderChange:
var o WebSocketPrivateOrderEvent
if err := json.Unmarshal(resp.Data, &o); err != nil {
return &resp, err
}
resp.Object = &o
case WebSocketSubjectAccountBalance:
var o WebSocketAccountBalanceEvent
if err := json.Unmarshal(resp.Data, &o); err != nil {
return &resp, err
}
resp.Object = &o
case WebSocketSubjectTradeCandlesUpdate, WebSocketSubjectTradeCandlesAdd:
var o WebSocketCandleEvent
if err := json.Unmarshal(resp.Data, &o); err != nil {
return &resp, err
}
o.Interval = extractIntervalFromTopic(resp.Topic)
o.Add = resp.Subject == WebSocketSubjectTradeCandlesAdd
resp.Object = &o
case WebSocketSubjectTradeL2Update:
var o WebSocketOrderBookL2Event
if err := json.Unmarshal(resp.Data, &o); err != nil {
return &resp, err
}
resp.Object = &o
case WebSocketSubjectTradeTicker:
var o WebSocketTickerEvent
if err := json.Unmarshal(resp.Data, &o); err != nil {
return &resp, err
}
resp.Object = &o
default:
// return nil, fmt.Errorf("kucoin: unsupported subject: %s", resp.Subject)
}
}
return &resp, nil
}
func extractIntervalFromTopic(topic string) types.Interval {
ta := strings.Split(topic, ":")
tb := strings.Split(ta[1], "_")
interval := tb[1]
return toGlobalInterval(interval)
}
func toGlobalInterval(a string) types.Interval {
switch a {
case "1min":
return types.Interval1m
case "5min":
return types.Interval5m
case "15min":
return types.Interval15m
case "30min":
return types.Interval30m
case "1hour":
return types.Interval1h
case "2hour":
return types.Interval2h
case "4hour":
return types.Interval4h
case "6hour":
return types.Interval6h
case "12hour":
return types.Interval12h
}
return ""
}