diff --git a/pkg/exchange/max/convert.go b/pkg/exchange/max/convert.go index 48b7687f77..b6ea59ba2e 100644 --- a/pkg/exchange/max/convert.go +++ b/pkg/exchange/max/convert.go @@ -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, @@ -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) @@ -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, @@ -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 } diff --git a/pkg/exchange/max/maxapi/userdata.go b/pkg/exchange/max/maxapi/userdata.go index 26ff6cf4be..551d3d6852 100644 --- a/pkg/exchange/max/maxapi/userdata.go +++ b/pkg/exchange/max/maxapi/userdata.go @@ -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"` diff --git a/pkg/exchange/max/maxapi/userdata_test.go b/pkg/exchange/max/maxapi/userdata_test.go index 2967e16dfe..5c4880ce5e 100644 --- a/pkg/exchange/max/maxapi/userdata_test.go +++ b/pkg/exchange/max/maxapi/userdata_test.go @@ -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) } diff --git a/pkg/exchange/max/maxapi/v3/get_wallet_trades_request_requestgen.go b/pkg/exchange/max/maxapi/v3/get_wallet_trades_request_requestgen.go index 647916103c..ec7614c10e 100644 --- a/pkg/exchange/max/maxapi/v3/get_wallet_trades_request_requestgen.go +++ b/pkg/exchange/max/maxapi/v3/get_wallet_trades_request_requestgen.go @@ -6,7 +6,6 @@ import ( "context" "encoding/json" "fmt" - "github.com/c9s/bbgo/pkg/exchange/max/maxapi" "net/url" "reflect" "regexp" @@ -39,7 +38,7 @@ func (g *GetWalletTradesRequest) Limit(limit uint64) *GetWalletTradesRequest { return g } -func (g *GetWalletTradesRequest) WalletType(walletType max.WalletType) *GetWalletTradesRequest { +func (g *GetWalletTradesRequest) WalletType(walletType WalletType) *GetWalletTradesRequest { g.walletType = walletType return g } diff --git a/pkg/exchange/max/maxapi/v3/trade.go b/pkg/exchange/max/maxapi/v3/trade.go index c9e975bb0b..d5569deb6c 100644 --- a/pkg/exchange/max/maxapi/v3/trade.go +++ b/pkg/exchange/max/maxapi/v3/trade.go @@ -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 { diff --git a/pkg/service/reflect.go b/pkg/service/reflect.go index b60c0c3371..1f8ce68a6e 100644 --- a/pkg/service/reflect.go +++ b/pkg/service/reflect.go @@ -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 } @@ -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 } diff --git a/pkg/types/trade.go b/pkg/types/trade.go index 0db78b6efe..f80b864a27 100644 --- a/pkg/types/trade.go +++ b/pkg/types/trade.go @@ -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"`