Skip to content

Commit

Permalink
Merge pull request #1247 from c9s/c9s/max-fee-discounted-restful-api
Browse files Browse the repository at this point in the history
FEATURE: [max] add fee_discounted to Trade struct for RESTful api
  • Loading branch information
c9s authored Jul 28, 2023
2 parents c42ad19 + 4eefe72 commit 570ccab
Show file tree
Hide file tree
Showing 7 changed files with 41 additions and 27 deletions.
8 changes: 4 additions & 4 deletions pkg/exchange/max/convert.go
Original file line number Diff line number Diff line change
Expand Up @@ -211,6 +211,7 @@ func toGlobalTradeV3(t v3.Trade) ([]types.Trade, error) {
IsMaker: t.IsMaker(),
Fee: t.Fee,
FeeCurrency: toGlobalCurrency(t.FeeCurrency),
FeeDiscounted: t.FeeDiscounted,
QuoteQuantity: t.Funds,
Time: types.Time(t.CreatedAt),
IsMargin: isMargin,
Expand All @@ -227,6 +228,7 @@ func toGlobalTradeV3(t v3.Trade) ([]types.Trade, error) {
bidTrade.OrderID = t.SelfTradeBidOrderID
bidTrade.Fee = t.SelfTradeBidFee
bidTrade.FeeCurrency = toGlobalCurrency(t.SelfTradeBidFeeCurrency)
bidTrade.FeeDiscounted = t.SelfTradeBidFeeDiscounted
bidTrade.IsBuyer = !trade.IsBuyer
bidTrade.IsMaker = !trade.IsMaker
trades = append(trades, bidTrade)
Expand Down Expand Up @@ -285,9 +287,6 @@ func convertWebSocketTrade(t max.TradeUpdate) (*types.Trade, error) {
// skip trade ID that is the same. however this should not happen
var side = toGlobalSideType(t.Side)

// trade time
mts := time.Unix(0, t.Timestamp*int64(time.Millisecond))

return &types.Trade{
ID: t.ID,
OrderID: t.OrderID,
Expand All @@ -300,8 +299,9 @@ func convertWebSocketTrade(t max.TradeUpdate) (*types.Trade, error) {
IsMaker: t.Maker,
Fee: t.Fee,
FeeCurrency: toGlobalCurrency(t.FeeCurrency),
FeeDiscounted: t.FeeDiscounted,
QuoteQuantity: t.Price.Mul(t.Volume),
Time: types.Time(mts),
Time: types.Time(t.Timestamp.Time()),
}, nil
}

Expand Down
4 changes: 2 additions & 2 deletions pkg/exchange/max/maxapi/userdata.go
Original file line number Diff line number Diff line change
Expand Up @@ -104,8 +104,8 @@ type TradeUpdate struct {
FeeCurrency string `json:"fc"`
FeeDiscounted bool `json:"fd"`

Timestamp int64 `json:"T"`
UpdateTime int64 `json:"TU"`
Timestamp types.MillisecondTimestamp `json:"T"`
UpdateTime types.MillisecondTimestamp `json:"TU"`

OrderID uint64 `json:"oi"`

Expand Down
2 changes: 1 addition & 1 deletion pkg/exchange/max/maxapi/userdata_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ func Test_parseTradeSnapshotEvent(t *testing.T) {
assert.Equal(t, 1, len(evt.Trades))
assert.Equal(t, "bid", evt.Trades[0].Side)
assert.Equal(t, "ethtwd", evt.Trades[0].Market)
assert.Equal(t, int64(1521726960357), evt.Trades[0].Timestamp)
assert.Equal(t, int64(1521726960357), evt.Trades[0].Timestamp.Time().UnixMilli())
assert.Equal(t, "3.2", evt.Trades[0].Fee.String())
assert.Equal(t, "twd", evt.Trades[0].FeeCurrency)
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

41 changes: 25 additions & 16 deletions pkg/exchange/max/maxapi/v3/trade.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,23 +5,32 @@ import (
"github.com/c9s/bbgo/pkg/types"
)

type Liquidity string

const (
LiquidityMaker = "maker"
LiquidityTaker = "taker"
)

type Trade struct {
ID uint64 `json:"id" db:"exchange_id"`
WalletType WalletType `json:"wallet_type,omitempty"`
Price fixedpoint.Value `json:"price"`
Volume fixedpoint.Value `json:"volume"`
Funds fixedpoint.Value `json:"funds"`
Market string `json:"market"`
MarketName string `json:"market_name"`
CreatedAt types.MillisecondTimestamp `json:"created_at"`
Side string `json:"side"`
OrderID uint64 `json:"order_id"`
Fee fixedpoint.Value `json:"fee"` // float number as string
FeeCurrency string `json:"fee_currency"`
Liquidity string `json:"liquidity"`
SelfTradeBidFee fixedpoint.Value `json:"self_trade_bid_fee"`
SelfTradeBidFeeCurrency string `json:"self_trade_bid_fee_currency"`
SelfTradeBidOrderID uint64 `json:"self_trade_bid_order_id"`
ID uint64 `json:"id" db:"exchange_id"`
WalletType WalletType `json:"wallet_type,omitempty"`
Price fixedpoint.Value `json:"price"`
Volume fixedpoint.Value `json:"volume"`
Funds fixedpoint.Value `json:"funds"`
Market string `json:"market"`
MarketName string `json:"market_name"`
CreatedAt types.MillisecondTimestamp `json:"created_at"`
Side string `json:"side"`
OrderID uint64 `json:"order_id"`
Fee fixedpoint.Value `json:"fee"` // float number as string
FeeCurrency string `json:"fee_currency"`
FeeDiscounted bool `json:"fee_discounted"`
Liquidity Liquidity `json:"liquidity"`
SelfTradeBidFee fixedpoint.Value `json:"self_trade_bid_fee"`
SelfTradeBidFeeCurrency string `json:"self_trade_bid_fee_currency"`
SelfTradeBidFeeDiscounted bool `json:"self_trade_bid_fee_discounted"`
SelfTradeBidOrderID uint64 `json:"self_trade_bid_order_id"`
}

func (t Trade) IsBuyer() bool {
Expand Down
4 changes: 2 additions & 2 deletions pkg/service/reflect.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ func placeholdersOf(record interface{}) []string {
for i := 0; i < rt.NumField(); i++ {
fieldType := rt.Field(i)
if tag, ok := fieldType.Tag.Lookup("db"); ok {
if tag == "gid" {
if tag == "gid" || tag == "-" || tag == "" {
continue
}

Expand All @@ -65,7 +65,7 @@ func fieldsNamesOf(record interface{}) []string {
for i := 0; i < rt.NumField(); i++ {
fieldType := rt.Field(i)
if tag, ok := fieldType.Tag.Lookup("db"); ok {
if tag == "gid" {
if tag == "gid" || tag == "-" || tag == "" {
continue
}

Expand Down
6 changes: 6 additions & 0 deletions pkg/types/trade.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,12 @@ type Trade struct {
Fee fixedpoint.Value `json:"fee" db:"fee"`
FeeCurrency string `json:"feeCurrency" db:"fee_currency"`

// FeeDiscounted is an optional field which indicates whether the trade is using the platform fee token for discount.
// When FeeDiscounted = true, means the fee is deducted outside the trade
// By default, it's set to false.
// This is only used by the MAX exchange
FeeDiscounted bool `json:"feeDiscounted" db:"-"`

IsMargin bool `json:"isMargin" db:"is_margin"`
IsFutures bool `json:"isFutures" db:"is_futures"`
IsIsolated bool `json:"isIsolated" db:"is_isolated"`
Expand Down

0 comments on commit 570ccab

Please sign in to comment.