Skip to content
Open
Show file tree
Hide file tree
Changes from 11 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 1 addition & 4 deletions exchanges/gateio/gateio.go
Original file line number Diff line number Diff line change
Expand Up @@ -729,7 +729,7 @@ func (e *Exchange) CancelSingleSpotOrder(ctx context.Context, orderID, currencyP
}

// GetMySpotTradingHistory retrieves personal trading history
func (e *Exchange) GetMySpotTradingHistory(ctx context.Context, p currency.Pair, orderID string, page, limit uint64, crossMargin bool, from, to time.Time) ([]SpotPersonalTradeHistory, error) {
func (e *Exchange) GetMySpotTradingHistory(ctx context.Context, p currency.Pair, orderID string, page, limit uint64, from, to time.Time) ([]SpotPersonalTradeHistory, error) {
params := url.Values{}
if p.IsPopulated() {
params.Set("currency_pair", p.String())
Expand All @@ -743,9 +743,6 @@ func (e *Exchange) GetMySpotTradingHistory(ctx context.Context, p currency.Pair,
if page > 0 {
params.Set("page", strconv.FormatUint(page, 10))
}
if crossMargin {
params.Set("account", asset.CrossMargin.String())
}
if !from.IsZero() {
params.Set("from", strconv.FormatInt(from.Unix(), 10))
}
Expand Down
41 changes: 27 additions & 14 deletions exchanges/gateio/gateio_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -367,7 +367,7 @@ func TestCancelSingleSpotOrder(t *testing.T) {
func TestGetMySpotTradingHistory(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, e)
_, err := e.GetMySpotTradingHistory(t.Context(), currency.Pair{Base: currency.BTC, Quote: currency.USDT, Delimiter: currency.UnderscoreDelimiter}, "", 0, 0, false, time.Time{}, time.Time{})
_, err := e.GetMySpotTradingHistory(t.Context(), currency.Pair{Base: currency.BTC, Quote: currency.USDT, Delimiter: currency.UnderscoreDelimiter}, "", 0, 0, time.Time{}, time.Time{})
require.NoError(t, err)
}

Expand All @@ -378,7 +378,7 @@ func TestGetServerTime(t *testing.T) {
}
}

func TestCountdownCancelorder(t *testing.T) {
func TestCountdownCancelOrder(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, e, canManipulateRealOrders)
if _, err := e.CountdownCancelorders(t.Context(), CountdownCancelOrderParam{
Expand Down Expand Up @@ -1892,20 +1892,33 @@ func TestGetActiveOrders(t *testing.T) {
}

func TestGetOrderHistory(t *testing.T) {
t.Parallel()
testexch.UpdatePairsOnce(t, e)
sharedtestvalues.SkipTestIfCredentialsUnset(t, e)
for _, a := range e.GetAssetTypes(false) {
enabledPairs := getPairs(t, a)
if len(enabledPairs) > 4 {
enabledPairs = enabledPairs[:4]
}
multiOrderRequest := order.MultiOrderRequest{
Type: order.AnyType,
Side: order.Buy,
Pairs: enabledPairs,
AssetType: a,
}
_, err := e.GetOrderHistory(t.Context(), &multiOrderRequest)
assert.NoErrorf(t, err, "GetOrderHistory should not error for %s", a)
t.Run(a.String(), func(t *testing.T) {
t.Parallel()
enabledPairs := getPairs(t, a)
if len(enabledPairs) > 4 {
enabledPairs = enabledPairs[:4]
}
multiOrderRequest := order.MultiOrderRequest{
Type: order.AnyType,
Side: order.Buy,
Pairs: enabledPairs,
AssetType: a,
}
_, err := e.GetOrderHistory(t.Context(), &multiOrderRequest)
assert.NoError(t, err)

multiOrderRequest.Pairs = nil
_, err = e.GetOrderHistory(t.Context(), &multiOrderRequest)
if a == asset.Options {
assert.ErrorIs(t, err, currency.ErrCurrencyPairsEmpty)
} else {
assert.NoError(t, err)
}
})
}
}

Expand Down
28 changes: 16 additions & 12 deletions exchanges/gateio/gateio_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -1462,18 +1462,22 @@ type CancelOrderByIDResponse struct {

// SpotPersonalTradeHistory represents personal trading history.
type SpotPersonalTradeHistory struct {
TradeID string `json:"id"`
CreateTime types.Time `json:"create_time_ms"`
CurrencyPair string `json:"currency_pair"`
OrderID string `json:"order_id"`
Side string `json:"side"`
Role string `json:"role"`
Amount types.Number `json:"amount"`
Price types.Number `json:"price"`
Fee types.Number `json:"fee"`
FeeCurrency string `json:"fee_currency"`
PointFee string `json:"point_fee"`
GtFee string `json:"gt_fee"`
TradeID string `json:"id"`
CreateTime types.Time `json:"create_time_ms"`
CurrencyPair currency.Pair `json:"currency_pair"`
OrderID string `json:"order_id"`
Side string `json:"side"`
Role string `json:"role"`
Amount types.Number `json:"amount"`
Price types.Number `json:"price"`
Fee types.Number `json:"fee"`
FeeCurrency currency.Code `json:"fee_currency"`
PointFee types.Number `json:"point_fee"`
GtFee types.Number `json:"gt_fee"`
AmendText string `json:"amend_text"`
SequenceID string `json:"sequence_id"`
Text string `json:"text"`
Deal types.Number `json:"deal"`
}

// CountdownCancelOrderParam represents countdown cancel order params
Expand Down
112 changes: 66 additions & 46 deletions exchanges/gateio/gateio_wrapper.go
Original file line number Diff line number Diff line change
Expand Up @@ -1521,97 +1521,117 @@ func (e *Exchange) GetOrderHistory(ctx context.Context, req *order.MultiOrderReq
if err := req.Validate(); err != nil {
return nil, err
}
var orders []order.Detail
var resp []order.Detail
format, err := e.GetPairFormat(req.AssetType, true)
if err != nil {
return nil, err
}

switch req.AssetType {
case asset.Spot, asset.Margin, asset.CrossMargin:
for x := range req.Pairs {
fPair := req.Pairs[x].Format(format)
spotOrders, err := e.GetMySpotTradingHistory(ctx, fPair, req.FromOrderID, 0, 0, req.AssetType == asset.CrossMargin, req.StartTime, req.EndTime)
if len(req.Pairs) == 0 {
req.Pairs = currency.Pairs{currency.EMPTYPAIR}
}
for i := range req.Pairs {
fp := req.Pairs[i].Format(format)
o, err := e.GetMySpotTradingHistory(ctx, fp, req.FromOrderID, 0, 1000, req.StartTime, req.EndTime)
if err != nil {
return nil, err
}
for o := range spotOrders {
var side order.Side
side, err = order.StringToOrderSide(spotOrders[o].Side)
for j := range o {
side, err := order.StringToOrderSide(o[j].Side)
if err != nil {
return nil, err
}
detail := order.Detail{
OrderID: spotOrders[o].OrderID,
Amount: spotOrders[o].Amount.Float64(),
ExecutedAmount: spotOrders[o].Amount.Float64(),
Price: spotOrders[o].Price.Float64(),
Date: spotOrders[o].CreateTime.Time(),
if isAvail, err := e.CurrencyPairs.IsPairAvailable(o[j].CurrencyPair, req.AssetType); !isAvail || err != nil {
continue
}
od := order.Detail{
OrderID: o[j].OrderID,
Amount: o[j].Amount.Float64(),
ExecutedAmount: o[j].Amount.Float64(),
Price: o[j].Price.Float64(),
Date: o[j].CreateTime.Time(),
Side: side,
Exchange: e.Name,
Pair: fPair,
Pair: o[j].CurrencyPair,
AssetType: req.AssetType,
Fee: spotOrders[o].Fee.Float64(),
FeeAsset: currency.NewCode(spotOrders[o].FeeCurrency),
Fee: o[j].Fee.Float64(),
FeeAsset: o[j].FeeCurrency,
}
detail.InferCostsAndTimes()
orders = append(orders, detail)
od.InferCostsAndTimes()
resp = append(resp, od)
}
}
case asset.CoinMarginedFutures, asset.USDTMarginedFutures, asset.DeliveryFutures:
for x := range req.Pairs {
fPair := req.Pairs[x].Format(format)
settle, err := getSettlementCurrency(fPair, req.AssetType)
if len(req.Pairs) == 0 {
req.Pairs = currency.Pairs{currency.EMPTYPAIR}
}
for i := range req.Pairs {
fp := req.Pairs[i].Format(format)
settle, err := getSettlementCurrency(fp, req.AssetType)
if err != nil {
return nil, err
}
var futuresOrder []TradingHistoryItem
var o []TradingHistoryItem
if req.AssetType == asset.DeliveryFutures {
futuresOrder, err = e.GetMyDeliveryTradingHistory(ctx, settle, req.FromOrderID, fPair, 0, 0, 0, "")
o, err = e.GetMyDeliveryTradingHistory(ctx, settle, req.FromOrderID, fp, 0, 0, 0, "")
} else {
futuresOrder, err = e.GetMyFuturesTradingHistory(ctx, settle, "", req.FromOrderID, fPair, 0, 0, 0)
o, err = e.GetMyFuturesTradingHistory(ctx, settle, "", req.FromOrderID, fp, 0, 0, 0)
}
if err != nil {
return nil, err
}
for o := range futuresOrder {
detail := order.Detail{
OrderID: strconv.FormatInt(futuresOrder[o].ID, 10),
Amount: futuresOrder[o].Size,
Price: futuresOrder[o].Price.Float64(),
Date: futuresOrder[o].CreateTime.Time(),
for j := range o {
p, err := e.MatchSymbolWithAvailablePairs(o[j].Contract, req.AssetType, true)
if err != nil {
return nil, err
}
od := order.Detail{
OrderID: strconv.FormatInt(o[j].ID, 10),
Amount: o[j].Size,
Price: o[j].Price.Float64(),
Date: o[j].CreateTime.Time(),
Exchange: e.Name,
Pair: fPair,
Pair: p,
AssetType: req.AssetType,
}
detail.InferCostsAndTimes()
orders = append(orders, detail)
od.InferCostsAndTimes()
resp = append(resp, od)
}
}
case asset.Options:
for x := range req.Pairs {
fPair := req.Pairs[x].Format(format)
optionOrders, err := e.GetMyOptionsTradingHistory(ctx, fPair.String(), fPair.Upper(), 0, 0, req.StartTime, req.EndTime)
if len(req.Pairs) == 0 {
return nil, currency.ErrCurrencyPairsEmpty
}
for i := range req.Pairs {
fp := req.Pairs[i].Format(format)
o, err := e.GetMyOptionsTradingHistory(ctx, fp.String(), fp.Upper(), 0, 0, req.StartTime, req.EndTime)
if err != nil {
return nil, err
}
for o := range optionOrders {
detail := order.Detail{
OrderID: strconv.FormatInt(optionOrders[o].OrderID, 10),
Amount: optionOrders[o].Size,
Price: optionOrders[o].Price.Float64(),
Date: optionOrders[o].CreateTime.Time(),
for j := range o {
p, err := e.MatchSymbolWithAvailablePairs(o[j].Contract, req.AssetType, true)
if err != nil {
return nil, err
}
od := order.Detail{
OrderID: strconv.FormatInt(o[j].OrderID, 10),
Amount: o[j].Size,
Price: o[j].Price.Float64(),
Date: o[j].CreateTime.Time(),
Exchange: e.Name,
Pair: fPair,
Pair: p,
AssetType: req.AssetType,
}
detail.InferCostsAndTimes()
orders = append(orders, detail)
od.InferCostsAndTimes()
resp = append(resp, od)
}
}
default:
return nil, fmt.Errorf("%w asset type: %v", asset.ErrNotSupported, req.AssetType)
}
return req.Filter(e.Name, orders), nil
return req.Filter(e.Name, resp), nil
}

// GetHistoricCandles returns candles between a time period for a set time interval
Expand Down
Loading