mirror of
https://github.com/c9s/bbgo.git
synced 2024-11-21 22:43:52 +00:00
optimizer: add metrics label
This commit is contained in:
parent
95c9fe4502
commit
b61af0db39
|
@ -104,6 +104,10 @@ var optimizeCmd = &cobra.Command{
|
|||
// print metrics JSON to stdout
|
||||
fmt.Println(string(out))
|
||||
} else {
|
||||
if len(metrics) > 0 {
|
||||
fmt.Printf("%v\n", metrics[0].Labels)
|
||||
}
|
||||
|
||||
for _, m := range metrics {
|
||||
fmt.Printf("%v => %v\n", m.Params, m.Value)
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package optimizer
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"sort"
|
||||
|
||||
|
@ -17,6 +18,7 @@ var TotalProfitMetricValueFunc = func(summaryReport *backtest.SummaryReport) fix
|
|||
}
|
||||
|
||||
type Metric struct {
|
||||
Labels []string `json:"labels,omitempty"`
|
||||
Params []interface{} `json:"params,omitempty"`
|
||||
Value fixedpoint.Value `json:"value,omitempty"`
|
||||
}
|
||||
|
@ -24,6 +26,7 @@ type Metric struct {
|
|||
type GridOptimizer struct {
|
||||
Config *Config
|
||||
|
||||
ParamLabels []string
|
||||
CurrentParams []interface{}
|
||||
}
|
||||
|
||||
|
@ -31,11 +34,18 @@ func (o *GridOptimizer) buildOps() []OpFunc {
|
|||
var ops []OpFunc
|
||||
|
||||
o.CurrentParams = make([]interface{}, len(o.Config.Matrix))
|
||||
o.ParamLabels = make([]string, len(o.Config.Matrix))
|
||||
|
||||
for i, selector := range o.Config.Matrix {
|
||||
var path = selector.Path
|
||||
var ii = i // copy variable because we need to use them in the closure
|
||||
|
||||
if selector.Label != "" {
|
||||
o.ParamLabels[ii] = selector.Label
|
||||
} else {
|
||||
o.ParamLabels[ii] = selector.Path
|
||||
}
|
||||
|
||||
switch selector.Type {
|
||||
case "range":
|
||||
min := selector.Min
|
||||
|
@ -52,7 +62,7 @@ func (o *GridOptimizer) buildOps() []OpFunc {
|
|||
|
||||
f := func(configJson []byte, next func(configJson []byte) error) error {
|
||||
for _, val := range values {
|
||||
jsonOp := []byte(fmt.Sprintf(`[ {"op": "replace", "path": "%s", "value": %v } ]`, path, val))
|
||||
jsonOp := []byte(reformatJson(fmt.Sprintf(`[{"op": "replace", "path": "%s", "value": %v }]`, path, val)))
|
||||
patch, err := jsonpatch.DecodePatch(jsonOp)
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -82,7 +92,7 @@ func (o *GridOptimizer) buildOps() []OpFunc {
|
|||
for _, val := range values {
|
||||
log.Debugf("%d %s: %v of %v", ii, path, val, values)
|
||||
|
||||
jsonOp := []byte(fmt.Sprintf(`[{"op": "replace", "path": "%s", "value": "%s"}]`, path, val))
|
||||
jsonOp := []byte(reformatJson(fmt.Sprintf(`[{"op": "replace", "path": "%s", "value": "%s"}]`, path, val)))
|
||||
patch, err := jsonpatch.DecodePatch(jsonOp)
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -122,12 +132,12 @@ func (o *GridOptimizer) Run(executor Executor, configJson []byte) ([]Metric, err
|
|||
return err
|
||||
}
|
||||
|
||||
// TODO: Add other metric value function
|
||||
// TODO: Add more metric value function
|
||||
metricValue := TotalProfitMetricValueFunc(summaryReport)
|
||||
|
||||
// TODO: replace this with a local variable and return it as a function result
|
||||
metrics = append(metrics, Metric{
|
||||
Params: o.CurrentParams,
|
||||
Labels: o.ParamLabels,
|
||||
Value: metricValue,
|
||||
})
|
||||
|
||||
|
@ -158,3 +168,14 @@ func (o *GridOptimizer) Run(executor Executor, configJson []byte) ([]Metric, err
|
|||
})
|
||||
return metrics, err
|
||||
}
|
||||
|
||||
func reformatJson(text string) string {
|
||||
var a interface{}
|
||||
var err = json.Unmarshal([]byte(text), &a)
|
||||
if err != nil {
|
||||
return "{invalid json}"
|
||||
}
|
||||
|
||||
out, _ := json.MarshalIndent(a, "", " ")
|
||||
return string(out)
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user