package indicator import ( "fmt" "sig-pub/pkg/trader" "sig-pub/pkg/types" "sig-pub/pkg/types/series" "github.com/spf13/cast" ) // RSI: 相对强弱指数 (RSI) // rsi define: https://www.investopedia.com/terms/r/rsi.asp type RSI struct { trader.Indicator series.Series values series.Floats prices series.Floats argBaseDay int32 } func NewRSI() *RSI { return &RSI{} } func (ind RSI) Meta() trader.IndicatorMeta { return trader.IndicatorMeta{ Name: "RSI", Desc: "", Args: []trader.Arg{ {Name: "基准天数", Desc: "", ArgType: trader.ArgTypeUInt}, }, } } func (ind *RSI) Init(indId int64, exchange any, args []string) (code trader.ErrorCode, err error) { arg0, err := cast.ToInt32E(args[0]) if err != nil { return } ind.argBaseDay = arg0 cast.ToIntE("1") return } func (ind *RSI) Update(klines []types.Kline) (err error) { for _, kline := range klines { c, ok := kline.Close.Float64() if !ok { err = fmt.Errorf("kline close to float64 error: %s", kline.Close.String()) return } ind.prices.Push(c) } diff := ind.prices.Diff() _ = diff return }