You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

41 lines
945 B

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
}