Merge pull request #1318 from c9s/narumi/common-risk

CHORE: add IsHalted method to common.Strategy for CircuitBreakRiskControl
This commit is contained in:
c9s 2023-09-25 18:07:57 +08:00 committed by GitHub
commit cf31796224
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 16 additions and 8 deletions

View File

@ -19,7 +19,6 @@ type CircuitBreakRiskControl struct {
lossThreshold fixedpoint.Value
haltedDuration time.Duration
isHalted bool
haltedAt time.Time
}
@ -59,10 +58,10 @@ func (c *CircuitBreakRiskControl) IsHalted(t time.Time) bool {
c.profitStats.TodayPnL.Float64(),
unrealized.Float64())
c.isHalted = unrealized.Add(c.profitStats.TodayPnL).Compare(c.lossThreshold) <= 0
if c.isHalted {
isHalted := unrealized.Add(c.profitStats.TodayPnL).Compare(c.lossThreshold) <= 0
if isHalted {
c.haltedAt = t
}
return c.isHalted
return isHalted
}

View File

@ -88,3 +88,7 @@ func (s *Strategy) Initialize(ctx context.Context, environ *bbgo.Environment, se
24*time.Hour)
}
}
func (s *Strategy) IsHalted(t time.Time) bool {
return s.circuitBreakRiskControl.IsHalted(t)
}

View File

@ -4,6 +4,7 @@ import (
"context"
"fmt"
"sync"
"time"
"github.com/sirupsen/logrus"
@ -111,13 +112,12 @@ func (s *Strategy) Run(ctx context.Context, _ bbgo.OrderExecutor, session *bbgo.
session.UserDataStream.OnStart(func() {
// you can place orders here when bbgo is started, this will be called only once.
s.replenish(ctx)
})
s.activeOrderBook.OnFilled(func(order types.Order) {
if s.activeOrderBook.NumOfOrders() == 0 {
log.Infof("no active orders, replenish")
s.replenish(ctx)
s.replenish(ctx, order.UpdateTime.Time())
}
})
@ -125,7 +125,7 @@ func (s *Strategy) Run(ctx context.Context, _ bbgo.OrderExecutor, session *bbgo.
log.Infof("%+v", kline)
s.cancelOrders(ctx)
s.replenish(ctx)
s.replenish(ctx, kline.EndTime.Time())
})
// the shutdown handler, you can cancel all orders
@ -143,7 +143,12 @@ func (s *Strategy) cancelOrders(ctx context.Context) {
}
}
func (s *Strategy) replenish(ctx context.Context) {
func (s *Strategy) replenish(ctx context.Context, t time.Time) {
if s.IsHalted(t) {
log.Infof("circuit break halted, not replenishing")
return
}
submitOrders, err := s.generateSubmitOrders(ctx)
if err != nil {
log.WithError(err).Error("failed to generate submit orders")