167 lines
6.6 KiB
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"`
|
||
|
}
|