diff --git a/asset/README.md b/asset/README.md
index 7f6025c4..a423ca7b 100644
--- a/asset/README.md
+++ b/asset/README.md
@@ -34,7 +34,7 @@ The information provided on this project is strictly for informational purposes
- [func SnapshotsAsOpenings\(snapshots \<\-chan \*Snapshot\) \<\-chan float64](<#SnapshotsAsOpenings>)
- [func SnapshotsAsVolumes\(snapshots \<\-chan \*Snapshot\) \<\-chan float64](<#SnapshotsAsVolumes>)
- [type FileSystemRepository](<#FileSystemRepository>)
- - [func NewFileSystemRepository\(base string\) \*FileSystemRepository](<#NewFileSystemRepository>)
+ - [func NewFileSystemRepository\(base string, csvOptions ...helper.CsvOption\[Snapshot\]\) \*FileSystemRepository](<#NewFileSystemRepository>)
- [func \(r \*FileSystemRepository\) Append\(name string, snapshots \<\-chan \*Snapshot\) error](<#FileSystemRepository.Append>)
- [func \(r \*FileSystemRepository\) Assets\(\) \(\[\]string, error\)](<#FileSystemRepository.Assets>)
- [func \(r \*FileSystemRepository\) Get\(name string\) \(\<\-chan \*Snapshot, error\)](<#FileSystemRepository.Get>)
@@ -183,7 +183,7 @@ func SnapshotsAsVolumes(snapshots <-chan *Snapshot) <-chan float64
SnapshotsAsVolumes extracts the volume field from each snapshot in the provided channel and returns a new channel containing only those volume values.The original snapshots channel can no longer be directly used afterward.
-## type [FileSystemRepository]()
+## type [FileSystemRepository]()
FileSystemRepository stores and retrieves asset snapshots using the local file system.
@@ -194,16 +194,16 @@ type FileSystemRepository struct {
```
-### func [NewFileSystemRepository]()
+### func [NewFileSystemRepository]()
```go
-func NewFileSystemRepository(base string) *FileSystemRepository
+func NewFileSystemRepository(base string, csvOptions ...helper.CsvOption[Snapshot]) *FileSystemRepository
```
-NewFileSystemRepository initializes a file system repository with the given base directory.
+NewFileSystemRepository initializes a file system repository with the given base directory and the CSV options.
-### func \(\*FileSystemRepository\) [Append]()
+### func \(\*FileSystemRepository\) [Append]()
```go
func (r *FileSystemRepository) Append(name string, snapshots <-chan *Snapshot) error
@@ -212,7 +212,7 @@ func (r *FileSystemRepository) Append(name string, snapshots <-chan *Snapshot) e
Append adds the given snapshows to the asset with the given name.
-### func \(\*FileSystemRepository\) [Assets]()
+### func \(\*FileSystemRepository\) [Assets]()
```go
func (r *FileSystemRepository) Assets() ([]string, error)
@@ -221,7 +221,7 @@ func (r *FileSystemRepository) Assets() ([]string, error)
Assets returns the names of all assets in the repository.
-### func \(\*FileSystemRepository\) [Get]()
+### func \(\*FileSystemRepository\) [Get]()
```go
func (r *FileSystemRepository) Get(name string) (<-chan *Snapshot, error)
@@ -230,7 +230,7 @@ func (r *FileSystemRepository) Get(name string) (<-chan *Snapshot, error)
Get attempts to return a channel of snapshots for the asset with the given name.
-### func \(\*FileSystemRepository\) [GetSince]()
+### func \(\*FileSystemRepository\) [GetSince]()
```go
func (r *FileSystemRepository) GetSince(name string, date time.Time) (<-chan *Snapshot, error)
@@ -239,7 +239,7 @@ func (r *FileSystemRepository) GetSince(name string, date time.Time) (<-chan *Sn
GetSince attempts to return a channel of snapshots for the asset with the given name since the given date.
-### func \(\*FileSystemRepository\) [LastDate]()
+### func \(\*FileSystemRepository\) [LastDate]()
```go
func (r *FileSystemRepository) LastDate(name string) (time.Time, error)
@@ -476,7 +476,7 @@ Snapshot captures a single observation of an asset's price at a specific moment.
```go
type Snapshot struct {
// Date represents the specific timestamp.
- Date time.Time `format:"2006-01-02"`
+ Date time.Time
// Open represents the opening price for the
// snapshot period.
diff --git a/asset/file_system_repository.go b/asset/file_system_repository.go
index 2142541f..5ff05a77 100644
--- a/asset/file_system_repository.go
+++ b/asset/file_system_repository.go
@@ -20,13 +20,17 @@ import (
type FileSystemRepository struct {
// base is the root directory where asset snapshots are stored.
base string
+
+ // csvOptions are the CSV options used for reading and writing snapshots.
+ csvOptions []helper.CsvOption[Snapshot]
}
// NewFileSystemRepository initializes a file system repository with
-// the given base directory.
-func NewFileSystemRepository(base string) *FileSystemRepository {
+// the given base directory and the CSV options.
+func NewFileSystemRepository(base string, csvOptions ...helper.CsvOption[Snapshot]) *FileSystemRepository {
return &FileSystemRepository{
- base: base,
+ base: base,
+ csvOptions: csvOptions,
}
}
@@ -54,7 +58,7 @@ func (r *FileSystemRepository) Assets() ([]string, error) {
// Get attempts to return a channel of snapshots for the asset with the given name.
func (r *FileSystemRepository) Get(name string) (<-chan *Snapshot, error) {
- return helper.ReadFromCsvFile[Snapshot](r.getCsvFileName(name), true)
+ return helper.ReadFromCsvFile[Snapshot](r.getCsvFileName(name), r.csvOptions...)
}
// GetSince attempts to return a channel of snapshots for the asset with the given name since the given date.
@@ -90,7 +94,7 @@ func (r *FileSystemRepository) LastDate(name string) (time.Time, error) {
// Append adds the given snapshows to the asset with the given name.
func (r *FileSystemRepository) Append(name string, snapshots <-chan *Snapshot) error {
- return helper.AppendOrWriteToCsvFile(r.getCsvFileName(name), true, snapshots)
+ return helper.AppendOrWriteToCsvFile(r.getCsvFileName(name), snapshots, r.csvOptions...)
}
// getCsvFileName gets the CSV file name for the given asset name.
diff --git a/asset/file_system_repository_test.go b/asset/file_system_repository_test.go
index a8f5f5a7..b6eac863 100644
--- a/asset/file_system_repository_test.go
+++ b/asset/file_system_repository_test.go
@@ -69,7 +69,7 @@ func TestFileSystemRepositoryGetSince(t *testing.T) {
t.Fatal(err)
}
- expected, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/since.csv", true)
+ expected, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/since.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/asset/snapshot.go b/asset/snapshot.go
index 30fa79e8..5a11a567 100644
--- a/asset/snapshot.go
+++ b/asset/snapshot.go
@@ -14,7 +14,7 @@ import (
// at a specific moment.
type Snapshot struct {
// Date represents the specific timestamp.
- Date time.Time `format:"2006-01-02"`
+ Date time.Time
// Open represents the opening price for the
// snapshot period.
diff --git a/asset/snapshot_test.go b/asset/snapshot_test.go
index afc9650a..42a09d1d 100644
--- a/asset/snapshot_test.go
+++ b/asset/snapshot_test.go
@@ -12,7 +12,7 @@ import (
)
func TestSnapshotsAs(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/repository/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/repository/brk-b.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/helper/README.md b/helper/README.md
index 0e6ff705..e426892e 100644
--- a/helper/README.md
+++ b/helper/README.md
@@ -27,7 +27,7 @@ The information provided on this project is strictly for informational purposes
- [Constants](<#constants>)
- [func Abs\[T Number\]\(c \<\-chan T\) \<\-chan T](<#Abs>)
- [func Add\[T Number\]\(ac, bc \<\-chan T\) \<\-chan T](<#Add>)
-- [func AppendOrWriteToCsvFile\[T any\]\(fileName string, hasHeader bool, rows \<\-chan \*T\) error](<#AppendOrWriteToCsvFile>)
+- [func AppendOrWriteToCsvFile\[T any\]\(fileName string, rows \<\-chan \*T, options ...CsvOption\[T\]\) error](<#AppendOrWriteToCsvFile>)
- [func Apply\[T Number\]\(c \<\-chan T, f func\(T\) T\) \<\-chan T](<#Apply>)
- [func Buffered\[T any\]\(c \<\-chan T, size int\) \<\-chan T](<#Buffered>)
- [func ChanToJSON\[T any\]\(c \<\-chan T, w io.Writer\) error](<#ChanToJSON>)
@@ -69,7 +69,7 @@ The information provided on this project is strictly for informational purposes
- [func Operate3\[A any, B any, C any, R any\]\(ac \<\-chan A, bc \<\-chan B, cc \<\-chan C, o func\(A, B, C\) R\) \<\-chan R](<#Operate3>)
- [func Pipe\[T any\]\(f \<\-chan T, t chan\<\- T\)](<#Pipe>)
- [func Pow\[T Number\]\(c \<\-chan T, y T\) \<\-chan T](<#Pow>)
-- [func ReadFromCsvFile\[T any\]\(fileName string, hasHeader bool\) \(\<\-chan \*T, error\)](<#ReadFromCsvFile>)
+- [func ReadFromCsvFile\[T any\]\(fileName string, options ...CsvOption\[T\]\) \(\<\-chan \*T, error\)](<#ReadFromCsvFile>)
- [func Remove\(t \*testing.T, name string\)](<#Remove>)
- [func RemoveAll\(t \*testing.T, path string\)](<#RemoveAll>)
- [func RoundDigit\[T Number\]\(n T, d int\) T](<#RoundDigit>)
@@ -93,11 +93,15 @@ The information provided on this project is strictly for informational purposes
- [func \(b \*Bst\[T\]\) Remove\(value T\) bool](<#Bst[T].Remove>)
- [type BstNode](<#BstNode>)
- [type Csv](<#Csv>)
- - [func NewCsv\[T any\]\(hasHeader bool\) \(\*Csv\[T\], error\)](<#NewCsv>)
+ - [func NewCsv\[T any\]\(options ...CsvOption\[T\]\) \(\*Csv\[T\], error\)](<#NewCsv>)
- [func \(c \*Csv\[T\]\) AppendToFile\(fileName string, rows \<\-chan \*T\) error](<#Csv[T].AppendToFile>)
- [func \(c \*Csv\[T\]\) ReadFromFile\(fileName string\) \(\<\-chan \*T, error\)](<#Csv[T].ReadFromFile>)
- [func \(c \*Csv\[T\]\) ReadFromReader\(reader io.Reader\) \<\-chan \*T](<#Csv[T].ReadFromReader>)
- [func \(c \*Csv\[T\]\) WriteToFile\(fileName string, rows \<\-chan \*T\) error](<#Csv[T].WriteToFile>)
+- [type CsvOption](<#CsvOption>)
+ - [func WithCsvDefaultDateTimeFormat\[T any\]\(format string\) CsvOption\[T\]](<#WithCsvDefaultDateTimeFormat>)
+ - [func WithCsvLogger\[T any\]\(logger \*slog.Logger\) CsvOption\[T\]](<#WithCsvLogger>)
+ - [func WithoutCsvHeader\[T any\]\(\) CsvOption\[T\]](<#WithoutCsvHeader>)
- [type Float](<#Float>)
- [type Integer](<#Integer>)
- [type Number](<#Number>)
@@ -132,7 +136,7 @@ const (
CsvFormatTag = "format"
// DefaultDateTimeFormat denotes the default format of a date and time column.
- DefaultDateTimeFormat = "2006-01-02 15:04:05"
+ DefaultDateTimeFormat = "2006-01-02"
)
```
@@ -182,10 +186,10 @@ fmt.Println(actual) // [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
```
-## func [AppendOrWriteToCsvFile]()
+## func [AppendOrWriteToCsvFile]()
```go
-func AppendOrWriteToCsvFile[T any](fileName string, hasHeader bool, rows <-chan *T) error
+func AppendOrWriteToCsvFile[T any](fileName string, rows <-chan *T, options ...CsvOption[T]) error
```
AppendOrWriteToCsvFile writes the provided rows of data to the specified file, appending to the existing file if it exists or creating a new one if it doesn't. In append mode, the function assumes that the existing file's column order matches the field order of the given row struct to ensure consistent data structure.
@@ -805,10 +809,10 @@ fmt.Println(helper.ChanToSlice(squared)) // [4, 9, 25, 100]
```
-## func [ReadFromCsvFile]()
+## func [ReadFromCsvFile]()
```go
-func ReadFromCsvFile[T any](fileName string, hasHeader bool) (<-chan *T, error)
+func ReadFromCsvFile[T any](fileName string, options ...CsvOption[T]) (<-chan *T, error)
```
ReadFromCsvFile creates a CSV instance, parses CSV data from the provided filename, maps the data to corresponding struct fields, and delivers it through the channel.
@@ -1095,7 +1099,7 @@ type BstNode[T Number] struct {
```
-## type [Csv]()
+## type [Csv]()
Csv represents the configuration for CSV reader and writer.
@@ -1109,16 +1113,16 @@ type Csv[T any] struct {
```
-### func [NewCsv]()
+### func [NewCsv]()
```go
-func NewCsv[T any](hasHeader bool) (*Csv[T], error)
+func NewCsv[T any](options ...CsvOption[T]) (*Csv[T], error)
```
-NewCsv function initializes a new CSV instance. The parameter hasHeader indicates whether the CSV contains a header row.
+NewCsv creates a new CSV instance with the provided options.
-### func \(\*Csv\[T\]\) [AppendToFile]()
+### func \(\*Csv\[T\]\) [AppendToFile]()
```go
func (c *Csv[T]) AppendToFile(fileName string, rows <-chan *T) error
@@ -1127,7 +1131,7 @@ func (c *Csv[T]) AppendToFile(fileName string, rows <-chan *T) error
AppendToFile appends the provided rows of data to the end of the specified file, creating the file if it doesn't exist. In append mode, the function assumes that the existing file's column order matches the field order of the given row struct to ensure consistent data structure.
-### func \(\*Csv\[T\]\) [ReadFromFile]()
+### func \(\*Csv\[T\]\) [ReadFromFile]()
```go
func (c *Csv[T]) ReadFromFile(fileName string) (<-chan *T, error)
@@ -1136,7 +1140,7 @@ func (c *Csv[T]) ReadFromFile(fileName string) (<-chan *T, error)
ReadFromFile parses the CSV data from the provided file name, maps the data to corresponding struct fields, and delivers the resulting rows through the channel.
-### func \(\*Csv\[T\]\) [ReadFromReader]()
+### func \(\*Csv\[T\]\) [ReadFromReader]()
```go
func (c *Csv[T]) ReadFromReader(reader io.Reader) <-chan *T
@@ -1145,7 +1149,7 @@ func (c *Csv[T]) ReadFromReader(reader io.Reader) <-chan *T
ReadFromReader parses the CSV data from the provided reader, maps the data to corresponding struct fields, and delivers the resulting it through the channel.
-### func \(\*Csv\[T\]\) [WriteToFile]()
+### func \(\*Csv\[T\]\) [WriteToFile]()
```go
func (c *Csv[T]) WriteToFile(fileName string, rows <-chan *T) error
@@ -1153,6 +1157,42 @@ func (c *Csv[T]) WriteToFile(fileName string, rows <-chan *T) error
WriteToFile creates a new file with the given name and writes the provided rows of data to it, overwriting any existing content.
+
+## type [CsvOption]()
+
+CsvOption represents a functional option for configuring the CSV instance.
+
+```go
+type CsvOption[T any] func(*Csv[T])
+```
+
+
+### func [WithCsvDefaultDateTimeFormat]()
+
+```go
+func WithCsvDefaultDateTimeFormat[T any](format string) CsvOption[T]
+```
+
+WithCsvDefaultDateTimeFormat sets the default date and time format for the CSV instance.
+
+
+### func [WithCsvLogger]()
+
+```go
+func WithCsvLogger[T any](logger *slog.Logger) CsvOption[T]
+```
+
+WithCsvLogger sets the logger for the CSV instance.
+
+
+### func [WithoutCsvHeader]()
+
+```go
+func WithoutCsvHeader[T any]() CsvOption[T]
+```
+
+WithoutCsvHeader disables the header row in the CSV.
+
## type [Float]()
diff --git a/helper/csv.go b/helper/csv.go
index f37a1810..4d17301a 100644
--- a/helper/csv.go
+++ b/helper/csv.go
@@ -24,7 +24,7 @@ const (
CsvFormatTag = "format"
// DefaultDateTimeFormat denotes the default format of a date and time column.
- DefaultDateTimeFormat = "2006-01-02 15:04:05"
+ DefaultDateTimeFormat = "2006-01-02"
)
// csvColumn represents the mapping between the CSV column and
@@ -47,14 +47,46 @@ type Csv[T any] struct {
// Logger is the slog logger instance.
Logger *slog.Logger
+
+ // defaultDateTimeFormat is the default format for date and time columns.
+ defaultDateTimeFormat string
}
-// NewCsv function initializes a new CSV instance. The parameter
-// hasHeader indicates whether the CSV contains a header row.
-func NewCsv[T any](hasHeader bool) (*Csv[T], error) {
+// CsvOption represents a functional option for configuring the CSV instance.
+type CsvOption[T any] func(*Csv[T])
+
+// WithoutCsvHeader disables the header row in the CSV.
+func WithoutCsvHeader[T any]() CsvOption[T] {
+ return func(c *Csv[T]) {
+ c.hasHeader = false
+ }
+}
+
+// WithCsvLogger sets the logger for the CSV instance.
+func WithCsvLogger[T any](logger *slog.Logger) CsvOption[T] {
+ return func(c *Csv[T]) {
+ c.Logger = logger
+ }
+}
+
+// WithCsvDefaultDateTimeFormat sets the default date and time format for the CSV instance.
+func WithCsvDefaultDateTimeFormat[T any](format string) CsvOption[T] {
+ return func(c *Csv[T]) {
+ c.defaultDateTimeFormat = format
+ }
+}
+
+// NewCsv creates a new CSV instance with the provided options.
+func NewCsv[T any](options ...CsvOption[T]) (*Csv[T], error) {
c := &Csv[T]{
- hasHeader: hasHeader,
- Logger: slog.Default(),
+ hasHeader: true,
+ Logger: slog.Default(),
+ defaultDateTimeFormat: DefaultDateTimeFormat,
+ }
+
+ // Apply options to the CSV instance.
+ for _, option := range options {
+ option(c)
}
// Row type must be a pointer to struct.
@@ -75,7 +107,7 @@ func NewCsv[T any](hasHeader bool) (*Csv[T], error) {
format, ok := field.Tag.Lookup(CsvFormatTag)
if !ok {
- format = DefaultDateTimeFormat
+ format = c.defaultDateTimeFormat
}
c.columns[i] = csvColumn{
@@ -275,8 +307,8 @@ func (c *Csv[T]) writeHeaderToCsvWriter(csvWriter *csv.Writer) error {
// ReadFromCsvFile creates a CSV instance, parses CSV data from the provided filename,
// maps the data to corresponding struct fields, and delivers it through the channel.
-func ReadFromCsvFile[T any](fileName string, hasHeader bool) (<-chan *T, error) {
- c, err := NewCsv[T](hasHeader)
+func ReadFromCsvFile[T any](fileName string, options ...CsvOption[T]) (<-chan *T, error) {
+ c, err := NewCsv[T](options...)
if err != nil {
return nil, err
}
@@ -288,8 +320,8 @@ func ReadFromCsvFile[T any](fileName string, hasHeader bool) (<-chan *T, error)
// the existing file if it exists or creating a new one if it doesn't. In append mode, the
// function assumes that the existing file's column order matches the field order of the
// given row struct to ensure consistent data structure.
-func AppendOrWriteToCsvFile[T any](fileName string, hasHeader bool, rows <-chan *T) error {
- c, err := NewCsv[T](hasHeader)
+func AppendOrWriteToCsvFile[T any](fileName string, rows <-chan *T, options ...CsvOption[T]) error {
+ c, err := NewCsv[T](options...)
if err != nil {
return err
}
diff --git a/helper/csv_test.go b/helper/csv_test.go
index 612c188f..2b64f928 100644
--- a/helper/csv_test.go
+++ b/helper/csv_test.go
@@ -8,6 +8,7 @@ import (
"fmt"
"strings"
"testing"
+ "time"
"github.com/cinar/indicator/v2/helper"
)
@@ -20,7 +21,7 @@ func TestCsv(t *testing.T) {
reader := strings.NewReader("Date,Asset,Open,Close\n\"2023-11-26 00:00:00\",\"SP500\",10.2,30.4\n")
- csv, err := helper.NewCsv[Row](true)
+ csv, err := helper.NewCsv[Row]()
if err != nil {
t.Fatal(err)
}
@@ -40,7 +41,7 @@ func TestCsvNoHeader(t *testing.T) {
reader := strings.NewReader("10.2,30.4\n")
- csv, err := helper.NewCsv[Row](false)
+ csv, err := helper.NewCsv[Row](helper.WithoutCsvHeader[Row]())
if err != nil {
t.Fatal(err)
}
@@ -62,7 +63,7 @@ func TestCsvInvalidColumns(t *testing.T) {
reader := strings.NewReader("1,2\n1\n")
- csv, err := helper.NewCsv[Row](false)
+ csv, err := helper.NewCsv[Row](helper.WithoutCsvHeader[Row]())
if err != nil {
t.Fatal(err)
}
@@ -86,7 +87,7 @@ func TestCsvMissingHeader(t *testing.T) {
reader := strings.NewReader("")
- csv, err := helper.NewCsv[Row](true)
+ csv, err := helper.NewCsv[Row]()
if err != nil {
t.Fatal(err)
}
@@ -105,7 +106,7 @@ func TestCsvInvalidField(t *testing.T) {
reader := strings.NewReader("\"ABCD\",\"EFGH\"\n")
- csv, err := helper.NewCsv[Row](false)
+ csv, err := helper.NewCsv[Row](helper.WithoutCsvHeader[Row]())
if err != nil {
t.Fatal(err)
}
@@ -122,7 +123,7 @@ func TestCsvNoStruct(t *testing.T) {
High float64
}
- _, err := helper.NewCsv[*Row](true)
+ _, err := helper.NewCsv[*Row]()
if err == nil {
t.Fatal("expected error")
}
@@ -134,7 +135,7 @@ func TestCsvReadFromFile(t *testing.T) {
High float64
}
- csv, err := helper.NewCsv[Row](true)
+ csv, err := helper.NewCsv[Row]()
if err != nil {
t.Fatal(err)
}
@@ -157,7 +158,7 @@ func TestCsvReadFromMissingFile(t *testing.T) {
High float64
}
- csv, err := helper.NewCsv[Row](true)
+ csv, err := helper.NewCsv[Row]()
if err != nil {
t.Fatal(err)
}
@@ -174,7 +175,7 @@ func TestReadFromCsvFile(t *testing.T) {
High float64
}
- rows, err := helper.ReadFromCsvFile[Row]("testdata/with_header.csv", true)
+ rows, err := helper.ReadFromCsvFile[Row]("testdata/with_header.csv")
if err != nil {
t.Fatal(err)
}
@@ -192,7 +193,7 @@ func TestReadFromCsvFileNoStruct(t *testing.T) {
High float64
}
- _, err := helper.ReadFromCsvFile[*Row]("testdata/with_header.csv", true)
+ _, err := helper.ReadFromCsvFile[*Row]("testdata/with_header.csv")
if err == nil {
t.Fatal("expected error")
}
@@ -209,7 +210,7 @@ func TestCsvWriteToFile(t *testing.T) {
{Close: 30, High: 40},
}
- csv, err := helper.NewCsv[Row](true)
+ csv, err := helper.NewCsv[Row]()
if err != nil {
t.Fatal(err)
}
@@ -222,7 +223,7 @@ func TestCsvWriteToFile(t *testing.T) {
t.Fatal(err)
}
- csv, err = helper.NewCsv[Row](true)
+ csv, err = helper.NewCsv[Row]()
if err != nil {
t.Fatal(err)
}
@@ -251,7 +252,7 @@ func TestCsvAppendToFile(t *testing.T) {
{Close: 30, High: 40},
}
- csv, err := helper.NewCsv[Row](true)
+ csv, err := helper.NewCsv[Row]()
if err != nil {
t.Fatal(err)
}
@@ -264,7 +265,7 @@ func TestCsvAppendToFile(t *testing.T) {
t.Fatal(err)
}
- csv, err = helper.NewCsv[Row](true)
+ csv, err = helper.NewCsv[Row]()
if err != nil {
t.Fatal(err)
}
@@ -274,7 +275,7 @@ func TestCsvAppendToFile(t *testing.T) {
t.Fatal(err)
}
- csv, err = helper.NewCsv[Row](true)
+ csv, err = helper.NewCsv[Row]()
if err != nil {
t.Fatal(err)
}
@@ -303,7 +304,7 @@ func TestCsvWriteToInvalidFile(t *testing.T) {
{Close: 30, High: 40},
})
- csv, err := helper.NewCsv[Row](true)
+ csv, err := helper.NewCsv[Row]()
if err != nil {
t.Fatal(err)
}
@@ -327,7 +328,7 @@ func TestCsvWriteToFileInvalidField(t *testing.T) {
{Close: 30, High: nil},
})
- csv, err := helper.NewCsv[Row](true)
+ csv, err := helper.NewCsv[Row]()
if err != nil {
t.Fatal(err)
}
@@ -355,17 +356,17 @@ func TestAppendOrWriteToCsvFile(t *testing.T) {
fileName := "test_append_or_write_to_csv_file.csv"
defer helper.Remove(t, fileName)
- err := helper.AppendOrWriteToCsvFile(fileName, true, helper.SliceToChan(input[:1]))
+ err := helper.AppendOrWriteToCsvFile(fileName, helper.SliceToChan(input[:1]))
if err != nil {
t.Fatal(err)
}
- err = helper.AppendOrWriteToCsvFile(fileName, true, helper.SliceToChan(input[1:]))
+ err = helper.AppendOrWriteToCsvFile(fileName, helper.SliceToChan(input[1:]))
if err != nil {
t.Fatal(err)
}
- actual, err := helper.ReadFromCsvFile[Row](fileName, true)
+ actual, err := helper.ReadFromCsvFile[Row](fileName)
if err != nil {
t.Fatal(err)
}
@@ -386,8 +387,33 @@ func TestAppendOrWriteToCsvFileNoStruct(t *testing.T) {
input := helper.SliceToChan([]**Row{})
- err := helper.AppendOrWriteToCsvFile[*Row]("test_append_or_write_to_csv_file_no_struct.csv", true, input)
+ err := helper.AppendOrWriteToCsvFile[*Row]("test_append_or_write_to_csv_file_no_struct.csv", input)
if err == nil {
t.Fatal("expected error")
}
}
+
+func TestCsvWithDefaultDateFormat(t *testing.T) {
+ type Row struct {
+ Date time.Time
+ Close float64
+ High float64
+ }
+
+ reader := strings.NewReader("Date,Asset,Open,Close\n\"2023-11-26 01:02:03\",\"SP500\",10.2,30.4\n")
+
+ csv, err := helper.NewCsv[Row](
+ helper.WithCsvDefaultDateTimeFormat[Row]("2006-01-02 15:04:05"),
+ )
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ row := <-csv.ReadFromReader(reader)
+
+ expected := time.Date(2023, 11, 26, 1, 2, 3, 0, time.UTC)
+
+ if !row.Date.Equal(expected) {
+ t.Fatalf("actual %v expected %v", row.Date, expected)
+ }
+}
diff --git a/helper/report_test.go b/helper/report_test.go
index fc255fe6..f7bd0485 100644
--- a/helper/report_test.go
+++ b/helper/report_test.go
@@ -20,7 +20,7 @@ func TestReportWriteToFile(t *testing.T) {
Annotation string
}
- input, err := helper.ReadFromCsvFile[Row]("testdata/report.csv", true)
+ input, err := helper.ReadFromCsvFile[Row]("testdata/report.csv")
if err != nil {
t.Fatal(err)
}
@@ -58,7 +58,7 @@ func TestReportWriteToFileFailed(t *testing.T) {
Annotation string
}
- input, err := helper.ReadFromCsvFile[Row]("testdata/report.csv", true)
+ input, err := helper.ReadFromCsvFile[Row]("testdata/report.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/mcp/README.md b/mcp/README.md
index 73c7eb65..0a23d0dc 100644
--- a/mcp/README.md
+++ b/mcp/README.md
@@ -18,36 +18,38 @@ import "github.com/cinar/indicator/mcp"
-## func [CreateStrategy]()
+## func [CreateStrategy]()
```go
func CreateStrategy(strategyType StrategyType) (strategy.Strategy, error)
```
-CreateStrategy creates a new strategy instance based on the specified type
+CreateStrategy creates a new strategy instance based on the specified type. It acts as a factory function, mapping a StrategyType to a concrete implementation of the strategy.Strategy interface.
+
+This function is essential for dynamically selecting and initializing the desired trading strategy at runtime. If an unsupported strategy type is provided, it returns an error.
-## func [GetAllStrategyTypes]()
+## func [GetAllStrategyTypes]()
```go
func GetAllStrategyTypes() []string
```
-GetAllStrategyTypes returns a slice of all available strategy types as strings
+GetAllStrategyTypes returns a slice of all available strategy types as strings. This list includes base, trend, momentum, and volume strategies, providing a comprehensive set of options for backtesting.
-## func [RunMCPServer]()
+## func [RunMCPServer]()
```go
func RunMCPServer() *server.MCPServer
```
-RunMCPServer starts the MCP server for the backtest functionality
+RunMCPServer starts the MCP server for the backtest functionality. It configures the server with the necessary tools and handlers for running backtests.
-## type [OhlcvData]()
+## type [OhlcvData]()
-OhlcvData represents the OHLCV data structure for the strategy
+OhlcvData represents the OHLCV \(Open, High, Low, Close, Volume\) data required for running a backtest. Each field is a slice of values that correspond to a series of time\-based snapshots.
```go
type OhlcvData struct {
@@ -61,9 +63,9 @@ type OhlcvData struct {
```
-## type [Response]()
+## type [Response]()
-Response represents the JSON response structure
+Response defines the structure of the JSON response for a backtest, containing the list of actions \(buy, sell, hold\) generated by the strategy.
```go
type Response struct {
@@ -72,9 +74,9 @@ type Response struct {
```
-## type [StrategyRequest]()
+## type [StrategyRequest]()
-StrategyRequest represents the request structure for strategy processing
+StrategyRequest defines the structure for a backtest request, including the strategy to be used and the OHLCV data for the backtest.
```go
type StrategyRequest struct {
@@ -84,15 +86,15 @@ type StrategyRequest struct {
```
-## type [StrategyType]()
+## type [StrategyType]()
-StrategyType represents the type of trading strategy
+StrategyType defines the type of trading strategy to be used in a backtest. It is represented as a string to allow for easy identification and selection.
```go
type StrategyType string
```
-Constants for all supported strategy types
+Constants for all supported strategy types. This list includes a variety of strategies from different categories, such as trend, momentum, and volume\-based approaches.
```go
const (
diff --git a/momentum/awesome_oscillator_test.go b/momentum/awesome_oscillator_test.go
index aa9935ab..0ff2f528 100644
--- a/momentum/awesome_oscillator_test.go
+++ b/momentum/awesome_oscillator_test.go
@@ -18,7 +18,7 @@ func TestAwesomeOscillator(t *testing.T) {
Ao float64
}
- input, err := helper.ReadFromCsvFile[Data]("testdata/awesome_oscillator.csv", true)
+ input, err := helper.ReadFromCsvFile[Data]("testdata/awesome_oscillator.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/momentum/chaikin_oscillator_test.go b/momentum/chaikin_oscillator_test.go
index 270d5024..aa323b16 100644
--- a/momentum/chaikin_oscillator_test.go
+++ b/momentum/chaikin_oscillator_test.go
@@ -21,7 +21,7 @@ func TestChaikinOscillator(t *testing.T) {
Co float64
}
- input, err := helper.ReadFromCsvFile[Data]("testdata/chaikin_oscillator.csv", true)
+ input, err := helper.ReadFromCsvFile[Data]("testdata/chaikin_oscillator.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/momentum/ichimoku_cloud_test.go b/momentum/ichimoku_cloud_test.go
index 02230565..a9538c3f 100644
--- a/momentum/ichimoku_cloud_test.go
+++ b/momentum/ichimoku_cloud_test.go
@@ -23,7 +23,7 @@ func TestIchimokuCloud(t *testing.T) {
LaggingLine float64
}
- input, err := helper.ReadFromCsvFile[Data]("testdata/ichimoku_cloud.csv", true)
+ input, err := helper.ReadFromCsvFile[Data]("testdata/ichimoku_cloud.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/momentum/ppo_test.go b/momentum/ppo_test.go
index 7103da7a..45dc0172 100644
--- a/momentum/ppo_test.go
+++ b/momentum/ppo_test.go
@@ -19,7 +19,7 @@ func TestPpo(t *testing.T) {
Histogram float64
}
- input, err := helper.ReadFromCsvFile[Data]("testdata/ppo.csv", true)
+ input, err := helper.ReadFromCsvFile[Data]("testdata/ppo.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/momentum/pvo_test.go b/momentum/pvo_test.go
index 1a331603..8a832d11 100644
--- a/momentum/pvo_test.go
+++ b/momentum/pvo_test.go
@@ -19,7 +19,7 @@ func TestPvo(t *testing.T) {
Histogram float64
}
- input, err := helper.ReadFromCsvFile[Data]("testdata/pvo.csv", true)
+ input, err := helper.ReadFromCsvFile[Data]("testdata/pvo.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/momentum/qstick_test.go b/momentum/qstick_test.go
index e3daa21e..4df52f19 100644
--- a/momentum/qstick_test.go
+++ b/momentum/qstick_test.go
@@ -18,7 +18,7 @@ func TestQstick(t *testing.T) {
Qstick float64
}
- input, err := helper.ReadFromCsvFile[Data]("testdata/qstick.csv", true)
+ input, err := helper.ReadFromCsvFile[Data]("testdata/qstick.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/momentum/rsi_test.go b/momentum/rsi_test.go
index 4ea0c511..23e35d59 100644
--- a/momentum/rsi_test.go
+++ b/momentum/rsi_test.go
@@ -17,7 +17,7 @@ func TestRsi(t *testing.T) {
Rsi float64
}
- input, err := helper.ReadFromCsvFile[Data]("testdata/rsi.csv", true)
+ input, err := helper.ReadFromCsvFile[Data]("testdata/rsi.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/momentum/stochastic_oscillator_test.go b/momentum/stochastic_oscillator_test.go
index 3abd103c..30031548 100644
--- a/momentum/stochastic_oscillator_test.go
+++ b/momentum/stochastic_oscillator_test.go
@@ -20,7 +20,7 @@ func TestStochasticOscillator(t *testing.T) {
D float64
}
- input, err := helper.ReadFromCsvFile[Data]("testdata/stochastic_oscillator.csv", true)
+ input, err := helper.ReadFromCsvFile[Data]("testdata/stochastic_oscillator.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/momentum/stochastic_rsi_test.go b/momentum/stochastic_rsi_test.go
index 186290ae..0fe8234b 100644
--- a/momentum/stochastic_rsi_test.go
+++ b/momentum/stochastic_rsi_test.go
@@ -17,7 +17,7 @@ func TestStochasticRsi(t *testing.T) {
StochasticRsi float64
}
- input, err := helper.ReadFromCsvFile[Data]("testdata/stochastic_rsi.csv", true)
+ input, err := helper.ReadFromCsvFile[Data]("testdata/stochastic_rsi.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/momentum/williams_r_test.go b/momentum/williams_r_test.go
index 182c74b2..5ea05c0b 100644
--- a/momentum/williams_r_test.go
+++ b/momentum/williams_r_test.go
@@ -19,7 +19,7 @@ func TestWilliamsR(t *testing.T) {
WilliamsR float64
}
- input, err := helper.ReadFromCsvFile[Data]("testdata/williams_r.csv", true)
+ input, err := helper.ReadFromCsvFile[Data]("testdata/williams_r.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/strategy/and_strategy_test.go b/strategy/and_strategy_test.go
index 97fe8db0..12a3d5e5 100644
--- a/strategy/and_strategy_test.go
+++ b/strategy/and_strategy_test.go
@@ -13,12 +13,12 @@ import (
)
func TestAndStrategy(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/repository/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/repository/brk-b.csv")
if err != nil {
t.Fatal(err)
}
- results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/and.csv", true)
+ results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/and.csv")
if err != nil {
t.Fatal(err)
}
@@ -37,7 +37,7 @@ func TestAndStrategy(t *testing.T) {
}
func TestAndStrategyReport(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/repository/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/repository/brk-b.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/strategy/buy_and_hold_strategy_test.go b/strategy/buy_and_hold_strategy_test.go
index 0b1e2d82..edcf6419 100644
--- a/strategy/buy_and_hold_strategy_test.go
+++ b/strategy/buy_and_hold_strategy_test.go
@@ -13,12 +13,12 @@ import (
)
func TestBuyAndHoldStrategy(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/repository/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/repository/brk-b.csv")
if err != nil {
t.Fatal(err)
}
- results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/buy_and_hold_strategy.csv", true)
+ results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/buy_and_hold_strategy.csv")
if err != nil {
t.Fatal(err)
}
@@ -35,7 +35,7 @@ func TestBuyAndHoldStrategy(t *testing.T) {
}
func TestBuyAndHoldStrategyReport(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/repository/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/repository/brk-b.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/strategy/compound/macd_rsi_strategy_test.go b/strategy/compound/macd_rsi_strategy_test.go
index 405b3c2a..32f2ee98 100644
--- a/strategy/compound/macd_rsi_strategy_test.go
+++ b/strategy/compound/macd_rsi_strategy_test.go
@@ -14,12 +14,12 @@ import (
)
func TestMacdRsiStrategy(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
- results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/macd_rsi_strategy.csv", true)
+ results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/macd_rsi_strategy.csv")
if err != nil {
t.Fatal(err)
}
@@ -36,7 +36,7 @@ func TestMacdRsiStrategy(t *testing.T) {
}
func TestMacdRsiStrategyReport(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/strategy/decorator/inverse_strategy_test.go b/strategy/decorator/inverse_strategy_test.go
index 46a507db..8140ad3a 100644
--- a/strategy/decorator/inverse_strategy_test.go
+++ b/strategy/decorator/inverse_strategy_test.go
@@ -15,12 +15,12 @@ import (
)
func TestInverseStrategy(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
- results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/inverse_strategy.csv", true)
+ results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/inverse_strategy.csv")
if err != nil {
t.Fatal(err)
}
@@ -39,7 +39,7 @@ func TestInverseStrategy(t *testing.T) {
}
func TestInverseStrategyReport(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/strategy/decorator/no_loss_strategy_test.go b/strategy/decorator/no_loss_strategy_test.go
index dd255d2d..1fd77870 100644
--- a/strategy/decorator/no_loss_strategy_test.go
+++ b/strategy/decorator/no_loss_strategy_test.go
@@ -15,12 +15,12 @@ import (
)
func TestNoLossStrategy(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
- results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/no_loss_strategy.csv", true)
+ results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/no_loss_strategy.csv")
if err != nil {
t.Fatal(err)
}
@@ -39,7 +39,7 @@ func TestNoLossStrategy(t *testing.T) {
}
func TestNoLossStrategyReport(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/strategy/decorator/stop_loss_strategy_test.go b/strategy/decorator/stop_loss_strategy_test.go
index 62c54874..48aa19c7 100644
--- a/strategy/decorator/stop_loss_strategy_test.go
+++ b/strategy/decorator/stop_loss_strategy_test.go
@@ -15,12 +15,12 @@ import (
)
func TestStopLossStrategy(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
- results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/stop_loss_strategy.csv", true)
+ results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/stop_loss_strategy.csv")
if err != nil {
t.Fatal(err)
}
@@ -39,7 +39,7 @@ func TestStopLossStrategy(t *testing.T) {
}
func TestStopLossStrategyReport(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/strategy/majority_strategy_test.go b/strategy/majority_strategy_test.go
index d6900819..fe25651f 100644
--- a/strategy/majority_strategy_test.go
+++ b/strategy/majority_strategy_test.go
@@ -14,12 +14,12 @@ import (
)
func TestMajorityStrategy(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/repository/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/repository/brk-b.csv")
if err != nil {
t.Fatal(err)
}
- results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/majority.csv", true)
+ results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/majority.csv")
if err != nil {
t.Fatal(err)
}
@@ -38,7 +38,7 @@ func TestMajorityStrategy(t *testing.T) {
}
func TestMajorityStrategyReport(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/repository/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/repository/brk-b.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/strategy/momentum/awesome_oscillator_strategy_test.go b/strategy/momentum/awesome_oscillator_strategy_test.go
index bce684b4..cfdb5b49 100644
--- a/strategy/momentum/awesome_oscillator_strategy_test.go
+++ b/strategy/momentum/awesome_oscillator_strategy_test.go
@@ -14,12 +14,12 @@ import (
)
func TestAwesomeOscillatorStrategy(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
- results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/awesome_oscillator_strategy.csv", true)
+ results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/awesome_oscillator_strategy.csv")
if err != nil {
t.Fatal(err)
}
@@ -36,7 +36,7 @@ func TestAwesomeOscillatorStrategy(t *testing.T) {
}
func TestAwesomeOscillatorStrategyReport(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/strategy/momentum/rsi_strategy_test.go b/strategy/momentum/rsi_strategy_test.go
index bbdf146f..2c4062ea 100644
--- a/strategy/momentum/rsi_strategy_test.go
+++ b/strategy/momentum/rsi_strategy_test.go
@@ -14,12 +14,12 @@ import (
)
func TestRsiStrategy(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
- results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/rsi_strategy.csv", true)
+ results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/rsi_strategy.csv")
if err != nil {
t.Fatal(err)
}
@@ -36,7 +36,7 @@ func TestRsiStrategy(t *testing.T) {
}
func TestRsiStrategyReport(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/strategy/momentum/stochastic_rsi_strategy_test.go b/strategy/momentum/stochastic_rsi_strategy_test.go
index b762a16a..93ea7c2f 100644
--- a/strategy/momentum/stochastic_rsi_strategy_test.go
+++ b/strategy/momentum/stochastic_rsi_strategy_test.go
@@ -14,12 +14,12 @@ import (
)
func TestStochasticRsiStrategy(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
- results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/stochastic_rsi_strategy.csv", true)
+ results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/stochastic_rsi_strategy.csv")
if err != nil {
t.Fatal(err)
}
@@ -36,7 +36,7 @@ func TestStochasticRsiStrategy(t *testing.T) {
}
func TestStochasticRsiStrategyReport(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/strategy/momentum/triple_rsi_strategy_test.go b/strategy/momentum/triple_rsi_strategy_test.go
index 9d83f013..493ef8af 100644
--- a/strategy/momentum/triple_rsi_strategy_test.go
+++ b/strategy/momentum/triple_rsi_strategy_test.go
@@ -14,12 +14,12 @@ import (
)
func TestTripleRsiStrategy(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
- results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/triple_rsi_strategy.csv", true)
+ results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/triple_rsi_strategy.csv")
if err != nil {
t.Fatal(err)
}
@@ -36,7 +36,7 @@ func TestTripleRsiStrategy(t *testing.T) {
}
func TestTripleRsiStrategyReport(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/strategy/or_strategy_test.go b/strategy/or_strategy_test.go
index 599e40b7..90b9dff7 100644
--- a/strategy/or_strategy_test.go
+++ b/strategy/or_strategy_test.go
@@ -14,12 +14,12 @@ import (
)
func TestOrStrategy(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/repository/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/repository/brk-b.csv")
if err != nil {
t.Fatal(err)
}
- results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/or.csv", true)
+ results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/or.csv")
if err != nil {
t.Fatal(err)
}
@@ -38,7 +38,7 @@ func TestOrStrategy(t *testing.T) {
}
func TestOrStrategyReport(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/repository/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/repository/brk-b.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/strategy/split_strategy_test.go b/strategy/split_strategy_test.go
index dc4cb516..57e3410d 100644
--- a/strategy/split_strategy_test.go
+++ b/strategy/split_strategy_test.go
@@ -14,12 +14,12 @@ import (
)
func TestSplitStrategy(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/repository/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/repository/brk-b.csv")
if err != nil {
t.Fatal(err)
}
- results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/split.csv", true)
+ results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/split.csv")
if err != nil {
t.Fatal(err)
}
@@ -40,7 +40,7 @@ func TestSplitStrategy(t *testing.T) {
}
func TestSplitStrategyReport(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/repository/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/repository/brk-b.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/strategy/trend/alligator_strategy_test.go b/strategy/trend/alligator_strategy_test.go
index 978efd70..54c0b0cf 100644
--- a/strategy/trend/alligator_strategy_test.go
+++ b/strategy/trend/alligator_strategy_test.go
@@ -14,12 +14,12 @@ import (
)
func TestAlligatorStrategy(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
- results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/alligator_strategy.csv", true)
+ results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/alligator_strategy.csv")
if err != nil {
t.Fatal(err)
}
@@ -36,7 +36,7 @@ func TestAlligatorStrategy(t *testing.T) {
}
func TestAlligatorStrategyReport(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/strategy/trend/apo_strategy_test.go b/strategy/trend/apo_strategy_test.go
index 0511c29a..423603b2 100644
--- a/strategy/trend/apo_strategy_test.go
+++ b/strategy/trend/apo_strategy_test.go
@@ -14,12 +14,12 @@ import (
)
func TestApoStrategy(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
- results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/apo_strategy.csv", true)
+ results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/apo_strategy.csv")
if err != nil {
t.Fatal(err)
}
@@ -36,7 +36,7 @@ func TestApoStrategy(t *testing.T) {
}
func TestApoStrategyReport(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/strategy/trend/aroon_strategy_test.go b/strategy/trend/aroon_strategy_test.go
index 5f1a5aef..76fcbc22 100644
--- a/strategy/trend/aroon_strategy_test.go
+++ b/strategy/trend/aroon_strategy_test.go
@@ -14,12 +14,12 @@ import (
)
func TestAroonStrategy(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
- results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/aroon_strategy.csv", true)
+ results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/aroon_strategy.csv")
if err != nil {
t.Fatal(err)
}
@@ -36,7 +36,7 @@ func TestAroonStrategy(t *testing.T) {
}
func TestAroonStrategyReport(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/strategy/trend/bop_strategy_test.go b/strategy/trend/bop_strategy_test.go
index 930ca03b..a633045e 100644
--- a/strategy/trend/bop_strategy_test.go
+++ b/strategy/trend/bop_strategy_test.go
@@ -14,12 +14,12 @@ import (
)
func TestBopStrategy(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
- results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/bop_strategy.csv", true)
+ results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/bop_strategy.csv")
if err != nil {
t.Fatal(err)
}
@@ -36,7 +36,7 @@ func TestBopStrategy(t *testing.T) {
}
func TestBopStrategyReport(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/strategy/trend/cci_strategy_test.go b/strategy/trend/cci_strategy_test.go
index f0d4f9c4..15041e78 100644
--- a/strategy/trend/cci_strategy_test.go
+++ b/strategy/trend/cci_strategy_test.go
@@ -14,12 +14,12 @@ import (
)
func TestCciStrategy(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
- results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/cci_strategy.csv", true)
+ results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/cci_strategy.csv")
if err != nil {
t.Fatal(err)
}
@@ -36,7 +36,7 @@ func TestCciStrategy(t *testing.T) {
}
func TestCciStrategyReport(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/strategy/trend/dema_strategy_test.go b/strategy/trend/dema_strategy_test.go
index d725f30c..ed97b6f1 100644
--- a/strategy/trend/dema_strategy_test.go
+++ b/strategy/trend/dema_strategy_test.go
@@ -14,12 +14,12 @@ import (
)
func TestDemaStrategy(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
- results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/dema_strategy.csv", true)
+ results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/dema_strategy.csv")
if err != nil {
t.Fatal(err)
}
@@ -36,7 +36,7 @@ func TestDemaStrategy(t *testing.T) {
}
func TestDemaStrategyReport(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/strategy/trend/envelope_strategy_test.go b/strategy/trend/envelope_strategy_test.go
index 9b110ae4..10f6817d 100644
--- a/strategy/trend/envelope_strategy_test.go
+++ b/strategy/trend/envelope_strategy_test.go
@@ -14,12 +14,12 @@ import (
)
func TestEnvelopeStrategy(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
- results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/envelope_strategy.csv", true)
+ results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/envelope_strategy.csv")
if err != nil {
t.Fatal(err)
}
@@ -36,7 +36,7 @@ func TestEnvelopeStrategy(t *testing.T) {
}
func TestEnvelopeStrategyReport(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/strategy/trend/golden_cross_strategy_test.go b/strategy/trend/golden_cross_strategy_test.go
index b02e68c7..e1ea438f 100644
--- a/strategy/trend/golden_cross_strategy_test.go
+++ b/strategy/trend/golden_cross_strategy_test.go
@@ -14,12 +14,12 @@ import (
)
func TestGoldenCrossStrategy(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
- results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/golden_cross_strategy.csv", true)
+ results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/golden_cross_strategy.csv")
if err != nil {
t.Fatal(err)
}
@@ -36,7 +36,7 @@ func TestGoldenCrossStrategy(t *testing.T) {
}
func TestGoldenCrossStrategyReport(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/strategy/trend/kama_strategy_test.go b/strategy/trend/kama_strategy_test.go
index 77d7b47b..ff08209b 100644
--- a/strategy/trend/kama_strategy_test.go
+++ b/strategy/trend/kama_strategy_test.go
@@ -14,12 +14,12 @@ import (
)
func TestKamaStrategy(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
- results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/kama_strategy.csv", true)
+ results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/kama_strategy.csv")
if err != nil {
t.Fatal(err)
}
@@ -36,7 +36,7 @@ func TestKamaStrategy(t *testing.T) {
}
func TestKamaStrategyReport(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/strategy/trend/kdj_strategy_test.go b/strategy/trend/kdj_strategy_test.go
index ee9f1c18..82a54b5f 100644
--- a/strategy/trend/kdj_strategy_test.go
+++ b/strategy/trend/kdj_strategy_test.go
@@ -14,12 +14,12 @@ import (
)
func TestKdjStrategy(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
- results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/kdj_strategy.csv", true)
+ results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/kdj_strategy.csv")
if err != nil {
t.Fatal(err)
}
@@ -36,7 +36,7 @@ func TestKdjStrategy(t *testing.T) {
}
func TestKdjStrategyReport(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/strategy/trend/macd_strategy_test.go b/strategy/trend/macd_strategy_test.go
index 8a462d9a..41057663 100644
--- a/strategy/trend/macd_strategy_test.go
+++ b/strategy/trend/macd_strategy_test.go
@@ -14,12 +14,12 @@ import (
)
func TestMacdStrategy(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
- results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/macd_strategy.csv", true)
+ results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/macd_strategy.csv")
if err != nil {
t.Fatal(err)
}
@@ -36,7 +36,7 @@ func TestMacdStrategy(t *testing.T) {
}
func TestMacdStrategyReport(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/strategy/trend/qstick_strategy_test.go b/strategy/trend/qstick_strategy_test.go
index 4ac4ba78..0d8d4d1b 100644
--- a/strategy/trend/qstick_strategy_test.go
+++ b/strategy/trend/qstick_strategy_test.go
@@ -14,12 +14,12 @@ import (
)
func TestQstickStrategy(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
- results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/qstick_strategy.csv", true)
+ results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/qstick_strategy.csv")
if err != nil {
t.Fatal(err)
}
@@ -36,7 +36,7 @@ func TestQstickStrategy(t *testing.T) {
}
func TestQstickStrategyReport(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/strategy/trend/smma_strategy_test.go b/strategy/trend/smma_strategy_test.go
index 7cb8e582..4538d04e 100644
--- a/strategy/trend/smma_strategy_test.go
+++ b/strategy/trend/smma_strategy_test.go
@@ -14,12 +14,12 @@ import (
)
func TestSmmaStrategy(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
- results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/smma_strategy.csv", true)
+ results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/smma_strategy.csv")
if err != nil {
t.Fatal(err)
}
@@ -36,7 +36,7 @@ func TestSmmaStrategy(t *testing.T) {
}
func TestSmmaStrategyReport(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/strategy/trend/trima_strategy_test.go b/strategy/trend/trima_strategy_test.go
index ea6edc63..82fe4b3b 100644
--- a/strategy/trend/trima_strategy_test.go
+++ b/strategy/trend/trima_strategy_test.go
@@ -14,12 +14,12 @@ import (
)
func TestTrimaStrategy(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
- results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/trima_strategy.csv", true)
+ results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/trima_strategy.csv")
if err != nil {
t.Fatal(err)
}
@@ -36,7 +36,7 @@ func TestTrimaStrategy(t *testing.T) {
}
func TestTrimaStrategyReport(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/strategy/trend/triple_moving_average_crossover_strategy_test.go b/strategy/trend/triple_moving_average_crossover_strategy_test.go
index d29f074d..9db7d124 100644
--- a/strategy/trend/triple_moving_average_crossover_strategy_test.go
+++ b/strategy/trend/triple_moving_average_crossover_strategy_test.go
@@ -14,12 +14,12 @@ import (
)
func TestTripleMovingAverageCrossoverStrategy(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
- results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/triple_moving_average_crossover_strategy.csv", true)
+ results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/triple_moving_average_crossover_strategy.csv")
if err != nil {
t.Fatal(err)
}
@@ -36,7 +36,7 @@ func TestTripleMovingAverageCrossoverStrategy(t *testing.T) {
}
func TestTripleMovingAverageCrossoverStrategyReport(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/strategy/trend/trix_strategy_test.go b/strategy/trend/trix_strategy_test.go
index 209d786b..b4599897 100644
--- a/strategy/trend/trix_strategy_test.go
+++ b/strategy/trend/trix_strategy_test.go
@@ -14,12 +14,12 @@ import (
)
func TestTrixStrategy(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
- results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/trix_strategy.csv", true)
+ results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/trix_strategy.csv")
if err != nil {
t.Fatal(err)
}
@@ -36,7 +36,7 @@ func TestTrixStrategy(t *testing.T) {
}
func TestTrixStrategyReport(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/strategy/trend/tsi_strategy_test.go b/strategy/trend/tsi_strategy_test.go
index 1ce8e7df..54abffa5 100644
--- a/strategy/trend/tsi_strategy_test.go
+++ b/strategy/trend/tsi_strategy_test.go
@@ -14,12 +14,12 @@ import (
)
func TestTsiStrategy(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
- results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/tsi_strategy.csv", true)
+ results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/tsi_strategy.csv")
if err != nil {
t.Fatal(err)
}
@@ -36,7 +36,7 @@ func TestTsiStrategy(t *testing.T) {
}
func TestTsiStrategyReport(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/strategy/trend/vwma_strategy_test.go b/strategy/trend/vwma_strategy_test.go
index 82c9ff89..00568d00 100644
--- a/strategy/trend/vwma_strategy_test.go
+++ b/strategy/trend/vwma_strategy_test.go
@@ -14,12 +14,12 @@ import (
)
func TestVwmaStrategy(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
- results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/vwma_strategy.csv", true)
+ results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/vwma_strategy.csv")
if err != nil {
t.Fatal(err)
}
@@ -36,7 +36,7 @@ func TestVwmaStrategy(t *testing.T) {
}
func TestVwmaStrategyReport(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/strategy/trend/weighted_close_strategy_test.go b/strategy/trend/weighted_close_strategy_test.go
index 41f77998..69883802 100644
--- a/strategy/trend/weighted_close_strategy_test.go
+++ b/strategy/trend/weighted_close_strategy_test.go
@@ -14,12 +14,12 @@ import (
)
func TestWeightedCloseStrategy(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
- results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/weighted_close_strategy.csv", true)
+ results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/weighted_close_strategy.csv")
if err != nil {
t.Fatal(err)
}
@@ -36,7 +36,7 @@ func TestWeightedCloseStrategy(t *testing.T) {
}
func TestWeightedCloseStrategyReport(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/strategy/volatility/bollinger_bands_strategy_test.go b/strategy/volatility/bollinger_bands_strategy_test.go
index 59e31eee..b6a83788 100644
--- a/strategy/volatility/bollinger_bands_strategy_test.go
+++ b/strategy/volatility/bollinger_bands_strategy_test.go
@@ -14,12 +14,12 @@ import (
)
func TestBollingerBandsStrategy(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
- results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/bollinger_bands_strategy.csv", true)
+ results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/bollinger_bands_strategy.csv")
if err != nil {
t.Fatal(err)
}
@@ -36,7 +36,7 @@ func TestBollingerBandsStrategy(t *testing.T) {
}
func TestBollingerBandsStrategyReport(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/strategy/volatility/super_trend_strategy_test.go b/strategy/volatility/super_trend_strategy_test.go
index f422147a..911d232c 100644
--- a/strategy/volatility/super_trend_strategy_test.go
+++ b/strategy/volatility/super_trend_strategy_test.go
@@ -14,12 +14,12 @@ import (
)
func TestSuperTrendStrategy(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
- results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/super_trend_strategy.csv", true)
+ results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/super_trend_strategy.csv")
if err != nil {
t.Fatal(err)
}
@@ -36,7 +36,7 @@ func TestSuperTrendStrategy(t *testing.T) {
}
func TestSuperTrendStrategyReport(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/strategy/volume/chaikin_money_flow_strategy_test.go b/strategy/volume/chaikin_money_flow_strategy_test.go
index 6398ed3f..dff4a11c 100644
--- a/strategy/volume/chaikin_money_flow_strategy_test.go
+++ b/strategy/volume/chaikin_money_flow_strategy_test.go
@@ -14,12 +14,12 @@ import (
)
func TestChaikinMoneyFlowStrategy(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
- results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/chaikin_money_flow_strategy.csv", true)
+ results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/chaikin_money_flow_strategy.csv")
if err != nil {
t.Fatal(err)
}
@@ -36,7 +36,7 @@ func TestChaikinMoneyFlowStrategy(t *testing.T) {
}
func TestChaikinMoneyFlowStrategyReport(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/strategy/volume/ease_of_movement_strategy_test.go b/strategy/volume/ease_of_movement_strategy_test.go
index d304ef4f..62333596 100644
--- a/strategy/volume/ease_of_movement_strategy_test.go
+++ b/strategy/volume/ease_of_movement_strategy_test.go
@@ -14,12 +14,12 @@ import (
)
func TestEaseOfMovementStrategy(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
- results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/ease_of_movement_strategy.csv", true)
+ results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/ease_of_movement_strategy.csv")
if err != nil {
t.Fatal(err)
}
@@ -36,7 +36,7 @@ func TestEaseOfMovementStrategy(t *testing.T) {
}
func TestEaseOfMovementStrategyReport(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/strategy/volume/force_index_strategy_test.go b/strategy/volume/force_index_strategy_test.go
index 1ff2bc62..58531a4d 100644
--- a/strategy/volume/force_index_strategy_test.go
+++ b/strategy/volume/force_index_strategy_test.go
@@ -14,12 +14,12 @@ import (
)
func TestForceIndexStrategy(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
- results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/force_index_strategy.csv", true)
+ results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/force_index_strategy.csv")
if err != nil {
t.Fatal(err)
}
@@ -36,7 +36,7 @@ func TestForceIndexStrategy(t *testing.T) {
}
func TestForceIndexStrategyReport(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/strategy/volume/money_flow_index_strategy_test.go b/strategy/volume/money_flow_index_strategy_test.go
index 50571fdf..179d9088 100644
--- a/strategy/volume/money_flow_index_strategy_test.go
+++ b/strategy/volume/money_flow_index_strategy_test.go
@@ -14,12 +14,12 @@ import (
)
func TestMoneyFlowIndexStrategy(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
- results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/money_flow_index_strategy.csv", true)
+ results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/money_flow_index_strategy.csv")
if err != nil {
t.Fatal(err)
}
@@ -36,7 +36,7 @@ func TestMoneyFlowIndexStrategy(t *testing.T) {
}
func TestMoneyFlowIndexStrategyReport(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/strategy/volume/negative_volume_index_strategy_test.go b/strategy/volume/negative_volume_index_strategy_test.go
index 1e3ad89f..e925e770 100644
--- a/strategy/volume/negative_volume_index_strategy_test.go
+++ b/strategy/volume/negative_volume_index_strategy_test.go
@@ -14,12 +14,12 @@ import (
)
func TestNegativeVolumeIndexStrategy(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
- results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/negative_volume_index_strategy.csv", true)
+ results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/negative_volume_index_strategy.csv")
if err != nil {
t.Fatal(err)
}
@@ -36,7 +36,7 @@ func TestNegativeVolumeIndexStrategy(t *testing.T) {
}
func TestNegativeVolumeIndexStrategyReport(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/strategy/volume/weighted_average_price_strategy_test.go b/strategy/volume/weighted_average_price_strategy_test.go
index 696bf706..cd0938a0 100644
--- a/strategy/volume/weighted_average_price_strategy_test.go
+++ b/strategy/volume/weighted_average_price_strategy_test.go
@@ -14,12 +14,12 @@ import (
)
func TestVolumeWeightedAveragePriceStrategy(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
- results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/volume_weighted_average_price_strategy.csv", true)
+ results, err := helper.ReadFromCsvFile[strategy.Result]("testdata/volume_weighted_average_price_strategy.csv")
if err != nil {
t.Fatal(err)
}
@@ -36,7 +36,7 @@ func TestVolumeWeightedAveragePriceStrategy(t *testing.T) {
}
func TestVolumeWeightedAveragePriceStrategyReport(t *testing.T) {
- snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv", true)
+ snapshots, err := helper.ReadFromCsvFile[asset.Snapshot]("testdata/brk-b.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/trend/README.md b/trend/README.md
index ab591d65..f6a3e172 100644
--- a/trend/README.md
+++ b/trend/README.md
@@ -109,6 +109,12 @@ The information provided on this project is strictly for informational purposes
- [func NewRmaWithPeriod\[T helper.Number\]\(period int\) \*Rma\[T\]](<#NewRmaWithPeriod>)
- [func \(r \*Rma\[T\]\) Compute\(c \<\-chan T\) \<\-chan T](<#Rma[T].Compute>)
- [func \(r \*Rma\[T\]\) IdlePeriod\(\) int](<#Rma[T].IdlePeriod>)
+- [type Roc](<#Roc>)
+ - [func NewRoc\[T helper.Float\]\(\) \*Roc\[T\]](<#NewRoc>)
+ - [func NewRocWithPeriod\[T helper.Float\]\(period int\) \*Roc\[T\]](<#NewRocWithPeriod>)
+ - [func \(r \*Roc\[T\]\) Compute\(values \<\-chan T\) \<\-chan T](<#Roc[T].Compute>)
+ - [func \(r \*Roc\[T\]\) IdlePeriod\(\) int](<#Roc[T].IdlePeriod>)
+ - [func \(r \*Roc\[T\]\) String\(\) string](<#Roc[T].String>)
- [type Sma](<#Sma>)
- [func NewSma\[T helper.Number\]\(\) \*Sma\[T\]](<#NewSma>)
- [func NewSmaWithPeriod\[T helper.Number\]\(period int\) \*Sma\[T\]](<#NewSmaWithPeriod>)
@@ -302,6 +308,15 @@ const (
)
```
+
+
+```go
+const (
+ // DefaultRocPeriod is the default ROC period.
+ DefaultRocPeriod = 9
+)
+```
+
```go
@@ -1378,6 +1393,67 @@ func (r *Rma[T]) IdlePeriod() int
IdlePeriod is the initial period that RMA won't yield any results.
+
+## type [Roc]()
+
+Roc represents the configuration parameters for calculating the Rate Of Change \(ROC\) indicator.
+
+```
+ROC = (Current Price - Price n periods ago) / Price n periods ago
+```
+
+```go
+type Roc[T helper.Float] struct {
+ // Time period.
+ Period int
+}
+```
+
+
+### func [NewRoc]()
+
+```go
+func NewRoc[T helper.Float]() *Roc[T]
+```
+
+NewRoc function initializes a new Roc instance with the default parameters.
+
+
+### func [NewRocWithPeriod]()
+
+```go
+func NewRocWithPeriod[T helper.Float](period int) *Roc[T]
+```
+
+NewRocWithPeriod function initializes a new Roc instance with the given parameters.
+
+
+### func \(\*Roc\[T\]\) [Compute]()
+
+```go
+func (r *Roc[T]) Compute(values <-chan T) <-chan T
+```
+
+Compute function takes a channel of numbers and computes the ROC and the signal line.
+
+
+### func \(\*Roc\[T\]\) [IdlePeriod]()
+
+```go
+func (r *Roc[T]) IdlePeriod() int
+```
+
+IdlePeriod is the initial period that ROC won't yield any results.
+
+
+### func \(\*Roc\[T\]\) [String]()
+
+```go
+func (r *Roc[T]) String() string
+```
+
+String is the string representation of the ROC.
+
## type [Sma]()
diff --git a/trend/apo_test.go b/trend/apo_test.go
index 734d0698..e29788ee 100644
--- a/trend/apo_test.go
+++ b/trend/apo_test.go
@@ -17,7 +17,7 @@ func TestApo(t *testing.T) {
Apo float64
}
- input, err := helper.ReadFromCsvFile[ApoData]("testdata/apo.csv", true)
+ input, err := helper.ReadFromCsvFile[ApoData]("testdata/apo.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/trend/aroon_test.go b/trend/aroon_test.go
index eee04047..0325c63b 100644
--- a/trend/aroon_test.go
+++ b/trend/aroon_test.go
@@ -21,7 +21,7 @@ func TestAroon(t *testing.T) {
aroon := trend.NewAroon[float64]()
- input, err := helper.ReadFromCsvFile[AroonData]("testdata/aroon.csv", true)
+ input, err := helper.ReadFromCsvFile[AroonData]("testdata/aroon.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/trend/bop_test.go b/trend/bop_test.go
index 6f01c60f..029fd51f 100644
--- a/trend/bop_test.go
+++ b/trend/bop_test.go
@@ -20,7 +20,7 @@ func TestBop(t *testing.T) {
Bop float64
}
- input, err := helper.ReadFromCsvFile[BopData]("testdata/bop.csv", true)
+ input, err := helper.ReadFromCsvFile[BopData]("testdata/bop.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/trend/cci_test.go b/trend/cci_test.go
index bae1a607..e386872e 100644
--- a/trend/cci_test.go
+++ b/trend/cci_test.go
@@ -19,7 +19,7 @@ func TestCci(t *testing.T) {
Cci float64
}
- input, err := helper.ReadFromCsvFile[Data]("testdata/cci.csv", true)
+ input, err := helper.ReadFromCsvFile[Data]("testdata/cci.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/trend/envelope_test.go b/trend/envelope_test.go
index 974ad1ac..b64c3f4e 100644
--- a/trend/envelope_test.go
+++ b/trend/envelope_test.go
@@ -19,7 +19,7 @@ func TestEnvelopeWithSma(t *testing.T) {
Lower float64
}
- input, err := helper.ReadFromCsvFile[Data]("testdata/envelope_sma.csv", true)
+ input, err := helper.ReadFromCsvFile[Data]("testdata/envelope_sma.csv")
if err != nil {
t.Fatal(err)
}
@@ -55,7 +55,7 @@ func TestEnvelopeWithEma(t *testing.T) {
Lower float64
}
- input, err := helper.ReadFromCsvFile[Data]("testdata/envelope_ema.csv", true)
+ input, err := helper.ReadFromCsvFile[Data]("testdata/envelope_ema.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/trend/hma_test.go b/trend/hma_test.go
index 14be762d..0180ed3a 100644
--- a/trend/hma_test.go
+++ b/trend/hma_test.go
@@ -17,7 +17,7 @@ func TestHma(t *testing.T) {
Hma float64
}
- input, err := helper.ReadFromCsvFile[Data]("testdata/hma.csv", true)
+ input, err := helper.ReadFromCsvFile[Data]("testdata/hma.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/trend/kama_test.go b/trend/kama_test.go
index 1742518d..541a6e8e 100644
--- a/trend/kama_test.go
+++ b/trend/kama_test.go
@@ -17,7 +17,7 @@ func TestKama(t *testing.T) {
Kama float64
}
- input, err := helper.ReadFromCsvFile[Data]("testdata/kama.csv", true)
+ input, err := helper.ReadFromCsvFile[Data]("testdata/kama.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/trend/kdj_test.go b/trend/kdj_test.go
index 37eba2a2..86025bd2 100644
--- a/trend/kdj_test.go
+++ b/trend/kdj_test.go
@@ -21,7 +21,7 @@ func TestKdj(t *testing.T) {
J float64
}
- input, err := helper.ReadFromCsvFile[Data]("testdata/kdj.csv", true)
+ input, err := helper.ReadFromCsvFile[Data]("testdata/kdj.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/trend/macd_test.go b/trend/macd_test.go
index 60e59d5e..10e816b3 100644
--- a/trend/macd_test.go
+++ b/trend/macd_test.go
@@ -18,7 +18,7 @@ func TestMacd(t *testing.T) {
Signal float64
}
- input, err := helper.ReadFromCsvFile[Data]("testdata/macd.csv", true)
+ input, err := helper.ReadFromCsvFile[Data]("testdata/macd.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/trend/mass_index_test.go b/trend/mass_index_test.go
index 946da1c8..62a4ab99 100644
--- a/trend/mass_index_test.go
+++ b/trend/mass_index_test.go
@@ -18,7 +18,7 @@ func TestMassIndex(t *testing.T) {
MassIndex float64
}
- input, err := helper.ReadFromCsvFile[Data]("testdata/mass_index.csv", true)
+ input, err := helper.ReadFromCsvFile[Data]("testdata/mass_index.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/trend/mlr_test.go b/trend/mlr_test.go
index 745eaf84..4171aa9f 100644
--- a/trend/mlr_test.go
+++ b/trend/mlr_test.go
@@ -18,7 +18,7 @@ func TestMlr(t *testing.T) {
R float64
}
- input, err := helper.ReadFromCsvFile[Data]("testdata/mlr.csv", true)
+ input, err := helper.ReadFromCsvFile[Data]("testdata/mlr.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/trend/mls_test.go b/trend/mls_test.go
index 801fded0..7a8776b8 100644
--- a/trend/mls_test.go
+++ b/trend/mls_test.go
@@ -19,7 +19,7 @@ func TestMls(t *testing.T) {
B float64
}
- input, err := helper.ReadFromCsvFile[Data]("testdata/mls.csv", true)
+ input, err := helper.ReadFromCsvFile[Data]("testdata/mls.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/trend/rma_test.go b/trend/rma_test.go
index de7d4bbc..f445ef9d 100644
--- a/trend/rma_test.go
+++ b/trend/rma_test.go
@@ -17,7 +17,7 @@ func TestRma(t *testing.T) {
Rma float64
}
- input, err := helper.ReadFromCsvFile[Data]("testdata/rma.csv", true)
+ input, err := helper.ReadFromCsvFile[Data]("testdata/rma.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/trend/roc_test.go b/trend/roc_test.go
index 1c20a733..86b29d55 100644
--- a/trend/roc_test.go
+++ b/trend/roc_test.go
@@ -28,7 +28,7 @@ func TestRocTestdata(t *testing.T) {
Roc float64
}
- input, err := helper.ReadFromCsvFile[Data]("testdata/roc.csv", true)
+ input, err := helper.ReadFromCsvFile[Data]("testdata/roc.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/trend/smma_test.go b/trend/smma_test.go
index a2fda5ca..c7e46ea5 100644
--- a/trend/smma_test.go
+++ b/trend/smma_test.go
@@ -17,7 +17,7 @@ func TestSmma(t *testing.T) {
Smma float64
}
- input, err := helper.ReadFromCsvFile[Data]("testdata/smma.csv", true)
+ input, err := helper.ReadFromCsvFile[Data]("testdata/smma.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/trend/tema_test.go b/trend/tema_test.go
index 57f26dae..d8db92c0 100644
--- a/trend/tema_test.go
+++ b/trend/tema_test.go
@@ -17,7 +17,7 @@ func TestTema(t *testing.T) {
Tema float64
}
- input, err := helper.ReadFromCsvFile[Data]("testdata/tema.csv", true)
+ input, err := helper.ReadFromCsvFile[Data]("testdata/tema.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/trend/trima_test.go b/trend/trima_test.go
index e84bf53f..bc2de08c 100644
--- a/trend/trima_test.go
+++ b/trend/trima_test.go
@@ -17,7 +17,7 @@ func TestTrimaWithOddPeriod(t *testing.T) {
Trima float64
}
- input, err := helper.ReadFromCsvFile[Data]("testdata/trima_odd.csv", true)
+ input, err := helper.ReadFromCsvFile[Data]("testdata/trima_odd.csv")
if err != nil {
t.Fatal(err)
}
@@ -46,7 +46,7 @@ func TestTrimaWithEvenPeriod(t *testing.T) {
Trima float64
}
- input, err := helper.ReadFromCsvFile[Data]("testdata/trima_even.csv", true)
+ input, err := helper.ReadFromCsvFile[Data]("testdata/trima_even.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/trend/trix_test.go b/trend/trix_test.go
index 96435283..c9b7b099 100644
--- a/trend/trix_test.go
+++ b/trend/trix_test.go
@@ -17,7 +17,7 @@ func TestTrix(t *testing.T) {
Trix float64
}
- input, err := helper.ReadFromCsvFile[Data]("testdata/trix.csv", true)
+ input, err := helper.ReadFromCsvFile[Data]("testdata/trix.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/trend/tsi_test.go b/trend/tsi_test.go
index e2414b98..f1f97dad 100644
--- a/trend/tsi_test.go
+++ b/trend/tsi_test.go
@@ -17,7 +17,7 @@ func TestTsi(t *testing.T) {
Tsi float64
}
- input, err := helper.ReadFromCsvFile[Data]("testdata/tsi.csv", true)
+ input, err := helper.ReadFromCsvFile[Data]("testdata/tsi.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/trend/typical_price_test.go b/trend/typical_price_test.go
index afca8da5..29809b00 100644
--- a/trend/typical_price_test.go
+++ b/trend/typical_price_test.go
@@ -19,7 +19,7 @@ func TestTypicalPrice(t *testing.T) {
TypicalPrice float64
}
- input, err := helper.ReadFromCsvFile[Data]("testdata/typical_price.csv", true)
+ input, err := helper.ReadFromCsvFile[Data]("testdata/typical_price.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/trend/vwma_test.go b/trend/vwma_test.go
index ffffe593..c3fcac52 100644
--- a/trend/vwma_test.go
+++ b/trend/vwma_test.go
@@ -18,7 +18,7 @@ func TestVwma(t *testing.T) {
Vwma float64
}
- input, err := helper.ReadFromCsvFile[Data]("testdata/vwma.csv", true)
+ input, err := helper.ReadFromCsvFile[Data]("testdata/vwma.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/trend/weighted_close_test.go b/trend/weighted_close_test.go
index 18218b88..5966b40f 100644
--- a/trend/weighted_close_test.go
+++ b/trend/weighted_close_test.go
@@ -19,7 +19,7 @@ func TestWeightedClose(t *testing.T) {
WeightedClose float64
}
- input, err := helper.ReadFromCsvFile[Data]("testdata/weighted_close.csv", true)
+ input, err := helper.ReadFromCsvFile[Data]("testdata/weighted_close.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/trend/wma_test.go b/trend/wma_test.go
index 47757f1d..9e10315d 100644
--- a/trend/wma_test.go
+++ b/trend/wma_test.go
@@ -17,7 +17,7 @@ func TestWma(t *testing.T) {
Wma float64
}
- input, err := helper.ReadFromCsvFile[Data]("testdata/wma.csv", true)
+ input, err := helper.ReadFromCsvFile[Data]("testdata/wma.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/volatility/acceleration_bands_test.go b/volatility/acceleration_bands_test.go
index 6efb928e..bc1e60f8 100644
--- a/volatility/acceleration_bands_test.go
+++ b/volatility/acceleration_bands_test.go
@@ -21,7 +21,7 @@ func TestAccelerationBands(t *testing.T) {
Lower float64
}
- input, err := helper.ReadFromCsvFile[Data]("testdata/acceleration_bands.csv", true)
+ input, err := helper.ReadFromCsvFile[Data]("testdata/acceleration_bands.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/volatility/atr_test.go b/volatility/atr_test.go
index be8c6979..c31b603f 100644
--- a/volatility/atr_test.go
+++ b/volatility/atr_test.go
@@ -19,7 +19,7 @@ func TestAtr(t *testing.T) {
Atr float64
}
- input, err := helper.ReadFromCsvFile[Data]("testdata/atr.csv", true)
+ input, err := helper.ReadFromCsvFile[Data]("testdata/atr.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/volatility/bollinger_band_width_test.go b/volatility/bollinger_band_width_test.go
index c3218d7f..995a8ac3 100644
--- a/volatility/bollinger_band_width_test.go
+++ b/volatility/bollinger_band_width_test.go
@@ -17,7 +17,7 @@ func TestBollingerBandWidth(t *testing.T) {
Width float64
}
- input, err := helper.ReadFromCsvFile[Data]("testdata/bollinger_band_width.csv", true)
+ input, err := helper.ReadFromCsvFile[Data]("testdata/bollinger_band_width.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/volatility/bollinger_bands_test.go b/volatility/bollinger_bands_test.go
index ce655033..7d2aebae 100644
--- a/volatility/bollinger_bands_test.go
+++ b/volatility/bollinger_bands_test.go
@@ -19,7 +19,7 @@ func TestBollingerBands(t *testing.T) {
Lower float64
}
- input, err := helper.ReadFromCsvFile[Data]("testdata/bollinger_bands.csv", true)
+ input, err := helper.ReadFromCsvFile[Data]("testdata/bollinger_bands.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/volatility/chandelier_exit_test.go b/volatility/chandelier_exit_test.go
index 55951a57..f8493cd7 100644
--- a/volatility/chandelier_exit_test.go
+++ b/volatility/chandelier_exit_test.go
@@ -20,7 +20,7 @@ func TestChandelierExit(t *testing.T) {
Short float64
}
- input, err := helper.ReadFromCsvFile[Data]("testdata/chandelier_exit.csv", true)
+ input, err := helper.ReadFromCsvFile[Data]("testdata/chandelier_exit.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/volatility/donchian_channel_test.go b/volatility/donchian_channel_test.go
index 050f5623..c1c18f40 100644
--- a/volatility/donchian_channel_test.go
+++ b/volatility/donchian_channel_test.go
@@ -19,7 +19,7 @@ func TestDonchianChannel(t *testing.T) {
Lower float64
}
- input, err := helper.ReadFromCsvFile[Data]("testdata/donchian_channel.csv", true)
+ input, err := helper.ReadFromCsvFile[Data]("testdata/donchian_channel.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/volatility/keltner_channel_test.go b/volatility/keltner_channel_test.go
index d2ffa500..09d3617e 100644
--- a/volatility/keltner_channel_test.go
+++ b/volatility/keltner_channel_test.go
@@ -21,7 +21,7 @@ func TestKeltnerChannel(t *testing.T) {
Lower float64
}
- input, err := helper.ReadFromCsvFile[Data]("testdata/keltner_channel.csv", true)
+ input, err := helper.ReadFromCsvFile[Data]("testdata/keltner_channel.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/volatility/moving_std_test.go b/volatility/moving_std_test.go
index 9c74a82a..0e0a7439 100644
--- a/volatility/moving_std_test.go
+++ b/volatility/moving_std_test.go
@@ -17,7 +17,7 @@ func TestMovingStd(t *testing.T) {
Std float64
}
- input, err := helper.ReadFromCsvFile[Data]("testdata/moving_std.csv", true)
+ input, err := helper.ReadFromCsvFile[Data]("testdata/moving_std.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/volatility/percent_b_test.go b/volatility/percent_b_test.go
index f0d81f43..2f3ace4f 100644
--- a/volatility/percent_b_test.go
+++ b/volatility/percent_b_test.go
@@ -40,7 +40,7 @@ func TestPercentB(t *testing.T) {
PercentB float64
}
- input, err := helper.ReadFromCsvFile[Data]("testdata/percent_b.csv", true)
+ input, err := helper.ReadFromCsvFile[Data]("testdata/percent_b.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/volatility/po_test.go b/volatility/po_test.go
index d15387de..5d3de1a4 100644
--- a/volatility/po_test.go
+++ b/volatility/po_test.go
@@ -19,7 +19,7 @@ func TestPo(t *testing.T) {
Po float64
}
- input, err := helper.ReadFromCsvFile[Data]("testdata/po.csv", true)
+ input, err := helper.ReadFromCsvFile[Data]("testdata/po.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/volatility/super_trend_test.go b/volatility/super_trend_test.go
index 6bfe9ef0..7e7aa1f9 100644
--- a/volatility/super_trend_test.go
+++ b/volatility/super_trend_test.go
@@ -19,7 +19,7 @@ func TestSuperTrend(t *testing.T) {
SuperTrend float64
}
- input, err := helper.ReadFromCsvFile[Data]("testdata/super_trend.csv", true)
+ input, err := helper.ReadFromCsvFile[Data]("testdata/super_trend.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/volatility/ulcer_index_test.go b/volatility/ulcer_index_test.go
index e21bbdd1..b09f9636 100644
--- a/volatility/ulcer_index_test.go
+++ b/volatility/ulcer_index_test.go
@@ -17,7 +17,7 @@ func TestUlcerIndex(t *testing.T) {
UlcerIndex float64
}
- input, err := helper.ReadFromCsvFile[Data]("testdata/ulcer_index.csv", true)
+ input, err := helper.ReadFromCsvFile[Data]("testdata/ulcer_index.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/volume/ad_test.go b/volume/ad_test.go
index fb96186a..c1196de0 100644
--- a/volume/ad_test.go
+++ b/volume/ad_test.go
@@ -20,7 +20,7 @@ func TestAd(t *testing.T) {
Ad float64
}
- input, err := helper.ReadFromCsvFile[AdData]("testdata/ad.csv", true)
+ input, err := helper.ReadFromCsvFile[AdData]("testdata/ad.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/volume/cmf_test.go b/volume/cmf_test.go
index 4dbf6745..884e9c27 100644
--- a/volume/cmf_test.go
+++ b/volume/cmf_test.go
@@ -20,7 +20,7 @@ func TestCmf(t *testing.T) {
Cmf float64
}
- input, err := helper.ReadFromCsvFile[CmfData]("testdata/cmf.csv", true)
+ input, err := helper.ReadFromCsvFile[CmfData]("testdata/cmf.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/volume/emv_test.go b/volume/emv_test.go
index 5080b8e1..18c282b6 100644
--- a/volume/emv_test.go
+++ b/volume/emv_test.go
@@ -19,7 +19,7 @@ func TestEmv(t *testing.T) {
Emv float64
}
- input, err := helper.ReadFromCsvFile[EmvData]("testdata/emv.csv", true)
+ input, err := helper.ReadFromCsvFile[EmvData]("testdata/emv.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/volume/fi_test.go b/volume/fi_test.go
index 172154b2..95d38bc8 100644
--- a/volume/fi_test.go
+++ b/volume/fi_test.go
@@ -18,7 +18,7 @@ func TestFi(t *testing.T) {
Fi float64
}
- input, err := helper.ReadFromCsvFile[FiData]("testdata/fi.csv", true)
+ input, err := helper.ReadFromCsvFile[FiData]("testdata/fi.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/volume/mfi_test.go b/volume/mfi_test.go
index b1d926a6..65d801c4 100644
--- a/volume/mfi_test.go
+++ b/volume/mfi_test.go
@@ -20,7 +20,7 @@ func TestMfi(t *testing.T) {
Mfi float64
}
- input, err := helper.ReadFromCsvFile[MfiData]("testdata/mfi.csv", true)
+ input, err := helper.ReadFromCsvFile[MfiData]("testdata/mfi.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/volume/mfm_test.go b/volume/mfm_test.go
index 2fc1416a..a60dcf1b 100644
--- a/volume/mfm_test.go
+++ b/volume/mfm_test.go
@@ -19,7 +19,7 @@ func TestMfm(t *testing.T) {
Mfm float64
}
- input, err := helper.ReadFromCsvFile[MfmData]("testdata/mfm.csv", true)
+ input, err := helper.ReadFromCsvFile[MfmData]("testdata/mfm.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/volume/mfv_test.go b/volume/mfv_test.go
index a3d76e87..f2e74bf2 100644
--- a/volume/mfv_test.go
+++ b/volume/mfv_test.go
@@ -20,7 +20,7 @@ func TestMfv(t *testing.T) {
Mfv float64
}
- input, err := helper.ReadFromCsvFile[MfvData]("testdata/mfv.csv", true)
+ input, err := helper.ReadFromCsvFile[MfvData]("testdata/mfv.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/volume/nvi_test.go b/volume/nvi_test.go
index 1f87dc6f..0083f16c 100644
--- a/volume/nvi_test.go
+++ b/volume/nvi_test.go
@@ -18,7 +18,7 @@ func TestNvi(t *testing.T) {
Nvi float64
}
- input, err := helper.ReadFromCsvFile[NviData]("testdata/nvi.csv", true)
+ input, err := helper.ReadFromCsvFile[NviData]("testdata/nvi.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/volume/obv_test.go b/volume/obv_test.go
index efdd9381..68037a41 100644
--- a/volume/obv_test.go
+++ b/volume/obv_test.go
@@ -18,7 +18,7 @@ func TestObv(t *testing.T) {
Obv float64
}
- input, err := helper.ReadFromCsvFile[ObvData]("testdata/obv.csv", true)
+ input, err := helper.ReadFromCsvFile[ObvData]("testdata/obv.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/volume/vpt_test.go b/volume/vpt_test.go
index ca497326..5fd370e3 100644
--- a/volume/vpt_test.go
+++ b/volume/vpt_test.go
@@ -18,7 +18,7 @@ func TestVpt(t *testing.T) {
Vpt float64
}
- input, err := helper.ReadFromCsvFile[VptData]("testdata/vpt.csv", true)
+ input, err := helper.ReadFromCsvFile[VptData]("testdata/vpt.csv")
if err != nil {
t.Fatal(err)
}
diff --git a/volume/vwap_test.go b/volume/vwap_test.go
index baad1386..b37ee604 100644
--- a/volume/vwap_test.go
+++ b/volume/vwap_test.go
@@ -18,7 +18,7 @@ func TestVwap(t *testing.T) {
Vwap float64
}
- input, err := helper.ReadFromCsvFile[VwapData]("testdata/vwap.csv", true)
+ input, err := helper.ReadFromCsvFile[VwapData]("testdata/vwap.csv")
if err != nil {
t.Fatal(err)
}