diff --git a/provider/coinank/kline.go b/provider/coinank/kline.go new file mode 100644 index 00000000..68c60da0 --- /dev/null +++ b/provider/coinank/kline.go @@ -0,0 +1,63 @@ +package coinank + +import ( + "context" + "encoding/json" + "nofx/provider/coinank/coinank_enum" + "strconv" +) + +// Kline get kline data ,startTime and size is optional +func (c *CoinankClient) Kline(ctx context.Context, symbol string, exchange coinank_enum.Exchange, + startTime int64, endTime int64, + size int, interval coinank_enum.Interval) ([]KlineResult, error) { + paramsMap := make(map[string]string, 6) + paramsMap["symbol"] = symbol + paramsMap["exchange"] = string(exchange) + if startTime > 0 { + paramsMap["startTime"] = strconv.FormatInt(startTime, 10) + } + paramsMap["endTime"] = strconv.FormatInt(endTime, 10) + if size <= 0 { + size = 10 + } + paramsMap["size"] = strconv.Itoa(size) + paramsMap["interval"] = string(interval) + resp, err := c.Get(ctx, "/api/kline/lists", paramsMap) + if err != nil { + return nil, err + } + var result CoinankResponse[[][]float64] + err = json.Unmarshal([]byte(resp), &result) + if err != nil { + return nil, err + } + if !result.Success { + return nil, HttpError + } + klines := make([]KlineResult, len(result.Data)) + for i, k := range result.Data { + klines[i].StartTime = int64(k[0] + 0.001) + klines[i].EndTime = int64(k[1] + 0.001) + klines[i].Open = k[2] + klines[i].Close = k[3] + klines[i].High = k[4] + klines[i].Low = k[5] + klines[i].Volume = k[6] + klines[i].Quantity = k[7] + klines[i].Count = k[8] + } + return klines, nil +} + +type KlineResult struct { + StartTime int64 `json:"startTime"` + EndTime int64 `json:"endTime"` + Open float64 `json:"open"` + Close float64 `json:"close"` + High float64 `json:"high"` + Low float64 `json:"low"` + Volume float64 `json:"volume"` + Quantity float64 `json:"quantity"` + Count float64 `json:"count"` +} diff --git a/provider/coinank/kline_test.go b/provider/coinank/kline_test.go new file mode 100644 index 00000000..dff84aa2 --- /dev/null +++ b/provider/coinank/kline_test.go @@ -0,0 +1,22 @@ +package coinank + +import ( + "context" + "encoding/json" + "nofx/provider/coinank/coinank_enum" + "testing" + "time" +) + +func TestKline(t *testing.T) { + client := NewCoinankClient(coinank_enum.MainUrl, TestApikey) + resp, err := client.Kline(context.TODO(), "BTCUSDT", coinank_enum.Binance, 0, time.Now().UnixMilli(), 10, coinank_enum.Hour1) + if err != nil { + t.Error(err) + } + res, err := json.Marshal(resp) + if err != nil { + t.Error(err) + } + t.Logf("%s", res) +}