From 14fff8dbadc2dcb13c677661691f12cd020e8280 Mon Sep 17 00:00:00 2001 From: c9s Date: Sat, 24 Aug 2024 11:42:07 +0800 Subject: [PATCH] xmaker: integrate circuitbreaker --- pkg/risk/circuitbreaker/basic.go | 4 +++- pkg/strategy/xmaker/strategy.go | 11 +++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/pkg/risk/circuitbreaker/basic.go b/pkg/risk/circuitbreaker/basic.go index b58fbe8e6..3a7e06dc3 100644 --- a/pkg/risk/circuitbreaker/basic.go +++ b/pkg/risk/circuitbreaker/basic.go @@ -116,7 +116,7 @@ type BasicCircuitBreaker struct { } func NewBasicCircuitBreaker(strategyID, strategyInstance string) *BasicCircuitBreaker { - return &BasicCircuitBreaker{ + b := &BasicCircuitBreaker{ MaximumConsecutiveLossTimes: 8, MaximumHaltTimes: 3, MaximumHaltTimesExceededPanic: false, @@ -125,6 +125,8 @@ func NewBasicCircuitBreaker(strategyID, strategyInstance string) *BasicCircuitBr strategyInstance: strategyInstance, metricsLabels: prometheus.Labels{"strategy": strategyID, "strategyInstance": strategyInstance}, } + b.updateMetrics() + return b } func (b *BasicCircuitBreaker) getMetricsLabels() prometheus.Labels { diff --git a/pkg/strategy/xmaker/strategy.go b/pkg/strategy/xmaker/strategy.go index f5412fd27..86a71b2ce 100644 --- a/pkg/strategy/xmaker/strategy.go +++ b/pkg/strategy/xmaker/strategy.go @@ -14,6 +14,7 @@ import ( "github.com/c9s/bbgo/pkg/core" "github.com/c9s/bbgo/pkg/fixedpoint" "github.com/c9s/bbgo/pkg/indicator" + "github.com/c9s/bbgo/pkg/risk/circuitbreaker" "github.com/c9s/bbgo/pkg/types" "github.com/c9s/bbgo/pkg/util" ) @@ -98,6 +99,8 @@ type Strategy struct { state *State + CircuitBreaker *circuitbreaker.BasicCircuitBreaker `json:"circuitBreaker"` + // persistence fields Position *types.Position `json:"position,omitempty" persistence:"position"` ProfitStats *ProfitStats `json:"profitStats,omitempty" persistence:"profit_stats"` @@ -630,6 +633,14 @@ func (s *Strategy) tradeRecover(ctx context.Context) { } } +func (s *Strategy) Defaults() error { + if s.CircuitBreaker == nil { + s.CircuitBreaker = circuitbreaker.NewBasicCircuitBreaker(ID, s.InstanceID()) + } + + return nil +} + func (s *Strategy) Validate() error { if s.Quantity.IsZero() || s.QuantityScale == nil { return errors.New("quantity or quantityScale can not be empty")