package strategy import ( "fmt" "github.com/spf13/cast" ) // 策略默认参数 type ISigStrategyDefaultParam interface { DefaultParam() map[string]string } // todo Meta 策略调参, 回测引擎自动调参回测(最佳参数) argGenerator.next() (arg, ok) // argA range -> [1,...,5], argB:=[0.1,...,0.7], argC:=[true,false] // 可变参数组合 argValidate(argA, ArgB, argC...) bool(true则使用该组合进行回测,记录组合参数回测结果) type ISigStrategyParamGenerator interface { NextParam(map[string]string) (map[string]string, bool) // 根据当前策略参数, 返回下一批策略参数(并行回测 stateless) } type StrategyParam map[string]string func (s *StrategyParam) Get(key string) (v string, ok bool) { if len(*s) == 0 { return } v, ok = (*s)[key] return } func (s *StrategyParam) GetE(key string) (v string, err error) { if len(*s) == 0 { return } v, ok := (*s)[key] if !ok { err = fmt.Errorf("param %s not provided", key) return } return } func (s *StrategyParam) GetInt(key string) (r int, ok bool) { v, ok := s.Get(key) if !ok { return } r, err := cast.ToIntE(v) if ok = err == nil; !ok { return } return } func (s *StrategyParam) GetInt16E(key string) (r int16, err error) { v, err := s.GetE(key) if err != nil { return } r, err = cast.ToInt16E(v) return } func (s *StrategyParam) GetFloat64(key string) (r float64, ok bool) { r, err := s.GetFloat64E(key) if err != nil { return } return r, true } func (s *StrategyParam) GetFloat64E(key string) (r float64, err error) { v, err := s.GetE(key) if err != nil { return } r, err = cast.ToFloat64E(v) return } func (s *StrategyParam) GetBool(key string) (r bool, ok bool) { v, ok := s.Get(key) if !ok { return } r, err := cast.ToBoolE(v) if ok = err == nil; !ok { return } return }