Skip to content

Commit 8fc643e

Browse files
committed
add DailyDataTracker util
1 parent be27d32 commit 8fc643e

File tree

3 files changed

+53
-37
lines changed

3 files changed

+53
-37
lines changed

pkg/strategy/common/fee_budget.go

Lines changed: 17 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,29 @@ package common
22

33
import (
44
"sync"
5-
"time"
65

76
"github.com/c9s/bbgo/pkg/fixedpoint"
87
"github.com/c9s/bbgo/pkg/types"
8+
"github.com/c9s/bbgo/pkg/util"
99
log "github.com/sirupsen/logrus"
1010
)
1111

1212
type FeeBudget struct {
1313
DailyFeeBudgets map[string]fixedpoint.Value `json:"dailyFeeBudgets,omitempty"`
14-
State *State `persistence:"state"`
14+
DailyFeeTracker *util.DailyDataTracker `persistence:"dailyFeeTracker"`
1515

1616
mu sync.Mutex
1717
}
1818

1919
func (f *FeeBudget) Initialize() {
20-
if f.State == nil {
21-
f.State = &State{}
22-
f.State.Reset()
20+
if f.DailyFeeTracker == nil {
21+
f.DailyFeeTracker = &util.DailyDataTracker{}
22+
f.DailyFeeTracker.Reset()
2323
}
2424

25-
if f.State.IsOver24Hours() {
25+
if f.DailyFeeTracker.IsOver24Hours() {
2626
log.Warn("[FeeBudget] state is over 24 hours, resetting to zero")
27-
f.State.Reset()
27+
f.DailyFeeTracker.Reset()
2828
}
2929
}
3030

@@ -33,17 +33,17 @@ func (f *FeeBudget) IsBudgetAllowed() bool {
3333
return true
3434
}
3535

36-
if f.State.AccumulatedFees == nil {
36+
if f.DailyFeeTracker.Data == nil {
3737
return true
3838
}
3939

40-
if f.State.IsOver24Hours() {
41-
f.State.Reset()
40+
if f.DailyFeeTracker.IsOver24Hours() {
41+
f.DailyFeeTracker.Reset()
4242
return true
4343
}
4444

4545
for asset, budget := range f.DailyFeeBudgets {
46-
if fee, ok := f.State.AccumulatedFees[asset]; ok {
46+
if fee, ok := f.DailyFeeTracker.Data[asset]; ok {
4747
if fee.Compare(budget) >= 0 {
4848
log.Warnf("[FeeBudget] accumulative fee %s exceeded the fee budget %s, skipping...", fee.String(), budget.String())
4949
return false
@@ -57,36 +57,17 @@ func (f *FeeBudget) IsBudgetAllowed() bool {
5757
func (f *FeeBudget) HandleTradeUpdate(trade types.Trade) {
5858
log.Infof("[FeeBudget] received trade %s", trade.String())
5959

60-
if f.State.IsOver24Hours() {
61-
f.State.Reset()
60+
if f.DailyFeeTracker.IsOver24Hours() {
61+
f.DailyFeeTracker.Reset()
6262
}
6363

6464
// safe check
65-
if f.State.AccumulatedFees == nil {
65+
if f.DailyFeeTracker.Data == nil {
6666
f.mu.Lock()
67-
f.State.AccumulatedFees = make(map[string]fixedpoint.Value)
67+
f.DailyFeeTracker.Data = make(map[string]fixedpoint.Value)
6868
f.mu.Unlock()
6969
}
7070

71-
f.State.AccumulatedFees[trade.FeeCurrency] = f.State.AccumulatedFees[trade.FeeCurrency].Add(trade.Fee)
72-
log.Infof("[FeeBudget] accumulated fee: %s %s", f.State.AccumulatedFees[trade.FeeCurrency].String(), trade.FeeCurrency)
73-
}
74-
75-
type State struct {
76-
AccumulatedFeeStartedAt time.Time `json:"accumulatedFeeStartedAt,omitempty"`
77-
AccumulatedFees map[string]fixedpoint.Value `json:"accumulatedFees,omitempty"`
78-
}
79-
80-
func (s *State) IsOver24Hours() bool {
81-
return time.Since(s.AccumulatedFeeStartedAt) >= 24*time.Hour
82-
}
83-
84-
func (s *State) Reset() {
85-
t := time.Now()
86-
dateTime := time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, 0, t.Location())
87-
88-
log.Infof("[State] resetting accumulated started time to: %s", dateTime)
89-
90-
s.AccumulatedFeeStartedAt = dateTime
91-
s.AccumulatedFees = make(map[string]fixedpoint.Value)
71+
f.DailyFeeTracker.Data[trade.FeeCurrency] = f.DailyFeeTracker.Data[trade.FeeCurrency].Add(trade.Fee)
72+
log.Infof("[FeeBudget] accumulated fee: %s %s", f.DailyFeeTracker.Data[trade.FeeCurrency].String(), trade.FeeCurrency)
9273
}

pkg/strategy/common/fee_budget_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ func TestFeeBudget(t *testing.T) {
5050
assert.Equal(t, c.expected, feeBudget.IsBudgetAllowed())
5151

5252
// test reset
53-
feeBudget.State.AccumulatedFeeStartedAt = feeBudget.State.AccumulatedFeeStartedAt.Add(-24 * time.Hour)
53+
feeBudget.State.StartedAt = feeBudget.State.StartedAt.Add(-24 * time.Hour)
5454
assert.True(t, feeBudget.IsBudgetAllowed())
5555
}
5656
}

pkg/util/daily_data_tracker.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package util
2+
3+
import (
4+
"time"
5+
6+
"github.com/c9s/bbgo/pkg/types"
7+
log "github.com/sirupsen/logrus"
8+
)
9+
10+
type DailyDataTracker struct {
11+
StartedAt time.Time `json:"startedAt,omitempty"`
12+
Data types.ValueMap `json:"data,omitempty"`
13+
}
14+
15+
func (d *DailyDataTracker) IsOver24Hours() bool {
16+
return time.Since(d.StartedAt) >= 24*time.Hour
17+
}
18+
19+
func (d *DailyDataTracker) ResetTime() {
20+
t := time.Now()
21+
dateTime := time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, 0, t.Location())
22+
23+
log.Infof("[Countdown] resetting accumulated started time to: %s", dateTime)
24+
25+
d.StartedAt = dateTime
26+
}
27+
28+
func (d *DailyDataTracker) ResetData() {
29+
d.Data = make(types.ValueMap)
30+
}
31+
32+
func (d *DailyDataTracker) Reset() {
33+
d.ResetTime()
34+
d.ResetData()
35+
}

0 commit comments

Comments
 (0)