bbgo/pkg/types/margin.go

167 lines
6.6 KiB
Go

package types
import (
"context"
"time"
"git.qtrade.icu/lychiyu/bbgo/pkg/fixedpoint"
)
type MarginType string
const (
MarginTypeSpot MarginType = "spot"
MarginTypeCrossMargin MarginType = "cross_margin"
MarginTypeIsolatedMargin MarginType = "isolated_margin"
)
type MarginExchange interface {
UseMargin()
UseIsolatedMargin(symbol string)
GetMarginSettings() MarginSettings
}
// MarginBorrowRepayService provides repay and borrow actions of an crypto exchange
type MarginBorrowRepayService interface {
RepayMarginAsset(ctx context.Context, asset string, amount fixedpoint.Value) error
BorrowMarginAsset(ctx context.Context, asset string, amount fixedpoint.Value) error
QueryMarginAssetMaxBorrowable(ctx context.Context, asset string) (amount fixedpoint.Value, err error)
}
type MarginInterest struct {
GID uint64 `json:"gid" db:"gid"`
Exchange ExchangeName `json:"exchange" db:"exchange"`
Asset string `json:"asset" db:"asset"`
Principle fixedpoint.Value `json:"principle" db:"principle"`
Interest fixedpoint.Value `json:"interest" db:"interest"`
InterestRate fixedpoint.Value `json:"interestRate" db:"interest_rate"`
IsolatedSymbol string `json:"isolatedSymbol" db:"isolated_symbol"`
Time Time `json:"time" db:"time"`
}
type MarginLoan struct {
GID uint64 `json:"gid" db:"gid"`
Exchange ExchangeName `json:"exchange" db:"exchange"`
TransactionID uint64 `json:"transactionID" db:"transaction_id"`
Asset string `json:"asset" db:"asset"`
Principle fixedpoint.Value `json:"principle" db:"principle"`
Time Time `json:"time" db:"time"`
IsolatedSymbol string `json:"isolatedSymbol" db:"isolated_symbol"`
}
type MarginRepay struct {
GID uint64 `json:"gid" db:"gid"`
Exchange ExchangeName `json:"exchange" db:"exchange"`
TransactionID uint64 `json:"transactionID" db:"transaction_id"`
Asset string `json:"asset" db:"asset"`
Principle fixedpoint.Value `json:"principle" db:"principle"`
Time Time `json:"time" db:"time"`
IsolatedSymbol string `json:"isolatedSymbol" db:"isolated_symbol"`
}
type MarginLiquidation struct {
GID uint64 `json:"gid" db:"gid"`
Exchange ExchangeName `json:"exchange" db:"exchange"`
AveragePrice fixedpoint.Value `json:"averagePrice" db:"average_price"`
ExecutedQuantity fixedpoint.Value `json:"executedQuantity" db:"executed_quantity"`
OrderID uint64 `json:"orderID" db:"order_id"`
Price fixedpoint.Value `json:"price" db:"price"`
Quantity fixedpoint.Value `json:"quantity" db:"quantity"`
Side SideType `json:"side" db:"side"`
Symbol string `json:"symbol" db:"symbol"`
TimeInForce TimeInForce `json:"timeInForce" db:"time_in_force"`
IsIsolated bool `json:"isIsolated" db:"is_isolated"`
UpdatedTime Time `json:"updatedTime" db:"time"`
}
// MarginHistoryService provides the service of querying loan history and repay history
type MarginHistoryService interface {
QueryLoanHistory(ctx context.Context, asset string, startTime, endTime *time.Time) ([]MarginLoan, error)
QueryRepayHistory(ctx context.Context, asset string, startTime, endTime *time.Time) ([]MarginRepay, error)
QueryLiquidationHistory(ctx context.Context, startTime, endTime *time.Time) ([]MarginLiquidation, error)
QueryInterestHistory(ctx context.Context, asset string, startTime, endTime *time.Time) ([]MarginInterest, error)
}
type MarginSettings struct {
IsMargin bool
IsIsolatedMargin bool
IsolatedMarginSymbol string
}
func (e *MarginSettings) GetMarginSettings() MarginSettings {
return *e
}
func (e *MarginSettings) UseMargin() {
e.IsMargin = true
}
func (e *MarginSettings) UseIsolatedMargin(symbol string) {
e.IsMargin = true
e.IsIsolatedMargin = true
e.IsolatedMarginSymbol = symbol
}
// MarginAccount is for the cross margin account
type MarginAccount struct {
BorrowEnabled bool `json:"borrowEnabled"`
MarginLevel fixedpoint.Value `json:"marginLevel"`
TotalAssetOfBTC fixedpoint.Value `json:"totalAssetOfBtc"`
TotalLiabilityOfBTC fixedpoint.Value `json:"totalLiabilityOfBtc"`
TotalNetAssetOfBTC fixedpoint.Value `json:"totalNetAssetOfBtc"`
TradeEnabled bool `json:"tradeEnabled"`
TransferEnabled bool `json:"transferEnabled"`
UserAssets []MarginUserAsset `json:"userAssets"`
}
// MarginUserAsset define user assets of margin account
type MarginUserAsset struct {
Asset string `json:"asset"`
Borrowed fixedpoint.Value `json:"borrowed"`
Free fixedpoint.Value `json:"free"`
Interest fixedpoint.Value `json:"interest"`
Locked fixedpoint.Value `json:"locked"`
NetAsset fixedpoint.Value `json:"netAsset"`
}
// IsolatedMarginAccount defines isolated user assets of margin account
type IsolatedMarginAccount struct {
TotalAssetOfBTC fixedpoint.Value `json:"totalAssetOfBtc"`
TotalLiabilityOfBTC fixedpoint.Value `json:"totalLiabilityOfBtc"`
TotalNetAssetOfBTC fixedpoint.Value `json:"totalNetAssetOfBtc"`
Assets IsolatedMarginAssetMap `json:"assets"`
}
// IsolatedMarginAsset defines isolated margin asset information, like margin level, liquidation price... etc
type IsolatedMarginAsset struct {
Symbol string `json:"symbol"`
QuoteAsset IsolatedUserAsset `json:"quoteAsset"`
BaseAsset IsolatedUserAsset `json:"baseAsset"`
IsolatedCreated bool `json:"isolatedCreated"`
MarginLevel fixedpoint.Value `json:"marginLevel"`
MarginLevelStatus string `json:"marginLevelStatus"`
MarginRatio fixedpoint.Value `json:"marginRatio"`
IndexPrice fixedpoint.Value `json:"indexPrice"`
LiquidatePrice fixedpoint.Value `json:"liquidatePrice"`
LiquidateRate fixedpoint.Value `json:"liquidateRate"`
TradeEnabled bool `json:"tradeEnabled"`
}
// IsolatedUserAsset defines isolated user assets of the margin account
type IsolatedUserAsset struct {
Asset string `json:"asset"`
Borrowed fixedpoint.Value `json:"borrowed"`
Free fixedpoint.Value `json:"free"`
Interest fixedpoint.Value `json:"interest"`
Locked fixedpoint.Value `json:"locked"`
NetAsset fixedpoint.Value `json:"netAsset"`
NetAssetOfBtc fixedpoint.Value `json:"netAssetOfBtc"`
BorrowEnabled bool `json:"borrowEnabled"`
RepayEnabled bool `json:"repayEnabled"`
TotalAsset fixedpoint.Value `json:"totalAsset"`
}