mirror of
https://github.com/c9s/bbgo.git
synced 2024-11-26 08:45:16 +00:00
xfunding: add stringer support on PremiumIndex
This commit is contained in:
parent
62e6b232ed
commit
209fb102fa
|
@ -37,3 +37,4 @@ crossExchangeStrategies:
|
||||||
shortFundingRate:
|
shortFundingRate:
|
||||||
high: 0.000%
|
high: 0.000%
|
||||||
low: -0.01%
|
low: -0.01%
|
||||||
|
reset: true
|
||||||
|
|
|
@ -43,6 +43,24 @@ func init() {
|
||||||
bbgo.RegisterStrategy(ID, &Strategy{})
|
bbgo.RegisterStrategy(ID, &Strategy{})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type State struct {
|
||||||
|
PositionStartTime time.Time `json:"positionStartTime"`
|
||||||
|
|
||||||
|
// PositionState is default to NoOp
|
||||||
|
PositionState PositionState
|
||||||
|
|
||||||
|
PendingBaseTransfer fixedpoint.Value `json:"pendingBaseTransfer"`
|
||||||
|
TotalBaseTransfer fixedpoint.Value `json:"totalBaseTransfer"`
|
||||||
|
UsedQuoteInvestment fixedpoint.Value `json:"usedQuoteInvestment"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *State) Reset() {
|
||||||
|
s.PositionState = PositionClosed
|
||||||
|
s.PendingBaseTransfer = fixedpoint.Zero
|
||||||
|
s.TotalBaseTransfer = fixedpoint.Zero
|
||||||
|
s.UsedQuoteInvestment = fixedpoint.Zero
|
||||||
|
}
|
||||||
|
|
||||||
// Strategy is the xfunding fee strategy
|
// Strategy is the xfunding fee strategy
|
||||||
// Right now it only supports short position in the USDT futures account.
|
// Right now it only supports short position in the USDT futures account.
|
||||||
// When opening the short position, it uses spot account to buy inventory, then transfer the inventory to the futures account as collateral assets.
|
// When opening the short position, it uses spot account to buy inventory, then transfer the inventory to the futures account as collateral assets.
|
||||||
|
@ -95,6 +113,7 @@ type Strategy struct {
|
||||||
|
|
||||||
SpotSession string `json:"spotSession"`
|
SpotSession string `json:"spotSession"`
|
||||||
FuturesSession string `json:"futuresSession"`
|
FuturesSession string `json:"futuresSession"`
|
||||||
|
Reset bool `json:"reset"`
|
||||||
|
|
||||||
ProfitStats *types.ProfitStats `persistence:"profit_stats"`
|
ProfitStats *types.ProfitStats `persistence:"profit_stats"`
|
||||||
SpotPosition *types.Position `persistence:"spot_position"`
|
SpotPosition *types.Position `persistence:"spot_position"`
|
||||||
|
@ -114,17 +133,6 @@ type Strategy struct {
|
||||||
positionType types.PositionType
|
positionType types.PositionType
|
||||||
}
|
}
|
||||||
|
|
||||||
type State struct {
|
|
||||||
PositionStartTime time.Time `json:"positionStartTime"`
|
|
||||||
|
|
||||||
// PositionState is default to NoOp
|
|
||||||
PositionState PositionState
|
|
||||||
|
|
||||||
PendingBaseTransfer fixedpoint.Value `json:"pendingBaseTransfer"`
|
|
||||||
TotalBaseTransfer fixedpoint.Value `json:"totalBaseTransfer"`
|
|
||||||
UsedQuoteInvestment fixedpoint.Value `json:"usedQuoteInvestment"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *Strategy) ID() string {
|
func (s *Strategy) ID() string {
|
||||||
return ID
|
return ID
|
||||||
}
|
}
|
||||||
|
@ -235,19 +243,19 @@ func (s *Strategy) CrossRun(ctx context.Context, orderExecutionRouter bbgo.Order
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if s.ProfitStats == nil {
|
if s.ProfitStats == nil || s.Reset {
|
||||||
s.ProfitStats = types.NewProfitStats(s.Market)
|
s.ProfitStats = types.NewProfitStats(s.Market)
|
||||||
}
|
}
|
||||||
|
|
||||||
if s.FuturesPosition == nil {
|
if s.FuturesPosition == nil || s.Reset {
|
||||||
s.FuturesPosition = types.NewPositionFromMarket(s.futuresMarket)
|
s.FuturesPosition = types.NewPositionFromMarket(s.futuresMarket)
|
||||||
}
|
}
|
||||||
|
|
||||||
if s.SpotPosition == nil {
|
if s.SpotPosition == nil || s.Reset {
|
||||||
s.SpotPosition = types.NewPositionFromMarket(s.spotMarket)
|
s.SpotPosition = types.NewPositionFromMarket(s.spotMarket)
|
||||||
}
|
}
|
||||||
|
|
||||||
if s.State == nil {
|
if s.State == nil || s.Reset {
|
||||||
s.State = &State{
|
s.State = &State{
|
||||||
PositionState: PositionClosed,
|
PositionState: PositionClosed,
|
||||||
PendingBaseTransfer: fixedpoint.Zero,
|
PendingBaseTransfer: fixedpoint.Zero,
|
||||||
|
@ -365,12 +373,13 @@ func (s *Strategy) queryAndDetectPremiumIndex(ctx context.Context, binanceFuture
|
||||||
log.Infof("premiumIndex: %+v", premiumIndex)
|
log.Infof("premiumIndex: %+v", premiumIndex)
|
||||||
|
|
||||||
if changed := s.detectPremiumIndex(premiumIndex); changed {
|
if changed := s.detectPremiumIndex(premiumIndex); changed {
|
||||||
log.Infof("position action: %s %s", s.positionType, s.State.PositionState.String())
|
log.Infof("position state changed: %s %s", s.positionType, s.State.PositionState.String())
|
||||||
s.triggerPositionAction(ctx)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
s.sync(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Strategy) triggerPositionAction(ctx context.Context) {
|
func (s *Strategy) sync(ctx context.Context) {
|
||||||
switch s.State.PositionState {
|
switch s.State.PositionState {
|
||||||
case PositionOpening:
|
case PositionOpening:
|
||||||
s.increaseSpotPosition(ctx)
|
s.increaseSpotPosition(ctx)
|
||||||
|
@ -441,10 +450,8 @@ func (s *Strategy) syncFuturesPosition(ctx context.Context) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
switch s.State.PositionState {
|
if s.State.PositionState != PositionOpening {
|
||||||
case PositionClosing:
|
|
||||||
return
|
return
|
||||||
case PositionOpening, PositionClosed:
|
|
||||||
}
|
}
|
||||||
|
|
||||||
spotBase := s.SpotPosition.GetBase() // should be positive base quantity here
|
spotBase := s.SpotPosition.GetBase() // should be positive base quantity here
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package types
|
package types
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/c9s/bbgo/pkg/fixedpoint"
|
"github.com/c9s/bbgo/pkg/fixedpoint"
|
||||||
|
@ -13,3 +14,7 @@ type PremiumIndex struct {
|
||||||
NextFundingTime time.Time `json:"nextFundingTime"`
|
NextFundingTime time.Time `json:"nextFundingTime"`
|
||||||
Time time.Time `json:"time"`
|
Time time.Time `json:"time"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (i *PremiumIndex) String() string {
|
||||||
|
return fmt.Sprintf("%s %s %s %s NEXT: %s", i.Symbol, i.MarkPrice.String(), i.LastFundingRate.Percentage(), i.Time, i.NextFundingTime)
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user