xfunding: improve funding fee guard

This commit is contained in:
c9s 2024-03-07 13:32:50 +08:00
parent d58461d1cf
commit dbd54575e6
No known key found for this signature in database
GPG Key ID: 7385E7E464CB0A54
2 changed files with 17 additions and 11 deletions

View File

@ -17,8 +17,13 @@ type ProfitStats struct {
FundingFeeCurrency string `json:"fundingFeeCurrency"`
TotalFundingFee fixedpoint.Value `json:"totalFundingFee"`
FundingFeeRecords []FundingFee `json:"fundingFeeRecords"`
LastFundingFeeTxn int64 `json:"lastFundingFeeTxn"`
// Fees map[string]
Last *FundingFee `json:"last"`
LastFundingFeeTime time.Time `json:"lastFundingFeeTime"`
txns map[int64]struct{}
}
func (s *ProfitStats) SlackAttachment() slack.Attachment {
@ -31,24 +36,29 @@ func (s *ProfitStats) SlackAttachment() slack.Attachment {
// Pretext: "",
// Text: text,
Fields: fields,
Footer: fmt.Sprintf("Last Funding Fee Transation ID: %d Last Funding Fee Time %s", s.LastFundingFeeTxn, s.LastFundingFeeTime.Format(time.RFC822)),
Footer: fmt.Sprintf("Last Funding Fee Transation ID: %d Last Funding Fee Time %s", s.Last.Txn, s.Last.Time.Format(time.RFC822)),
}
}
func (s *ProfitStats) AddFundingFee(fee FundingFee) error {
if s.txns == nil {
s.txns = make(map[int64]struct{})
}
if s.FundingFeeCurrency == "" {
s.FundingFeeCurrency = fee.Asset
} else if s.FundingFeeCurrency != fee.Asset {
return fmt.Errorf("unexpected error, funding fee currency is not matched, given: %s, wanted: %s", fee.Asset, s.FundingFeeCurrency)
}
if s.LastFundingFeeTxn == fee.Txn {
if _, ok := s.txns[fee.Txn]; ok {
return errDuplicatedFundingFeeTxnId
}
s.FundingFeeRecords = append(s.FundingFeeRecords, fee)
s.TotalFundingFee = s.TotalFundingFee.Add(fee.Amount)
s.LastFundingFeeTxn = fee.Txn
s.LastFundingFeeTime = fee.Time
s.Last = &fee
s.txns[fee.Txn] = struct{}{}
return nil
}

View File

@ -298,7 +298,6 @@ func (s *Strategy) CrossRun(
FundingFeeCurrency: s.futuresMarket.QuoteCurrency,
TotalFundingFee: fixedpoint.Zero,
FundingFeeRecords: nil,
LastFundingFeeTime: time.Time{},
}
}
@ -379,10 +378,7 @@ func (s *Strategy) CrossRun(
bbgo.Notify("State: %s", s.State.PositionState.String())
// sync funding fee txns
s.syncFundingFeeRecords(ctx, s.ProfitStats.LastFundingFeeTime)
// TEST CODE:
// s.syncFundingFeeRecords(ctx, time.Now().Add(-3*24*time.Hour))
s.syncFundingFeeRecords(ctx, time.Now().Add(-5*24*time.Hour))
switch s.State.PositionState {
case PositionClosed: