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 }