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.
67 lines
1.5 KiB
67 lines
1.5 KiB
package sig |
|
|
|
import ( |
|
"sig-pub/pkg/indicator" |
|
"sig-pub/pkg/types" |
|
"sig-pub/pkg/types/series" |
|
"sig-pub/pkg/zlog" |
|
) |
|
|
|
type IOffsetIndicatorContext interface { |
|
indicator.IIndicatorContext |
|
SetOffset(offset int16) |
|
AddOffset(offset int16) |
|
GetOffset() (offset int16) |
|
} |
|
|
|
// IndicatorContext 指标上下文, 提供k线序列给指标计算使用 |
|
type IndicatorContext struct { |
|
IOffsetIndicatorContext |
|
input types.Input |
|
kSeries *KlineSeries |
|
offset int16 |
|
} |
|
|
|
func NewIndicatorContext(input types.Input, kSeries *KlineSeries) *IndicatorContext { |
|
return &IndicatorContext{ |
|
input: input, |
|
kSeries: kSeries, |
|
} |
|
} |
|
|
|
func (c *IndicatorContext) SetOffset(offset int16) { |
|
c.offset = offset |
|
} |
|
|
|
func (c *IndicatorContext) AddOffset(offset int16) { |
|
c.offset += offset |
|
} |
|
|
|
func (c *IndicatorContext) GetOffset() (offset int16) { |
|
return c.offset |
|
} |
|
|
|
func (c *IndicatorContext) Input() (in types.Input) { |
|
return c.input |
|
} |
|
|
|
func (c *IndicatorContext) Get(offset int16) (kline types.Kline) { |
|
offset += c.offset |
|
k, err := c.kSeries.Get(offset) |
|
if err != nil { |
|
lastTs := c.kSeries.LastTs() |
|
zlog.Warningf("get kline series offset out of range: offset=%d, length=%d, lastTs=%d", offset, c.kSeries.Length(), lastTs) |
|
panic(err) |
|
} |
|
return k |
|
} |
|
|
|
func (c *IndicatorContext) Series(offset, count int16) (klines series.Klines) { |
|
offset += c.offset |
|
ks, err := c.kSeries.Series(offset, count) |
|
if err != nil { |
|
zlog.Warningf("get kline series offset out of range: offset=%d, count=%d, length=%d, lastTs=%d", offset, count, c.kSeries.Length(), c.kSeries.LastTs()) |
|
panic(err) |
|
} |
|
return ks |
|
}
|
|
|