@@ -2,29 +2,29 @@ package common
2
2
3
3
import (
4
4
"sync"
5
- "time"
6
5
7
6
"github.com/c9s/bbgo/pkg/fixedpoint"
8
7
"github.com/c9s/bbgo/pkg/types"
8
+ "github.com/c9s/bbgo/pkg/util"
9
9
log "github.com/sirupsen/logrus"
10
10
)
11
11
12
12
type FeeBudget struct {
13
13
DailyFeeBudgets map [string ]fixedpoint.Value `json:"dailyFeeBudgets,omitempty"`
14
- State * State `persistence:"state "`
14
+ DailyFeeTracker * util. DailyDataTracker `persistence:"dailyFeeTracker "`
15
15
16
16
mu sync.Mutex
17
17
}
18
18
19
19
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 ()
23
23
}
24
24
25
- if f .State .IsOver24Hours () {
25
+ if f .DailyFeeTracker .IsOver24Hours () {
26
26
log .Warn ("[FeeBudget] state is over 24 hours, resetting to zero" )
27
- f .State .Reset ()
27
+ f .DailyFeeTracker .Reset ()
28
28
}
29
29
}
30
30
@@ -33,17 +33,17 @@ func (f *FeeBudget) IsBudgetAllowed() bool {
33
33
return true
34
34
}
35
35
36
- if f .State . AccumulatedFees == nil {
36
+ if f .DailyFeeTracker . Data == nil {
37
37
return true
38
38
}
39
39
40
- if f .State .IsOver24Hours () {
41
- f .State .Reset ()
40
+ if f .DailyFeeTracker .IsOver24Hours () {
41
+ f .DailyFeeTracker .Reset ()
42
42
return true
43
43
}
44
44
45
45
for asset , budget := range f .DailyFeeBudgets {
46
- if fee , ok := f .State . AccumulatedFees [asset ]; ok {
46
+ if fee , ok := f .DailyFeeTracker . Data [asset ]; ok {
47
47
if fee .Compare (budget ) >= 0 {
48
48
log .Warnf ("[FeeBudget] accumulative fee %s exceeded the fee budget %s, skipping..." , fee .String (), budget .String ())
49
49
return false
@@ -57,36 +57,17 @@ func (f *FeeBudget) IsBudgetAllowed() bool {
57
57
func (f * FeeBudget ) HandleTradeUpdate (trade types.Trade ) {
58
58
log .Infof ("[FeeBudget] received trade %s" , trade .String ())
59
59
60
- if f .State .IsOver24Hours () {
61
- f .State .Reset ()
60
+ if f .DailyFeeTracker .IsOver24Hours () {
61
+ f .DailyFeeTracker .Reset ()
62
62
}
63
63
64
64
// safe check
65
- if f .State . AccumulatedFees == nil {
65
+ if f .DailyFeeTracker . Data == nil {
66
66
f .mu .Lock ()
67
- f .State . AccumulatedFees = make (map [string ]fixedpoint.Value )
67
+ f .DailyFeeTracker . Data = make (map [string ]fixedpoint.Value )
68
68
f .mu .Unlock ()
69
69
}
70
70
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 )
92
73
}
0 commit comments