tanya/okx/candleList.go
2025-03-07 22:34:49 +08:00

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
}