package indicator import "sig-pub/pkg/types" // OBV 成交量平衡指标 // 1. 初始状态:OBV_0 = 0。 // 2. 若 Close_t > Close_{t-1}:OBV_t = OBV_{t-1} + Volume_t。 // 3. 若 Close_t < Close_{t-1}:OBV_t = OBV_{t-1} - Volume_t。 // 4. 平盘:OBV_t = OBV_{t-1}。 // 状态:前一 OBV 值。用于判断资金流入/流出 type OBV struct { } func (c *OBV) Meta() IndicatorMeta { return IndicatorMeta{ Name: "OBV", Input: []types.InputArg{}, // todo 无参指标tsdb存储 } } func (c *OBV) CandlePeriods(ctx IIndicatorContext) int16 { return 2 } func (c *OBV) Calculate(ctx IIndicatorContext) (vector float64) { obvPrev, ok := ctx.State().Get("_vector", 1) if !ok { obvPrev = 0 } k := ctx.Get(0) cmp := k.Close.Cmp(ctx.Get(1).Close) if cmp > 0 { vector = obvPrev + k.VolF64() } else if cmp < 0 { vector = obvPrev - k.VolF64() } else { vector = obvPrev } ctx.State().Set("_vector", vector) return }