package indicator import ( "fmt" "sig-pub/pkg/utils/collect" ) // 指标注册器 type IndicatorRegistry struct { indicators *collect.SyncMap[string, IIndicator] // 注册窗口指标 summaryIndicators *collect.SyncMap[string, func() ISummaryIndicator] // 注册汇总指标 } func NewIndicatorRegistry() *IndicatorRegistry { return &IndicatorRegistry{ indicators: collect.NewSyncMap[string, IIndicator](), summaryIndicators: collect.NewSyncMap[string, func() ISummaryIndicator](), } } func (r *IndicatorRegistry) Init() (err error) { // indicator regist r.MustRegistIndicator(&RSI{}) r.MustRegistIndicator(&SMA{}) r.MustRegistIndicator(&ATR{}) r.MustRegistIndicator(&EMA{}) r.MustRegistIndicator(&MACD{}) r.MustRegistIndicator(&OBV{}) r.MustRegistIndicator(&WOBV{}) r.MustRegistIndicator(&BOLL{}) r.MustRegistIndicator(&SuperTrend{}) r.MustRegistIndicator(&ADX{}) r.MustRegistIndicator(&KDJ{}) r.MustRegistIndicator(&RVI{}) r.MustRegistSummaryIndicator(func() ISummaryIndicator { return &VRVP{} }) return } // RegistIndicator func (r *IndicatorRegistry) RegistIndicator(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) MustRegistIndicator(ind IIndicator) { if err := r.RegistIndicator(ind); err != nil { panic(err) } } // RegistSummaryIndicator func (r *IndicatorRegistry) RegistSummaryIndicator(indNewer func() ISummaryIndicator) (err error) { indName := indNewer().Meta().Name _, loaded := r.summaryIndicators.LoadOrStore(indName, indNewer) if loaded { err = fmt.Errorf("summary indicator name %s already duplicated", indName) return } return } func (r *IndicatorRegistry) MustRegistSummaryIndicator(indNewer func() ISummaryIndicator) { if err := r.RegistSummaryIndicator(indNewer); err != nil { panic(err) } } // Indicator func (r *IndicatorRegistry) Indicator(name string) (indW IIndicator, ok bool) { return r.indicators.Load(name) } // SummaryIndicator func (r *IndicatorRegistry) SummaryIndicatorNewer(name string) (indNewer func() ISummaryIndicator, ok bool) { indNewer, ok = r.summaryIndicators.Load(name) return } // SummaryIndicator func (r *IndicatorRegistry) SummaryIndicator(name string) (indW ISummaryIndicator, ok bool) { indNewer, ok := r.SummaryIndicatorNewer(name) if !ok { return } indW = indNewer() return } func (r *IndicatorRegistry) RangeIndicators(fn func(k string, v IIndicator) bool) { r.indicators.Range(fn) }