package trader import ( "fmt" "sig-pub/pkg/types" "sig-pub/pkg/types/series" "sig-pub/pkg/zlog" "github.com/spf13/cast" ) // stateful type StrategyTrendTrace struct { intervalDatas map[types.Interval]*series.LimitFloats argBaseLine int } func NewStrategyTrendTrace() *StrategyTrendTrace { return &StrategyTrendTrace{} } func (StrategyTrendTrace) Meta() StrategyMeta { return StrategyMeta{ SubIntervals: []types.Interval{ types.Interval5m, types.Interval15m, types.Interval1d, }, } } func (s *StrategyTrendTrace) initArgs(args map[string]string) (err error) { return } func (s *StrategyTrendTrace) Init(ctx StrategyContext, args map[string]string) (code ErrorCode, err error) { s.argBaseLine, err = cast.ToIntE(args["baseLine"]) if err != nil { return } if s.argBaseLine <= 0 { } s.intervalDatas = map[types.Interval]*series.LimitFloats{ types.Interval5m: series.NewLimitFloats(s.argBaseLine), types.Interval15m: series.NewLimitFloats(s.argBaseLine), types.Interval1d: series.NewLimitFloats(s.argBaseLine), } return } func (s *StrategyTrendTrace) Update(ctx StrategyContext, kline types.Kline) (code ErrorCode, err error) { data, ok := s.intervalDatas[kline.Interval] if !ok { zlog.Warningf("ignore interval kline: %v", kline.Interval) return } v, ok := kline.Close.Float64() if !ok { code = ErrorCodeKline err = fmt.Errorf("kline close value error: %#v", kline) return } data.Push(v) // calc klines s.caculate() return } func (s *StrategyTrendTrace) caculate() { // 5m判断趋势, 15m/1h 确认趋势 datas5m := s.intervalDatas[types.Interval5m] minV, maxV := datas5m.MinMax() _, _ = minV, maxV }