160 lines
5.7 KiB
Go
160 lines
5.7 KiB
Go
package kucoin
|
|
|
|
import (
|
|
"encoding/json"
|
|
"time"
|
|
|
|
"git.qtrade.icu/lychiyu/bbgo/pkg/fixedpoint"
|
|
"git.qtrade.icu/lychiyu/bbgo/pkg/types"
|
|
)
|
|
|
|
type WebSocketMessageType string
|
|
|
|
const (
|
|
WebSocketMessageTypePing WebSocketMessageType = "ping"
|
|
WebSocketMessageTypeSubscribe WebSocketMessageType = "subscribe"
|
|
WebSocketMessageTypeUnsubscribe WebSocketMessageType = "unsubscribe"
|
|
WebSocketMessageTypeAck WebSocketMessageType = "ack"
|
|
WebSocketMessageTypeError WebSocketMessageType = "error"
|
|
WebSocketMessageTypePong WebSocketMessageType = "pong"
|
|
WebSocketMessageTypeWelcome WebSocketMessageType = "welcome"
|
|
WebSocketMessageTypeMessage WebSocketMessageType = "message"
|
|
)
|
|
|
|
type WebSocketSubject string
|
|
|
|
const (
|
|
WebSocketSubjectTradeTicker WebSocketSubject = "trade.ticker"
|
|
WebSocketSubjectTradeSnapshot WebSocketSubject = "trade.snapshot" // ticker snapshot
|
|
WebSocketSubjectTradeL2Update WebSocketSubject = "trade.l2update" // order book L2
|
|
WebSocketSubjectLevel2 WebSocketSubject = "level2" // level2
|
|
WebSocketSubjectTradeCandlesUpdate WebSocketSubject = "trade.candles.update"
|
|
WebSocketSubjectTradeCandlesAdd WebSocketSubject = "trade.candles.add"
|
|
|
|
// private subjects
|
|
WebSocketSubjectOrderChange WebSocketSubject = "orderChange"
|
|
WebSocketSubjectAccountBalance WebSocketSubject = "account.balance"
|
|
WebSocketSubjectStopOrder WebSocketSubject = "stopOrder"
|
|
)
|
|
|
|
type WebSocketCommand struct {
|
|
Id int64 `json:"id"`
|
|
Type WebSocketMessageType `json:"type"`
|
|
Topic string `json:"topic"`
|
|
PrivateChannel bool `json:"privateChannel"`
|
|
Response bool `json:"response"`
|
|
}
|
|
|
|
func (c *WebSocketCommand) JSON() ([]byte, error) {
|
|
type tt WebSocketCommand
|
|
var a = (*tt)(c)
|
|
return json.Marshal(a)
|
|
}
|
|
|
|
type WebSocketEvent struct {
|
|
Type WebSocketMessageType `json:"type"`
|
|
Topic string `json:"topic"`
|
|
Subject WebSocketSubject `json:"subject"`
|
|
Data json.RawMessage `json:"data"`
|
|
Code int `json:"code"` // used in type error
|
|
|
|
// Object is used for storing the parsed Data
|
|
Object interface{} `json:"-"`
|
|
}
|
|
|
|
type WebSocketTickerEvent struct {
|
|
Sequence string `json:"sequence"`
|
|
Price fixedpoint.Value `json:"price"`
|
|
Size fixedpoint.Value `json:"size"`
|
|
BestAsk fixedpoint.Value `json:"bestAsk"`
|
|
BestAskSize fixedpoint.Value `json:"bestAskSize"`
|
|
BestBid fixedpoint.Value `json:"bestBid"`
|
|
BestBidSize fixedpoint.Value `json:"bestBidSize"`
|
|
}
|
|
|
|
type WebSocketOrderBookL2Event struct {
|
|
SequenceStart int64 `json:"sequenceStart"`
|
|
SequenceEnd int64 `json:"sequenceEnd"`
|
|
Symbol string `json:"symbol"`
|
|
Changes struct {
|
|
Asks types.PriceVolumeSlice `json:"asks"`
|
|
Bids types.PriceVolumeSlice `json:"bids"`
|
|
} `json:"changes"`
|
|
Time types.MillisecondTimestamp `json:"time"`
|
|
}
|
|
|
|
type WebSocketCandleEvent struct {
|
|
Symbol string `json:"symbol"`
|
|
Candles []string `json:"candles"`
|
|
Time types.MillisecondTimestamp `json:"time"`
|
|
|
|
// Interval is an injected field (not from the payload)
|
|
Interval types.Interval
|
|
|
|
// Is a new candle or not
|
|
Add bool
|
|
}
|
|
|
|
func (e *WebSocketCandleEvent) KLine() types.KLine {
|
|
startTime := types.MustParseUnixTimestamp(e.Candles[0])
|
|
openPrice := fixedpoint.MustNewFromString(e.Candles[1])
|
|
closePrice := fixedpoint.MustNewFromString(e.Candles[2])
|
|
highPrice := fixedpoint.MustNewFromString(e.Candles[3])
|
|
lowPrice := fixedpoint.MustNewFromString(e.Candles[4])
|
|
volume := fixedpoint.MustNewFromString(e.Candles[5])
|
|
quoteVolume := fixedpoint.MustNewFromString(e.Candles[6])
|
|
kline := types.KLine{
|
|
Exchange: types.ExchangeKucoin,
|
|
Symbol: toGlobalSymbol(e.Symbol),
|
|
StartTime: types.Time(startTime),
|
|
EndTime: types.Time(startTime.Add(e.Interval.Duration() - time.Millisecond)),
|
|
Interval: e.Interval,
|
|
Open: openPrice,
|
|
Close: closePrice,
|
|
High: highPrice,
|
|
Low: lowPrice,
|
|
Volume: volume,
|
|
QuoteVolume: quoteVolume,
|
|
Closed: false,
|
|
}
|
|
return kline
|
|
}
|
|
|
|
type WebSocketPrivateOrderEvent struct {
|
|
OrderId string `json:"orderId"`
|
|
TradeId string `json:"tradeId"`
|
|
Symbol string `json:"symbol"`
|
|
OrderType string `json:"orderType"`
|
|
Side string `json:"side"`
|
|
Type string `json:"type"`
|
|
OrderTime types.NanosecondTimestamp `json:"orderTime"`
|
|
Price fixedpoint.Value `json:"price"`
|
|
Size fixedpoint.Value `json:"size"`
|
|
FilledSize fixedpoint.Value `json:"filledSize"`
|
|
RemainSize fixedpoint.Value `json:"remainSize"`
|
|
|
|
Liquidity string `json:"liquidity"`
|
|
MatchPrice fixedpoint.Value `json:"matchPrice"`
|
|
MatchSize fixedpoint.Value `json:"matchSize"`
|
|
ClientOid string `json:"clientOid"`
|
|
Status string `json:"status"`
|
|
Ts types.MillisecondTimestamp `json:"ts"`
|
|
}
|
|
|
|
type WebSocketAccountBalanceEvent struct {
|
|
Total fixedpoint.Value `json:"total"`
|
|
Available fixedpoint.Value `json:"available"`
|
|
AvailableChange fixedpoint.Value `json:"availableChange"`
|
|
Currency string `json:"currency"`
|
|
Hold fixedpoint.Value `json:"hold"`
|
|
HoldChange fixedpoint.Value `json:"holdChange"`
|
|
RelationEvent string `json:"relationEvent"`
|
|
RelationEventId string `json:"relationEventId"`
|
|
RelationContext struct {
|
|
Symbol string `json:"symbol"`
|
|
TradeId string `json:"tradeId"`
|
|
OrderId string `json:"orderId"`
|
|
} `json:"relationContext"`
|
|
Time string `json:"time"`
|
|
}
|