mirror of
https://github.com/NoFxAiOS/nofx.git
synced 2026-07-18 01:44:38 +08:00
feat: implement coinank free kline api and kline websocket (#1281)
- implement coinank free kline api in coinank_api.Kline - implement coinank free kline ws in coinank_api.KlineWs. if needKline is true, kline data read from KlineCh. if needTicker is true, tickers data read from TickersCh.
This commit is contained in:
79
provider/coinank/coinank_api/kline.go
Normal file
79
provider/coinank/coinank_api/kline.go
Normal file
@@ -0,0 +1,79 @@
|
||||
package coinank_api
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"nofx/provider/coinank"
|
||||
"nofx/provider/coinank/coinank_enum"
|
||||
"strconv"
|
||||
"time"
|
||||
)
|
||||
|
||||
const MainApiUrl = "https://api.coinank.com"
|
||||
|
||||
// Kline open free kline from coinank
|
||||
func Kline(ctx context.Context, symbol string, exchange coinank_enum.Exchange, ts int64, side coinank_enum.Side, size int,
|
||||
interval coinank_enum.Interval) ([]coinank.KlineResult, error) {
|
||||
paramsMap := make(map[string]string, 6)
|
||||
paramsMap["symbol"] = symbol
|
||||
paramsMap["exchange"] = string(exchange)
|
||||
paramsMap["side"] = string(side)
|
||||
paramsMap["size"] = strconv.Itoa(size)
|
||||
paramsMap["ts"] = strconv.FormatInt(ts, 10)
|
||||
paramsMap["interval"] = string(interval)
|
||||
resp, err := get(ctx, "/api/kline/list/open", paramsMap)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
var result coinank.CoinankResponse[[][]float64]
|
||||
err = json.Unmarshal([]byte(resp), &result)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if !result.Success {
|
||||
return nil, coinank.HttpError
|
||||
}
|
||||
klines := make([]coinank.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
|
||||
}
|
||||
|
||||
func get(ctx context.Context, path string, paramsMap map[string]string) (string, error) {
|
||||
data := url.Values{}
|
||||
for key, value := range paramsMap {
|
||||
data.Add(key, value)
|
||||
}
|
||||
fullURL := fmt.Sprintf("%s%s?%s", MainApiUrl, path, data.Encode())
|
||||
request, err := http.NewRequestWithContext(ctx, "GET", fullURL, nil)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
resp, err := client.Do(request)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
body, err := io.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return string(body), nil
|
||||
}
|
||||
|
||||
var client = &http.Client{
|
||||
Timeout: 30 * time.Second,
|
||||
}
|
||||
Reference in New Issue
Block a user