mirror of
https://github.com/c9s/bbgo.git
synced 2024-11-24 07:45:15 +00:00
66 lines
1.4 KiB
Go
66 lines
1.4 KiB
Go
package csvsource
|
|
|
|
import (
|
|
"encoding/csv"
|
|
"io"
|
|
"time"
|
|
|
|
"github.com/c9s/bbgo/pkg/types"
|
|
)
|
|
|
|
var _ KLineReader = (*CSVKLineReader)(nil)
|
|
|
|
// CSVKLineReader is a KLineReader that reads from a CSV file.
|
|
type CSVKLineReader struct {
|
|
csv *csv.Reader
|
|
decoder CSVKLineDecoder
|
|
}
|
|
|
|
// MakeCSVKLineReader is a factory method type that creates a new CSVKLineReader.
|
|
type MakeCSVKLineReader func(csv *csv.Reader) *CSVKLineReader
|
|
|
|
// NewCSVKLineReader creates a new CSVKLineReader with the default Binance decoder.
|
|
func NewCSVKLineReader(csv *csv.Reader) *CSVKLineReader {
|
|
return &CSVKLineReader{
|
|
csv: csv,
|
|
decoder: BinanceCSVKLineDecoder,
|
|
}
|
|
}
|
|
|
|
// NewCSVKLineReaderWithDecoder creates a new CSVKLineReader with the given decoder.
|
|
func NewCSVKLineReaderWithDecoder(csv *csv.Reader, decoder CSVKLineDecoder) *CSVKLineReader {
|
|
return &CSVKLineReader{
|
|
csv: csv,
|
|
decoder: decoder,
|
|
}
|
|
}
|
|
|
|
// Read reads the next KLine from the underlying CSV data.
|
|
func (r *CSVKLineReader) Read(interval time.Duration) (types.KLine, error) {
|
|
var k types.KLine
|
|
|
|
rec, err := r.csv.Read()
|
|
if err != nil {
|
|
return k, err
|
|
}
|
|
|
|
return r.decoder(rec, interval)
|
|
}
|
|
|
|
// ReadAll reads all the KLines from the underlying CSV data.
|
|
func (r *CSVKLineReader) ReadAll(interval time.Duration) ([]types.KLine, error) {
|
|
var ks []types.KLine
|
|
for {
|
|
k, err := r.Read(interval)
|
|
if err == io.EOF {
|
|
break
|
|
}
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
ks = append(ks, k)
|
|
}
|
|
|
|
return ks, nil
|
|
}
|