133 lines
3.2 KiB
Go
133 lines
3.2 KiB
Go
package okx
|
|
|
|
import (
|
|
"encoding/csv"
|
|
"encoding/json"
|
|
"fmt"
|
|
"strconv"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
// formatTimestamp 将毫秒时间戳字符串转换为可读格式
|
|
func formatTimestamp(ts string) (string, error) {
|
|
millis, err := strconv.ParseInt(ts, 10, 64)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
return time.UnixMilli(millis).Format("2006-01-02 15:04:05"), nil
|
|
}
|
|
|
|
// CandleList 封装Candle数组并提供序列化方法
|
|
type CandleList struct {
|
|
Candles []*Candle
|
|
}
|
|
|
|
func MakeCandleList(instId string, period string, startTime time.Time, endTime time.Time, blockSize int) (*CandleList, error) {
|
|
service := NewOkxPublicDataService()
|
|
var allCandles []*Candle
|
|
currentTime := endTime
|
|
|
|
for currentTime.After(startTime) || currentTime.Equal(startTime) {
|
|
req := CandlesRequest{
|
|
InstID: instId,
|
|
Bar: period,
|
|
After: strconv.FormatInt(currentTime.UnixMilli(), 10),
|
|
Limit: strconv.Itoa(blockSize),
|
|
}
|
|
candles, err := service.GetCandles(req)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if len(candles) == 0 {
|
|
break
|
|
}
|
|
allCandles = append(allCandles, candles...)
|
|
// 更新currentTime为最后一条数据的时间戳
|
|
lastCandleTime, _ := strconv.ParseInt(candles[len(candles)-1].Timestamp, 10, 64)
|
|
newCurrentTime := time.UnixMilli(lastCandleTime).Add(time.Millisecond)
|
|
currentTime = newCurrentTime
|
|
}
|
|
fmt.Println("lens of allCandles: ", len(allCandles))
|
|
cl := &CandleList{Candles: allCandles}
|
|
return cl, nil
|
|
}
|
|
|
|
// ToJson 将Candle数组序列化为JSON字符串
|
|
func (cl *CandleList) ToJson() (string, error) {
|
|
// 创建临时结构体用于格式化时间戳
|
|
type FormattedCandle struct {
|
|
Timestamp string `json:"timestamp"`
|
|
Open string `json:"open"`
|
|
High string `json:"high"`
|
|
Low string `json:"low"`
|
|
Close string `json:"close"`
|
|
Volume string `json:"volume"`
|
|
VolumeCcy string `json:"volumeCcy"`
|
|
}
|
|
|
|
var formattedCandles []FormattedCandle
|
|
for _, candle := range cl.Candles {
|
|
formattedTs, err := formatTimestamp(candle.Timestamp)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
formattedCandles = append(formattedCandles, FormattedCandle{
|
|
Timestamp: formattedTs,
|
|
Open: candle.Open,
|
|
High: candle.High,
|
|
Low: candle.Low,
|
|
Close: candle.Close,
|
|
Volume: candle.Volume,
|
|
VolumeCcy: candle.VolumeCcy,
|
|
})
|
|
}
|
|
|
|
jsonData, err := json.Marshal(formattedCandles)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
return string(jsonData), nil
|
|
}
|
|
|
|
// ToCsv 将Candle数组序列化为CSV字符串
|
|
func (cl *CandleList) ToCsv() (string, error) {
|
|
var sb strings.Builder
|
|
writer := csv.NewWriter(&sb)
|
|
|
|
// 写入CSV头
|
|
header := []string{"Timestamp", "Open", "High", "Low", "Close", "Volume", "VolumeCcy"}
|
|
if err := writer.Write(header); err != nil {
|
|
return "", err
|
|
}
|
|
|
|
// 调试信息
|
|
fmt.Printf("Number of candles: %d\n", len(cl.Candles))
|
|
|
|
for _, candle := range cl.Candles {
|
|
formattedTs, err := formatTimestamp(candle.Timestamp)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
record := []string{
|
|
formattedTs,
|
|
candle.Open,
|
|
candle.High,
|
|
candle.Low,
|
|
candle.Close,
|
|
candle.Volume,
|
|
candle.VolumeCcy,
|
|
}
|
|
if err := writer.Write(record); err != nil {
|
|
return "", err
|
|
}
|
|
}
|
|
|
|
writer.Flush()
|
|
if err := writer.Error(); err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return sb.String(), nil
|
|
}
|