package strategy import ( "fmt" "sig-pub/pkg/utils/collect" ) // 指标注册器 type SigStrategyRegistry struct { sigStrategies *collect.SyncMap[string, ISigStrategy] // 注册信号策略 intervalSigStrategies *collect.SyncMap[string, IIntervalSigStrategy] // 注册窗口指标 } func NewSigStrategyRegistry() *SigStrategyRegistry { return &SigStrategyRegistry{ sigStrategies: collect.NewSyncMap[string, ISigStrategy](), intervalSigStrategies: collect.NewSyncMap[string, IIntervalSigStrategy](), } } func (r *SigStrategyRegistry) Init() (err error) { // indicator regist r.MustRegistStrategy(&GoldX{}) r.MustRegistStrategy(&SupertrendBOSWaves{}) r.MustRegistStrategy(&CrossStar{}) return } // RegisterStrategy func (svc *SigStrategyRegistry) RegistStrategy(strategy ISigStrategy) (err error) { strategyName := strategy.Meta().Name _, loaded := svc.sigStrategies.LoadOrStore(strategyName, strategy) if loaded { err = fmt.Errorf("strategy name %s already duplicated", strategyName) return } return } func (svc *SigStrategyRegistry) MustRegistStrategy(strategy ISigStrategy) { if err := svc.RegistStrategy(strategy); err != nil { panic(err) } } // NewSigStrategy func (r *SigStrategyRegistry) NewSigStrategy(name string) (strategy ISigStrategy, ok bool) { strategy, ok = r.sigStrategies.Load(name) if ok { strategy = strategy.New() } return }