Documentation ¶
Index ¶
- Constants
- func Walk(fn func(Node), nodes ...Node)
- type DevCircuitBreakerNode
- type ErrModelNotFound
- type MapMeta
- type Node
- type OriginNode
- func (n *OriginNode) AddNodes(nodes ...Node) error
- func (n *OriginNode) DataPoint() datapoint.Point
- func (n *OriginNode) IsExpired() bool
- func (n *OriginNode) IsFresh() bool
- func (n *OriginNode) Meta() map[string]any
- func (n *OriginNode) Nodes() []Node
- func (n *OriginNode) Origin() string
- func (n *OriginNode) Query() any
- func (n *OriginNode) SetDataPoint(point datapoint.Point) error
- type Provider
- func (p Provider) DataPoint(ctx context.Context, model string) (datapoint.Point, error)
- func (p Provider) DataPoints(ctx context.Context, models ...string) (map[string]datapoint.Point, error)
- func (p Provider) Model(_ context.Context, model string) (datapoint.Model, error)
- func (p Provider) ModelNames(_ context.Context) []string
- func (p Provider) Models(_ context.Context, models ...string) (map[string]datapoint.Model, error)
- type ReferenceNode
- type TickAliasNode
- type TickIndirectNode
- type TickInvertNode
- type TickMedianNode
- type Updater
- type WrapperNode
Constants ¶
const UpdaterLoggerTag = "GRAPH_UPDATER"
Variables ¶
This section is empty.
Functions ¶
Types ¶
type DevCircuitBreakerNode ¶
type DevCircuitBreakerNode struct {
// contains filtered or unexported fields
}
DevCircuitBreakerNode is a circuit breaker that tips if the value deviation between two nodes is greater than the breaker value.
It must have three nodes. First node is the value, second is the reference value and third is the threshold value.
The value deviation is calculated as: abs(1.0 - (reference / value))
All nodes must return a value that implements the data.NumericValue interface.
func NewDevCircuitBreakerNode ¶
func NewDevCircuitBreakerNode() *DevCircuitBreakerNode
NewDevCircuitBreakerNode creates a new DevCircuitBreakerNode instance.
func (*DevCircuitBreakerNode) AddNodes ¶
func (n *DevCircuitBreakerNode) AddNodes(nodes ...Node) error
AddNodes implements the Node interface.
If more than three nodes are added, an error is returned.
func (*DevCircuitBreakerNode) DataPoint ¶
func (n *DevCircuitBreakerNode) DataPoint() datapoint.Point
DataPoint implements the Node interface.
func (*DevCircuitBreakerNode) Meta ¶
func (n *DevCircuitBreakerNode) Meta() map[string]any
Meta implements the Node interface.
func (*DevCircuitBreakerNode) Nodes ¶
func (n *DevCircuitBreakerNode) Nodes() []Node
Nodes implements the Node interface.
type ErrModelNotFound ¶
type ErrModelNotFound struct {
// contains filtered or unexported fields
}
func (ErrModelNotFound) Error ¶
func (e ErrModelNotFound) Error() string
type Node ¶
type Node interface { // Nodes returns a list of nodes that are connected to the current node. Nodes() []Node // AddNodes adds nodes to the current node. AddNodes(...Node) error // DataPoint returns a data point for the current node. Leaf nodes return // a data point from a data source, while other nodes return a data point // calculated from the data points of connected nodes. DataPoint() datapoint.Point // Meta returns a map that contains meta information about the node used // to debug price models. It should not contain data that is accessible // from node's methods. Meta() map[string]any }
Node represents a node in a graph.
A node can use data from connected nodes to calculate its own data or it can return data from a data source.
func DetectCycle ¶
DetectCycle returns a cycle path in the given graph if a cycle is detected, otherwise returns an empty slice.
type OriginNode ¶
type OriginNode struct {
// contains filtered or unexported fields
}
OriginNode is a node that provides a data point for a specific origin.
func NewOriginNode ¶
func NewOriginNode( origin string, query any, freshnessThreshold time.Duration, expiryThreshold time.Duration, ) *OriginNode
NewOriginNode creates a new OriginNode instance.
The query argument is used to fetch a data point from the origin.
The freshnessThreshold and expiryThreshold arguments are used to determine whether a data point is fresh or expired.
A data point is considered fresh if it was updated within the freshnessThreshold duration. In this case, the data point update is not required.
A data point is considered expired if it was updated more than the expiryThreshold duration ago. In this case, the data point is considered invalid and an update is required.
There must be a gap between the freshnessThreshold and expiryThreshold so that a data point will be updated before it is considered expired.
func (*OriginNode) AddNodes ¶
func (n *OriginNode) AddNodes(nodes ...Node) error
AddNodes implements the Node interface.
func (*OriginNode) DataPoint ¶
func (n *OriginNode) DataPoint() datapoint.Point
DataPoint implements the Node interface.
func (*OriginNode) IsExpired ¶
func (n *OriginNode) IsExpired() bool
IsExpired returns true if the price is considered expired.
func (*OriginNode) IsFresh ¶
func (n *OriginNode) IsFresh() bool
IsFresh returns true if the price is considered fresh, that is, the price update is not required.
Note, that the price that is not fresh is not necessarily expired.
func (*OriginNode) Meta ¶
func (n *OriginNode) Meta() map[string]any
Meta implements the Node interface.
func (*OriginNode) Query ¶
func (n *OriginNode) Query() any
Query returns the query used to fetch the data point.
func (*OriginNode) SetDataPoint ¶
func (n *OriginNode) SetDataPoint(point datapoint.Point) error
SetDataPoint sets the data point.
If the provided data point is older than the current data point, it will be ignored and an error will be returned.
If the provided data point is invalid, it will be ignored as long as the current data point is still valid. This is done to prevent from updating valid data points with invalid ones. In this case, the error will be returned.
type Provider ¶
type Provider struct {
// contains filtered or unexported fields
}
Provider is a data provider which uses a graph structure to provide data points.
func NewProvider ¶
NewProvider creates a new price data.
Models are map of data models graphs keyed by their data model name.
Updater is an optional updater which will be used to update the data models before returning the data point.
func (Provider) DataPoints ¶
func (p Provider) DataPoints(ctx context.Context, models ...string) (map[string]datapoint.Point, error)
DataPoints implements the data.Provider interface.
func (Provider) ModelNames ¶
ModelNames implements the data.Provider interface.
type ReferenceNode ¶
type ReferenceNode struct {
// contains filtered or unexported fields
}
ReferenceNode is a node that references another node.
func NewReferenceNode ¶
func NewReferenceNode() *ReferenceNode
NewReferenceNode creates a new ReferenceNode instance.
func (*ReferenceNode) AddNodes ¶
func (n *ReferenceNode) AddNodes(nodes ...Node) error
AddNodes implements the Node interface.
func (*ReferenceNode) DataPoint ¶
func (n *ReferenceNode) DataPoint() datapoint.Point
DataPoint implements the Node interface.
func (*ReferenceNode) Meta ¶
func (n *ReferenceNode) Meta() map[string]any
Meta implements the Node interface.
func (*ReferenceNode) Nodes ¶
func (n *ReferenceNode) Nodes() []Node
Nodes implements the Node interface.
type TickAliasNode ¶
type TickAliasNode struct {
// contains filtered or unexported fields
}
TickAliasNode is a node that aliases another tick's asset pair.
It expects one node that returns a data point with an value.Tick value.
func NewTickAliasNode ¶
func NewTickAliasNode(alias value.Pair) *TickAliasNode
NewTickAliasNode creates a new TickAliasNode instance.
func (*TickAliasNode) AddNodes ¶
func (n *TickAliasNode) AddNodes(nodes ...Node) error
AddNodes implements the Node interface.
Only one node is allowed. If more than one node is added, an error is returned.
func (*TickAliasNode) DataPoint ¶
func (n *TickAliasNode) DataPoint() datapoint.Point
DataPoint implements the Node interface.
func (*TickAliasNode) Meta ¶
func (n *TickAliasNode) Meta() map[string]any
Meta implements the Node interface.
func (*TickAliasNode) Nodes ¶
func (n *TickAliasNode) Nodes() []Node
Nodes implements the Node interface.
type TickIndirectNode ¶
type TickIndirectNode struct {
// contains filtered or unexported fields
}
TickIndirectNode is a node that calculates cross rate from the list of price ticks from its nodes.
It expects that all nodes return data points with value.Tick values.
The order of nodes is important because prices are calculated from first to last. Adjacent nodes must have one common asset.
func NewTickIndirectNode ¶
func NewTickIndirectNode() *TickIndirectNode
NewTickIndirectNode creates a new TickIndirectNode instance.
func (*TickIndirectNode) AddNodes ¶
func (n *TickIndirectNode) AddNodes(nodes ...Node) error
AddNodes implements the Node interface.
func (*TickIndirectNode) DataPoint ¶
func (n *TickIndirectNode) DataPoint() datapoint.Point
DataPoint implements the Node interface.
func (*TickIndirectNode) Meta ¶
func (n *TickIndirectNode) Meta() map[string]any
Meta implements the Node interface.
func (*TickIndirectNode) Nodes ¶
func (n *TickIndirectNode) Nodes() []Node
Nodes implements the Node interface.
type TickInvertNode ¶
type TickInvertNode struct {
// contains filtered or unexported fields
}
TickInvertNode is a node that inverts a price. E.g. if the asset query is BTC/USD and the price is 1000, then the asset pair will be USD/BTC and the price will be 0.001.
It expects one node that returns a data point with an value.Tick value.
func NewTickInvertNode ¶
func NewTickInvertNode() *TickInvertNode
NewTickInvertNode creates a new TickInvertNode instance.
func (*TickInvertNode) AddNodes ¶
func (n *TickInvertNode) AddNodes(nodes ...Node) error
AddNodes implements the Node interface.
Only one node is allowed. If more than one node is added, an error is returned.
func (*TickInvertNode) DataPoint ¶
func (n *TickInvertNode) DataPoint() datapoint.Point
DataPoint implements the Node interface.
func (*TickInvertNode) Meta ¶
func (n *TickInvertNode) Meta() map[string]any
Meta implements the Node interface.
func (*TickInvertNode) Nodes ¶
func (n *TickInvertNode) Nodes() []Node
Nodes implements the Node interface.
type TickMedianNode ¶
type TickMedianNode struct {
// contains filtered or unexported fields
}
TickMedianNode is a node that calculates median value from its nodes.
It expects that all nodes return data points with value.Tick values.
func NewTickMedianNode ¶
func NewTickMedianNode(min int) *TickMedianNode
NewTickMedianNode creates a new TickMedianNode instance.
The min argument is a minimum number of valid prices obtained from nodes required to calculate median price.
func (*TickMedianNode) AddNodes ¶
func (n *TickMedianNode) AddNodes(nodes ...Node) error
AddNodes implements the Node interface.
func (*TickMedianNode) DataPoint ¶
func (n *TickMedianNode) DataPoint() datapoint.Point
DataPoint implements the Node interface.
func (*TickMedianNode) Meta ¶
func (n *TickMedianNode) Meta() map[string]any
Meta implements the Node interface.
func (*TickMedianNode) Nodes ¶
func (n *TickMedianNode) Nodes() []Node
Nodes implements the Node interface.
type Updater ¶
type Updater struct {
// contains filtered or unexported fields
}
Updater updates the origin nodes using points from the origins.
func NewUpdater ¶
NewUpdater returns a new Updater instance.
type WrapperNode ¶
type WrapperNode struct {
// contains filtered or unexported fields
}
WrapperNode is a node that wraps another node with a custom meta. It is useful for adding additional information to the node to better describe a price model.
func NewWrapperNode ¶
func NewWrapperNode(node Node, meta map[string]any) *WrapperNode
NewWrapperNode creates a new WrapperNode instance.
func (*WrapperNode) AddNodes ¶
func (n *WrapperNode) AddNodes(nodes ...Node) error
AddNodes implements the Node interface.
Only one node is allowed. If more than one node is added, an error is returned.
func (*WrapperNode) DataPoint ¶
func (n *WrapperNode) DataPoint() datapoint.Point
DataPoint implements the Node interface.
func (*WrapperNode) Meta ¶
func (n *WrapperNode) Meta() map[string]any
Meta implements the Node interface.
func (*WrapperNode) Nodes ¶
func (n *WrapperNode) Nodes() []Node
Nodes implements the Node interface.