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
937 B
41 lines
937 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("obv", 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("obv", vector) |
|
return |
|
}
|
|
|