package indicator import ( "fmt" "sig-pub/pkg/utils/collect" ) // 指标注册器 type IndicatorRegistry struct { indicators *collect.SyncMap[string, IIndicator] // 注册窗口指标 } func NewIndicatorRegistry() *IndicatorRegistry { return &IndicatorRegistry{ indicators: collect.NewSyncMap[string, IIndicator](), } } func (r *IndicatorRegistry) Init() (err error) { // indicator regist r.MustRegistIndicatorW(&RSI{}) r.MustRegistIndicatorW(&SMA{}) r.MustRegistIndicatorW(&ATR{}) r.MustRegistIndicatorW(&EMA{}) r.MustRegistIndicatorW(&MacdDIF{}) r.MustRegistIndicatorW(&MacdDEA{}) r.MustRegistIndicatorW(&Macd{}) r.MustRegistIndicatorW(&OBV{}) r.MustRegistIndicatorW(&WOBV{}) return } // RegistIndicatorW func (r *IndicatorRegistry) RegistIndicatorW(ind IIndicator) (err error) { indName := ind.Meta().Name _, loaded := r.indicators.LoadOrStore(indName, ind) if loaded { err = fmt.Errorf("window indicator name %s already duplicated", indName) return } return } func (r *IndicatorRegistry) MustRegistIndicatorW(ind IIndicator) { if err := r.RegistIndicatorW(ind); err != nil { panic(err) } } // Indicator func (r *IndicatorRegistry) Indicator(name string) (indW IIndicator, ok bool) { return r.indicators.Load(name) }