2021-05-25 18:11:02 +00:00
|
|
|
package okex
|
|
|
|
|
2021-05-25 19:04:49 +00:00
|
|
|
import (
|
2021-05-27 06:42:14 +00:00
|
|
|
"fmt"
|
2021-05-25 19:04:49 +00:00
|
|
|
"strings"
|
|
|
|
|
|
|
|
"github.com/c9s/bbgo/pkg/exchange/okex/okexapi"
|
|
|
|
"github.com/c9s/bbgo/pkg/types"
|
|
|
|
)
|
2021-05-25 18:11:02 +00:00
|
|
|
|
|
|
|
func toGlobalSymbol(symbol string) string {
|
|
|
|
return strings.ReplaceAll(symbol, "-", "")
|
|
|
|
}
|
2021-05-25 18:37:28 +00:00
|
|
|
|
2021-05-25 18:53:55 +00:00
|
|
|
////go:generate sh -c "echo \"package okex\nvar spotSymbolMap = map[string]string{\n\" $(curl -s -L 'https://okex.com/api/v5/public/instruments?instType=SPOT' | jq -r '.data[] | \"\\(.instId | sub(\"-\" ; \"\") | tojson ): \\( .instId | tojson),\n\"') \"\n}\" > symbols.go"
|
|
|
|
//go:generate go run gensymbols.go
|
2021-05-25 18:37:28 +00:00
|
|
|
func toLocalSymbol(symbol string) string {
|
2021-05-25 18:53:55 +00:00
|
|
|
if s, ok := spotSymbolMap[symbol]; ok {
|
2021-05-25 18:37:28 +00:00
|
|
|
return s
|
|
|
|
}
|
|
|
|
|
|
|
|
log.Errorf("failed to look up local symbol from %s", symbol)
|
|
|
|
return symbol
|
|
|
|
}
|
2021-05-25 19:04:49 +00:00
|
|
|
|
|
|
|
func toGlobalTicker(marketTicker okexapi.MarketTicker) *types.Ticker {
|
|
|
|
return &types.Ticker{
|
|
|
|
Time: marketTicker.Timestamp.Time(),
|
|
|
|
Volume: marketTicker.Volume24H.Float64(),
|
|
|
|
Last: marketTicker.Last.Float64(),
|
|
|
|
Open: marketTicker.Open24H.Float64(),
|
|
|
|
High: marketTicker.High24H.Float64(),
|
|
|
|
Low: marketTicker.Low24H.Float64(),
|
|
|
|
Buy: marketTicker.BidPrice.Float64(),
|
|
|
|
Sell: marketTicker.AskPrice.Float64(),
|
|
|
|
}
|
|
|
|
}
|
2021-05-26 16:24:16 +00:00
|
|
|
|
|
|
|
func toGlobalBalance(balanceSummaries []okexapi.BalanceSummary) types.BalanceMap {
|
|
|
|
var balanceMap = types.BalanceMap{}
|
|
|
|
for _, balanceSummary := range balanceSummaries {
|
|
|
|
for _, balanceDetail := range balanceSummary.Details {
|
|
|
|
balanceMap[balanceDetail.Currency] = types.Balance{
|
|
|
|
Currency: balanceDetail.Currency,
|
2021-05-26 17:07:25 +00:00
|
|
|
Available: balanceDetail.CashBalance,
|
2021-05-26 16:24:16 +00:00
|
|
|
Locked: balanceDetail.Frozen,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return balanceMap
|
|
|
|
}
|
2021-05-27 06:42:14 +00:00
|
|
|
|
|
|
|
type WebsocketSubscription struct {
|
|
|
|
Channel string `json:"channel"`
|
|
|
|
InstrumentID string `json:"instId"`
|
|
|
|
}
|
|
|
|
|
2021-05-27 09:40:24 +00:00
|
|
|
var CandleChannels = []string{
|
|
|
|
"candle1Y",
|
|
|
|
"candle6M", "candle3M", "candle1M",
|
|
|
|
"candle1W",
|
|
|
|
"candle1D", "candle2D", "candle3D", "candle5D",
|
|
|
|
"candle12H", "candle6H", "candle4H", "candle2H", "candle1H",
|
|
|
|
"candle30m", "candle15m", "candle5m", "candle3m", "candle1m",
|
|
|
|
}
|
|
|
|
|
|
|
|
func convertIntervalToCandle(interval string) string {
|
|
|
|
switch interval {
|
|
|
|
|
|
|
|
case "1h", "2h", "4h", "6h", "12h", "1d", "3d":
|
|
|
|
return "candle" + strings.ToUpper(interval)
|
|
|
|
|
|
|
|
case "1m", "5m", "15m", "30m":
|
|
|
|
return "candle" + interval
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return "candle" + interval
|
|
|
|
}
|
|
|
|
|
2021-05-27 06:42:14 +00:00
|
|
|
func convertSubscription(s types.Subscription) (WebsocketSubscription, error) {
|
|
|
|
// binance uses lower case symbol name,
|
|
|
|
// for kline, it's "<symbol>@kline_<interval>"
|
|
|
|
// for depth, it's "<symbol>@depth OR <symbol>@depth@100ms"
|
|
|
|
switch s.Channel {
|
|
|
|
case types.KLineChannel:
|
2021-05-27 09:40:24 +00:00
|
|
|
// Channel names are:
|
2021-05-27 06:42:14 +00:00
|
|
|
return WebsocketSubscription{
|
2021-05-27 09:40:24 +00:00
|
|
|
Channel: convertIntervalToCandle(s.Options.Interval),
|
2021-05-27 06:42:14 +00:00
|
|
|
InstrumentID: toLocalSymbol(s.Symbol),
|
|
|
|
}, nil
|
|
|
|
|
|
|
|
case types.BookChannel:
|
|
|
|
return WebsocketSubscription{
|
|
|
|
Channel: "books",
|
|
|
|
InstrumentID: toLocalSymbol(s.Symbol),
|
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
return WebsocketSubscription{}, fmt.Errorf("unsupported public stream channel %s", s.Channel)
|
|
|
|
}
|