move and refactor functions

This commit is contained in:
c9s 2022-05-17 18:23:09 +08:00
parent 6c0165afe4
commit 1cc4c69c66
No known key found for this signature in database
GPG Key ID: 7385E7E464CB0A54
5 changed files with 81 additions and 47 deletions

View File

@ -1,7 +1,11 @@
package backtest package backtest
import ( import (
"encoding/json"
"fmt" "fmt"
"io/ioutil"
"os"
"path/filepath"
"strings" "strings"
"time" "time"
@ -9,6 +13,7 @@ import (
"github.com/c9s/bbgo/pkg/bbgo" "github.com/c9s/bbgo/pkg/bbgo"
"github.com/c9s/bbgo/pkg/fixedpoint" "github.com/c9s/bbgo/pkg/fixedpoint"
"github.com/c9s/bbgo/pkg/types" "github.com/c9s/bbgo/pkg/types"
"github.com/c9s/bbgo/pkg/util"
) )
type Run struct { type Run struct {
@ -56,3 +61,29 @@ func FormatSessionName(sessions []string, symbols []string, startTime, endTime t
endTime.Format(SessionTimeFormat), endTime.Format(SessionTimeFormat),
) )
} }
func WriteReportIndex(outputDirectory string, reportIndex *ReportIndex) error {
indexFile := filepath.Join(outputDirectory, "index.json")
if err := util.WriteJsonFile(indexFile, reportIndex); err != nil {
return err
}
return nil
}
func LoadReportIndex(outputDirectory string) (*ReportIndex, error) {
var reportIndex ReportIndex
indexFile := filepath.Join(outputDirectory, "index.json")
if _, err := os.Stat(indexFile); err == nil {
o, err := ioutil.ReadFile(indexFile)
if err != nil {
return nil, err
}
if err := json.Unmarshal(o, &reportIndex); err != nil {
return nil, err
}
}
return &reportIndex, nil
}

View File

@ -3,9 +3,7 @@ package cmd
import ( import (
"bufio" "bufio"
"context" "context"
"encoding/json"
"fmt" "fmt"
"io/ioutil"
"os" "os"
"path/filepath" "path/filepath"
"strings" "strings"
@ -26,6 +24,7 @@ import (
"github.com/c9s/bbgo/pkg/data/tsv" "github.com/c9s/bbgo/pkg/data/tsv"
"github.com/c9s/bbgo/pkg/service" "github.com/c9s/bbgo/pkg/service"
"github.com/c9s/bbgo/pkg/types" "github.com/c9s/bbgo/pkg/types"
"github.com/c9s/bbgo/pkg/util"
) )
func init() { func init() {
@ -301,7 +300,7 @@ var BacktestCmd = &cobra.Command{
} }
kLineDataDir := filepath.Join(reportDir, "klines") kLineDataDir := filepath.Join(reportDir, "klines")
if err := safeMkdirAll(kLineDataDir); err != nil { if err := util.SafeMkdirAll(kLineDataDir); err != nil {
return err return err
} }
@ -526,7 +525,7 @@ var BacktestCmd = &cobra.Command{
Manifests: manifests, Manifests: manifests,
} }
if err := writeJsonFile(filepath.Join(outputDirectory, symbol+".json"), &result); err != nil { if err := util.WriteJsonFile(filepath.Join(outputDirectory, symbol+".json"), &result); err != nil {
return err return err
} }
} }
@ -581,31 +580,18 @@ var BacktestCmd = &cobra.Command{
if generatingReport && reportFileInSubDir { if generatingReport && reportFileInSubDir {
// append report index // append report index
var reportIndex backtest.ReportIndex reportIndex, err := backtest.LoadReportIndex(outputDirectory)
indexFile := filepath.Join(outputDirectory, "index.json")
if _, err := os.Stat(indexFile); err == nil {
o, err := ioutil.ReadFile(indexFile)
if err != nil { if err != nil {
return err return err
} }
if err := json.Unmarshal(o, &reportIndex); err != nil {
return err
}
}
reportIndex.Runs = append(reportIndex.Runs, backtest.Run{ reportIndex.Runs = append(reportIndex.Runs, backtest.Run{
ID: runID, ID: runID,
Config: userConfig, Config: userConfig,
Time: time.Now(), Time: time.Now(),
}) })
o, err := json.MarshalIndent(reportIndex, "", " ") if err := backtest.WriteReportIndex(outputDirectory, reportIndex); err != nil {
if err != nil {
return err
}
if err := ioutil.WriteFile(indexFile, o, 0644); err != nil {
return err return err
} }
} }
@ -646,32 +632,6 @@ func confirmation(s string) bool {
} }
} }
func writeJsonFile(p string, obj interface{}) error {
out, err := json.MarshalIndent(obj, "", " ")
if err != nil {
return err
}
return ioutil.WriteFile(p, out, 0644)
}
func safeMkdirAll(p string) error {
st, err := os.Stat(p)
if err == nil {
if !st.IsDir() {
return fmt.Errorf("path %s is not a directory", p)
}
return nil
}
if os.IsNotExist(err) {
return os.MkdirAll(p, 0755)
}
return nil
}
func toExchangeSources(sessions map[string]*bbgo.ExchangeSession) (exchangeSources []backtest.ExchangeDataSource, err error) { func toExchangeSources(sessions map[string]*bbgo.ExchangeSession) (exchangeSources []backtest.ExchangeDataSource, err error) {
for _, session := range sessions { for _, session := range sessions {
exchange := session.Exchange.(*backtest.Exchange) exchange := session.Exchange.(*backtest.Exchange)

View File

@ -266,6 +266,11 @@ func (t *LooseFormatTime) UnmarshalJSON(data []byte) error {
return nil return nil
} }
func (t LooseFormatTime) MarshalJSON() ([]byte, error) {
return []byte(strconv.Quote(time.Time(t).Format(time.RFC3339))), nil
}
func (t LooseFormatTime) Time() time.Time { func (t LooseFormatTime) Time() time.Time {
return time.Time(t) return time.Time(t)
} }

23
pkg/util/dir.go Normal file
View File

@ -0,0 +1,23 @@
package util
import (
"fmt"
"os"
)
func SafeMkdirAll(p string) error {
st, err := os.Stat(p)
if err == nil {
if !st.IsDir() {
return fmt.Errorf("path %s is not a directory", p)
}
return nil
}
if os.IsNotExist(err) {
return os.MkdirAll(p, 0755)
}
return nil
}

15
pkg/util/json.go Normal file
View File

@ -0,0 +1,15 @@
package util
import (
"encoding/json"
"io/ioutil"
)
func WriteJsonFile(p string, obj interface{}) error {
out, err := json.MarshalIndent(obj, "", " ")
if err != nil {
return err
}
return ioutil.WriteFile(p, out, 0644)
}