mirror of
https://github.com/NoFxAiOS/nofx.git
synced 2026-07-15 00:36:56 +08:00
feat: implement coinank openapi kline interface (#1275)
- implement kline interface
This commit is contained in:
63
provider/coinank/kline.go
Normal file
63
provider/coinank/kline.go
Normal file
@@ -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"`
|
||||||
|
}
|
||||||
22
provider/coinank/kline_test.go
Normal file
22
provider/coinank/kline_test.go
Normal file
@@ -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)
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user