mirror of
https://github.com/d0zingcat/gocryptotrader.git
synced 2026-06-03 15:10:49 +00:00
BugFix: RPCServer cannot retrieve open orders/getOrder due to unset asset type (#634)
* Fixes issue where getorders could not work due to unset asset type in rpcserver.go. Adds test. Also adds start and end date to the cli. * A few fixes * lint * fixes oopsie that affected doopsie * Ensures dates are set for all open order implementations. Adds new filter to ensure orders without dates are returned rather than filtered. Fixes up Binance OpenOrders implementation. Adds some extra typeconverts for binance * Add updated time to Binance GetActiveOrders. Update rpcserver.go to only set the time if its not empty. Also addressed bad expected value * Actually fixes things this time * Improves recvWindow to process openOrders * Adds asset type to getOrder as well * Fixes tests * Adds missing date fields * Fixes default time, updates default errors * Default start to last month, instead of last year
This commit is contained in:
@@ -388,7 +388,7 @@ func (a *Alphapoint) GetActiveOrders(req *order.GetOrdersRequest) ([]order.Detai
|
||||
|
||||
order.FilterOrdersByType(&orders, req.Type)
|
||||
order.FilterOrdersBySide(&orders, req.Side)
|
||||
order.FilterOrdersByTickRange(&orders, req.StartTicks, req.EndTicks)
|
||||
order.FilterOrdersByTimeRange(&orders, req.StartTime, req.EndTime)
|
||||
return orders, nil
|
||||
}
|
||||
|
||||
@@ -434,7 +434,7 @@ func (a *Alphapoint) GetOrderHistory(req *order.GetOrdersRequest) ([]order.Detai
|
||||
|
||||
order.FilterOrdersByType(&orders, req.Type)
|
||||
order.FilterOrdersBySide(&orders, req.Side)
|
||||
order.FilterOrdersByTickRange(&orders, req.StartTicks, req.EndTicks)
|
||||
order.FilterOrdersByTimeRange(&orders, req.StartTime, req.EndTime)
|
||||
return orders, nil
|
||||
}
|
||||
|
||||
|
||||
@@ -1,10 +1,15 @@
|
||||
package asset
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"strings"
|
||||
)
|
||||
|
||||
var (
|
||||
ErrNotSupported = errors.New("received unsupported asset type")
|
||||
)
|
||||
|
||||
// Item stores the asset type
|
||||
type Item string
|
||||
|
||||
@@ -101,7 +106,8 @@ func New(input string) (Item, error) {
|
||||
return supported[i], nil
|
||||
}
|
||||
}
|
||||
return "", fmt.Errorf("cannot create new asset: input %s mismatch to supported asset list %s",
|
||||
return "", fmt.Errorf("%w %v, only supports %v",
|
||||
ErrNotSupported,
|
||||
input,
|
||||
supported)
|
||||
}
|
||||
|
||||
@@ -548,24 +548,22 @@ func (b *Binance) CancelExistingOrder(symbol currency.Pair, orderID int64, origC
|
||||
// OpenOrders Current open orders. Get all open orders on a symbol.
|
||||
// Careful when accessing this with no symbol: The number of requests counted against the rate limiter
|
||||
// is significantly higher
|
||||
func (b *Binance) OpenOrders(pair *currency.Pair) ([]QueryOrderData, error) {
|
||||
func (b *Binance) OpenOrders(pair currency.Pair) ([]QueryOrderData, error) {
|
||||
var resp []QueryOrderData
|
||||
|
||||
params := url.Values{}
|
||||
|
||||
var symbol string
|
||||
if pair != nil {
|
||||
var err error
|
||||
symbol, err = b.FormatSymbol(*pair, asset.Spot)
|
||||
var p string
|
||||
var err error
|
||||
if !pair.IsEmpty() {
|
||||
p, err = b.FormatSymbol(pair, asset.Spot)
|
||||
if err != nil {
|
||||
return resp, err
|
||||
return nil, err
|
||||
}
|
||||
params.Add("symbol", p)
|
||||
} else {
|
||||
// extend the receive window when all currencies to prevent "recvwindow" error
|
||||
params.Set("recvWindow", "10000")
|
||||
}
|
||||
if symbol != "" {
|
||||
params.Set("symbol", symbol)
|
||||
}
|
||||
|
||||
if err := b.SendAuthHTTPRequest(exchange.RestSpotSupplementary, http.MethodGet, openOrders, params, openOrdersLimit(symbol), &resp); err != nil {
|
||||
if err := b.SendAuthHTTPRequest(exchange.RestSpotSupplementary, http.MethodGet, openOrders, params, openOrdersLimit(p), &resp); err != nil {
|
||||
return resp, err
|
||||
}
|
||||
|
||||
@@ -675,6 +673,17 @@ func (b *Binance) SendAuthHTTPRequest(ePath exchange.URL, method, path string, p
|
||||
params = url.Values{}
|
||||
}
|
||||
recvWindow := 5 * time.Second
|
||||
if params.Get("recvWindow") != "" {
|
||||
// convert recvWindow value into time.Duration
|
||||
var recvWindowParam int64
|
||||
recvWindowParam, err = convert.Int64FromString(params.Get("recvWindow"))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
recvWindow = time.Duration(recvWindowParam) * time.Millisecond
|
||||
} else {
|
||||
params.Set("recvWindow", strconv.FormatInt(convert.RecvWindow(recvWindow), 10))
|
||||
}
|
||||
params.Set("recvWindow", strconv.FormatInt(convert.RecvWindow(recvWindow), 10))
|
||||
params.Set("timestamp", strconv.FormatInt(time.Now().Unix()*1000, 10))
|
||||
signature := params.Encode()
|
||||
|
||||
@@ -1136,7 +1136,7 @@ func (b *Binance) FuturesOpenOrderData(symbol currency.Pair, orderID, origClient
|
||||
func (b *Binance) GetFuturesAllOpenOrders(symbol currency.Pair, pair string) ([]FuturesOrderData, error) {
|
||||
var resp []FuturesOrderData
|
||||
params := url.Values{}
|
||||
if symbol != (currency.Pair{}) {
|
||||
if !symbol.IsEmpty() {
|
||||
symbolValue, err := b.FormatSymbol(symbol, asset.CoinMarginedFutures)
|
||||
if err != nil {
|
||||
return resp, err
|
||||
@@ -1153,7 +1153,7 @@ func (b *Binance) GetFuturesAllOpenOrders(symbol currency.Pair, pair string) ([]
|
||||
func (b *Binance) GetAllFuturesOrders(symbol currency.Pair, pair string, startTime, endTime time.Time, orderID, limit int64) ([]FuturesOrderData, error) {
|
||||
var resp []FuturesOrderData
|
||||
params := url.Values{}
|
||||
if symbol != (currency.Pair{}) {
|
||||
if !symbol.IsEmpty() {
|
||||
symbolValue, err := b.FormatSymbol(symbol, asset.CoinMarginedFutures)
|
||||
if err != nil {
|
||||
return resp, err
|
||||
|
||||
@@ -1268,16 +1268,18 @@ func TestQueryOrder(t *testing.T) {
|
||||
|
||||
func TestOpenOrders(t *testing.T) {
|
||||
t.Parallel()
|
||||
if !areTestAPIKeysSet() {
|
||||
t.Skip()
|
||||
}
|
||||
_, err := b.OpenOrders(currency.Pair{})
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
|
||||
p := currency.NewPair(currency.BTC, currency.USDT)
|
||||
_, err := b.OpenOrders(&p)
|
||||
switch {
|
||||
case areTestAPIKeysSet() && err != nil:
|
||||
t.Error("OpenOrders() error", err)
|
||||
case !areTestAPIKeysSet() && err == nil && !mockTests:
|
||||
t.Error("OpenOrders() expecting an error when no keys are set")
|
||||
case mockTests && err != nil:
|
||||
t.Error("Mock OpenOrders() error", err)
|
||||
_, err = b.OpenOrders(p)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -189,7 +189,6 @@ func (b *Binance) SetDefaults() {
|
||||
b.Websocket = stream.New()
|
||||
b.WebsocketResponseMaxLimit = exchange.DefaultWebsocketResponseMaxLimit
|
||||
b.WebsocketResponseCheckTimeout = exchange.DefaultWebsocketResponseCheckTimeout
|
||||
b.WebsocketOrderbookBufferLimit = exchange.DefaultWebsocketOrderbookBufferLimit
|
||||
}
|
||||
|
||||
// Setup takes in the supplied exchange configuration details and sets params
|
||||
@@ -919,7 +918,7 @@ func (b *Binance) CancelAllOrders(req *order.Cancel) (order.CancelAllResponse, e
|
||||
cancelAllOrdersResponse.Status = make(map[string]string)
|
||||
switch req.AssetType {
|
||||
case asset.Spot, asset.Margin:
|
||||
openOrders, err := b.OpenOrders(&req.Pair)
|
||||
openOrders, err := b.OpenOrders(req.Pair)
|
||||
if err != nil {
|
||||
return cancelAllOrdersResponse, err
|
||||
}
|
||||
@@ -1013,10 +1012,11 @@ func (b *Binance) GetOrderInfo(orderID string, pair currency.Pair, assetType ass
|
||||
Pair: pair,
|
||||
Cost: resp.CummulativeQuoteQty,
|
||||
AssetType: assetType,
|
||||
CloseTime: resp.UpdateTime,
|
||||
Status: status,
|
||||
Price: resp.Price,
|
||||
ExecutedAmount: resp.ExecutedQty,
|
||||
Date: resp.Time,
|
||||
LastUpdated: resp.UpdateTime,
|
||||
}, nil
|
||||
case asset.CoinMarginedFutures:
|
||||
orderData, err := b.GetAllFuturesOrders(pair, "", time.Time{}, time.Time{}, orderIDInt, 0)
|
||||
@@ -1052,6 +1052,8 @@ func (b *Binance) GetOrderInfo(orderID string, pair currency.Pair, assetType ass
|
||||
respData.Side = orderVars.Side
|
||||
respData.Status = orderVars.Status
|
||||
respData.Type = orderVars.OrderType
|
||||
respData.Date = orderData[0].Time
|
||||
respData.LastUpdated = orderData[0].UpdateTime
|
||||
case asset.USDTMarginedFutures:
|
||||
orderData, err := b.UAllAccountOrders(currency.Pair{}, 0, 0, time.Time{}, time.Time{})
|
||||
if err != nil {
|
||||
@@ -1086,6 +1088,8 @@ func (b *Binance) GetOrderInfo(orderID string, pair currency.Pair, assetType ass
|
||||
respData.Side = orderVars.Side
|
||||
respData.Status = orderVars.Status
|
||||
respData.Type = orderVars.OrderType
|
||||
respData.Date = orderData[0].Time
|
||||
respData.LastUpdated = orderData[0].UpdateTime
|
||||
default:
|
||||
return respData, fmt.Errorf("assetType %s not supported", assetType)
|
||||
}
|
||||
@@ -1143,119 +1147,109 @@ func (b *Binance) GetActiveOrders(req *order.GetOrdersRequest) ([]order.Detail,
|
||||
if err := req.Validate(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
addAll := len(req.Pairs) == 0
|
||||
var orders []order.Detail
|
||||
switch req.AssetType {
|
||||
case asset.Spot, asset.Margin:
|
||||
resp, err := b.OpenOrders(¤cy.Pair{})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
for i := range resp {
|
||||
pair, err := currency.NewPairFromString(resp[i].Symbol)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if !addAll && !req.Pairs.Contains(pair, false) {
|
||||
continue
|
||||
}
|
||||
orderSide := order.Side(strings.ToUpper(resp[i].Side))
|
||||
orderType := order.Type(strings.ToUpper(resp[i].Type))
|
||||
orders = append(orders, order.Detail{
|
||||
Amount: resp[i].OrigQty,
|
||||
Date: resp[i].Time,
|
||||
Exchange: b.Name,
|
||||
ID: strconv.FormatInt(resp[i].OrderID, 10),
|
||||
Side: orderSide,
|
||||
Type: orderType,
|
||||
Price: resp[i].Price,
|
||||
Status: order.Status(resp[i].Status),
|
||||
Pair: pair,
|
||||
AssetType: asset.Spot,
|
||||
})
|
||||
}
|
||||
case asset.CoinMarginedFutures:
|
||||
openOrders, err := b.GetFuturesAllOpenOrders(currency.Pair{}, "")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
for y := range openOrders {
|
||||
pair, err := currency.NewPairFromString(openOrders[y].Symbol)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if !addAll && !req.Pairs.Contains(pair, false) {
|
||||
continue
|
||||
}
|
||||
var feeBuilder exchange.FeeBuilder
|
||||
feeBuilder.Amount = openOrders[y].ExecutedQty
|
||||
feeBuilder.PurchasePrice = openOrders[y].AvgPrice
|
||||
feeBuilder.Pair = pair
|
||||
fee, err := b.GetFee(&feeBuilder)
|
||||
if err != nil {
|
||||
return orders, err
|
||||
}
|
||||
orderVars := compatibleOrderVars(openOrders[y].Side, openOrders[y].Status, openOrders[y].OrderType)
|
||||
orders = append(orders, order.Detail{
|
||||
Price: openOrders[y].Price,
|
||||
Amount: openOrders[y].OrigQty,
|
||||
ExecutedAmount: openOrders[y].ExecutedQty,
|
||||
RemainingAmount: openOrders[y].OrigQty - openOrders[y].ExecutedQty,
|
||||
Fee: fee,
|
||||
Exchange: b.Name,
|
||||
ID: strconv.FormatInt(openOrders[y].OrderID, 10),
|
||||
ClientOrderID: openOrders[y].ClientOrderID,
|
||||
Type: orderVars.OrderType,
|
||||
Side: orderVars.Side,
|
||||
Status: orderVars.Status,
|
||||
Pair: pair,
|
||||
AssetType: asset.CoinMarginedFutures,
|
||||
})
|
||||
}
|
||||
case asset.USDTMarginedFutures:
|
||||
openOrders, err := b.UAllAccountOpenOrders(currency.Pair{})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
for y := range openOrders {
|
||||
pair, err := currency.NewPairFromString(openOrders[y].Symbol)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if !addAll && !req.Pairs.Contains(pair, false) {
|
||||
continue
|
||||
}
|
||||
var feeBuilder exchange.FeeBuilder
|
||||
feeBuilder.Amount = openOrders[y].ExecutedQty
|
||||
feeBuilder.PurchasePrice = openOrders[y].AvgPrice
|
||||
feeBuilder.Pair = pair
|
||||
fee, err := b.GetFee(&feeBuilder)
|
||||
if err != nil {
|
||||
return orders, err
|
||||
}
|
||||
orderVars := compatibleOrderVars(openOrders[y].Side, openOrders[y].Status, openOrders[y].OrderType)
|
||||
orders = append(orders, order.Detail{
|
||||
Price: openOrders[y].Price,
|
||||
Amount: openOrders[y].OrigQty,
|
||||
ExecutedAmount: openOrders[y].ExecutedQty,
|
||||
RemainingAmount: openOrders[y].OrigQty - openOrders[y].ExecutedQty,
|
||||
Fee: fee,
|
||||
Exchange: b.Name,
|
||||
ID: strconv.FormatInt(openOrders[y].OrderID, 10),
|
||||
ClientOrderID: openOrders[y].ClientOrderID,
|
||||
Type: orderVars.OrderType,
|
||||
Side: orderVars.Side,
|
||||
Status: orderVars.Status,
|
||||
Pair: pair,
|
||||
AssetType: asset.USDTMarginedFutures,
|
||||
})
|
||||
}
|
||||
default:
|
||||
return orders, fmt.Errorf("assetType not supported")
|
||||
if len(req.Pairs) == 0 || len(req.Pairs) >= 40 {
|
||||
// sending an empty currency pair retrieves data for all currencies
|
||||
req.Pairs = append(req.Pairs, currency.Pair{})
|
||||
}
|
||||
var orders []order.Detail
|
||||
for i := range req.Pairs {
|
||||
switch req.AssetType {
|
||||
case asset.Spot, asset.Margin:
|
||||
resp, err := b.OpenOrders(req.Pairs[i])
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
for x := range resp {
|
||||
orderSide := order.Side(strings.ToUpper(resp[x].Side))
|
||||
orderType := order.Type(strings.ToUpper(resp[x].Type))
|
||||
orders = append(orders, order.Detail{
|
||||
Amount: resp[x].OrigQty,
|
||||
Date: resp[x].Time,
|
||||
Exchange: b.Name,
|
||||
ID: strconv.FormatInt(resp[x].OrderID, 10),
|
||||
Side: orderSide,
|
||||
Type: orderType,
|
||||
Price: resp[x].Price,
|
||||
Status: order.Status(resp[x].Status),
|
||||
Pair: req.Pairs[i],
|
||||
AssetType: asset.Spot,
|
||||
LastUpdated: resp[x].UpdateTime,
|
||||
})
|
||||
}
|
||||
case asset.CoinMarginedFutures:
|
||||
openOrders, err := b.GetFuturesAllOpenOrders(req.Pairs[i], "")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
for y := range openOrders {
|
||||
var feeBuilder exchange.FeeBuilder
|
||||
feeBuilder.Amount = openOrders[y].ExecutedQty
|
||||
feeBuilder.PurchasePrice = openOrders[y].AvgPrice
|
||||
feeBuilder.Pair = req.Pairs[i]
|
||||
fee, err := b.GetFee(&feeBuilder)
|
||||
if err != nil {
|
||||
return orders, err
|
||||
}
|
||||
orderVars := compatibleOrderVars(openOrders[y].Side, openOrders[y].Status, openOrders[y].OrderType)
|
||||
orders = append(orders, order.Detail{
|
||||
Price: openOrders[y].Price,
|
||||
Amount: openOrders[y].OrigQty,
|
||||
ExecutedAmount: openOrders[y].ExecutedQty,
|
||||
RemainingAmount: openOrders[y].OrigQty - openOrders[y].ExecutedQty,
|
||||
Fee: fee,
|
||||
Exchange: b.Name,
|
||||
ID: strconv.FormatInt(openOrders[y].OrderID, 10),
|
||||
ClientOrderID: openOrders[y].ClientOrderID,
|
||||
Type: orderVars.OrderType,
|
||||
Side: orderVars.Side,
|
||||
Status: orderVars.Status,
|
||||
Pair: req.Pairs[i],
|
||||
AssetType: asset.CoinMarginedFutures,
|
||||
Date: openOrders[y].Time,
|
||||
LastUpdated: openOrders[y].UpdateTime,
|
||||
})
|
||||
}
|
||||
case asset.USDTMarginedFutures:
|
||||
openOrders, err := b.UAllAccountOpenOrders(req.Pairs[i])
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
for y := range openOrders {
|
||||
var feeBuilder exchange.FeeBuilder
|
||||
feeBuilder.Amount = openOrders[y].ExecutedQuantity
|
||||
feeBuilder.PurchasePrice = openOrders[y].AveragePrice
|
||||
feeBuilder.Pair = req.Pairs[i]
|
||||
fee, err := b.GetFee(&feeBuilder)
|
||||
if err != nil {
|
||||
return orders, err
|
||||
}
|
||||
orderVars := compatibleOrderVars(openOrders[y].Side, openOrders[y].Status, openOrders[y].OrderType)
|
||||
orders = append(orders, order.Detail{
|
||||
Price: openOrders[y].Price,
|
||||
Amount: openOrders[y].OriginalQuantity,
|
||||
ExecutedAmount: openOrders[y].ExecutedQuantity,
|
||||
RemainingAmount: openOrders[y].OriginalQuantity - openOrders[y].ExecutedQuantity,
|
||||
Fee: fee,
|
||||
Exchange: b.Name,
|
||||
ID: strconv.FormatInt(openOrders[y].OrderID, 10),
|
||||
ClientOrderID: openOrders[y].ClientOrderID,
|
||||
Type: orderVars.OrderType,
|
||||
Side: orderVars.Side,
|
||||
Status: orderVars.Status,
|
||||
Pair: req.Pairs[i],
|
||||
AssetType: asset.USDTMarginedFutures,
|
||||
Date: openOrders[y].Time,
|
||||
LastUpdated: openOrders[y].UpdateTime,
|
||||
})
|
||||
}
|
||||
default:
|
||||
return orders, fmt.Errorf("assetType not supported")
|
||||
}
|
||||
}
|
||||
order.FilterOrdersByCurrencies(&orders, req.Pairs)
|
||||
order.FilterOrdersByType(&orders, req.Type)
|
||||
order.FilterOrdersBySide(&orders, req.Side)
|
||||
order.FilterOrdersByTickRange(&orders, req.StartTicks, req.EndTicks)
|
||||
order.FilterOrdersByTimeRange(&orders, req.StartTime, req.EndTime)
|
||||
return orders, nil
|
||||
}
|
||||
|
||||
@@ -1291,7 +1285,6 @@ func (b *Binance) GetOrderHistory(req *order.GetOrdersRequest) ([]order.Detail,
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
orders = append(orders, order.Detail{
|
||||
Amount: resp[i].OrigQty,
|
||||
Date: resp[i].Time,
|
||||
@@ -1310,18 +1303,18 @@ func (b *Binance) GetOrderHistory(req *order.GetOrdersRequest) ([]order.Detail,
|
||||
var orderHistory []FuturesOrderData
|
||||
var err error
|
||||
switch {
|
||||
case !req.StartTicks.IsZero() && !req.EndTicks.IsZero() && req.OrderID == "":
|
||||
if req.EndTicks.Before(req.StartTicks) {
|
||||
case !req.StartTime.IsZero() && !req.EndTime.IsZero() && req.OrderID == "":
|
||||
if req.EndTime.Before(req.StartTime) {
|
||||
return nil, errors.New("endTime cannot be before startTime")
|
||||
}
|
||||
if time.Since(req.StartTicks) > time.Hour*24*30 {
|
||||
if time.Since(req.StartTime) > time.Hour*24*30 {
|
||||
return nil, fmt.Errorf("can only fetch orders 30 days out")
|
||||
}
|
||||
orderHistory, err = b.GetAllFuturesOrders(req.Pairs[i], "", req.StartTicks, req.EndTicks, 0, 0)
|
||||
orderHistory, err = b.GetAllFuturesOrders(req.Pairs[i], "", req.StartTime, req.EndTime, 0, 0)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
case req.OrderID != "" && req.StartTicks.IsZero() && req.EndTicks.IsZero():
|
||||
case req.OrderID != "" && req.StartTime.IsZero() && req.EndTime.IsZero():
|
||||
fromID, err := strconv.ParseInt(req.OrderID, 10, 64)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -1357,6 +1350,7 @@ func (b *Binance) GetOrderHistory(req *order.GetOrdersRequest) ([]order.Detail,
|
||||
Status: orderVars.Status,
|
||||
Pair: req.Pairs[i],
|
||||
AssetType: asset.CoinMarginedFutures,
|
||||
Date: orderHistory[y].Time,
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -1365,18 +1359,18 @@ func (b *Binance) GetOrderHistory(req *order.GetOrdersRequest) ([]order.Detail,
|
||||
var orderHistory []UFuturesOrderData
|
||||
var err error
|
||||
switch {
|
||||
case !req.StartTicks.IsZero() && !req.EndTicks.IsZero() && req.OrderID == "":
|
||||
if req.EndTicks.Before(req.StartTicks) {
|
||||
case !req.StartTime.IsZero() && !req.EndTime.IsZero() && req.OrderID == "":
|
||||
if req.EndTime.Before(req.StartTime) {
|
||||
return nil, errors.New("endTime cannot be before startTime")
|
||||
}
|
||||
if time.Since(req.StartTicks) > time.Hour*24*7 {
|
||||
if time.Since(req.StartTime) > time.Hour*24*7 {
|
||||
return nil, fmt.Errorf("can only fetch orders 7 days out")
|
||||
}
|
||||
orderHistory, err = b.UAllAccountOrders(req.Pairs[i], 0, 0, req.StartTicks, req.EndTicks)
|
||||
orderHistory, err = b.UAllAccountOrders(req.Pairs[i], 0, 0, req.StartTime, req.EndTime)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
case req.OrderID != "" && req.StartTicks.IsZero() && req.EndTicks.IsZero():
|
||||
case req.OrderID != "" && req.StartTime.IsZero() && req.EndTime.IsZero():
|
||||
fromID, err := strconv.ParseInt(req.OrderID, 10, 64)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -1412,6 +1406,7 @@ func (b *Binance) GetOrderHistory(req *order.GetOrdersRequest) ([]order.Detail,
|
||||
Status: orderVars.Status,
|
||||
Pair: req.Pairs[i],
|
||||
AssetType: asset.USDTMarginedFutures,
|
||||
Date: orderHistory[y].Time,
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -1420,7 +1415,7 @@ func (b *Binance) GetOrderHistory(req *order.GetOrdersRequest) ([]order.Detail,
|
||||
}
|
||||
order.FilterOrdersByType(&orders, req.Type)
|
||||
order.FilterOrdersBySide(&orders, req.Side)
|
||||
order.FilterOrdersByTickRange(&orders, req.StartTicks, req.EndTicks)
|
||||
order.FilterOrdersByTimeRange(&orders, req.StartTime, req.EndTime)
|
||||
return orders, nil
|
||||
}
|
||||
|
||||
|
||||
@@ -262,30 +262,30 @@ type FuturesOrderGetData struct {
|
||||
|
||||
// FuturesOrderData stores order data for futures
|
||||
type FuturesOrderData struct {
|
||||
AvgPrice float64 `json:"avgPrice,string"`
|
||||
ClientOrderID string `json:"clientOrderId"`
|
||||
CumBase string `json:"cumBase"`
|
||||
ExecutedQty float64 `json:"executedQty,string"`
|
||||
OrderID int64 `json:"orderId"`
|
||||
OrigQty float64 `json:"origQty,string"`
|
||||
OrigType string `json:"origType"`
|
||||
Price float64 `json:"price,string"`
|
||||
ReduceOnly bool `json:"reduceOnly"`
|
||||
Side string `json:"side"`
|
||||
PositionSide string `json:"positionSide"`
|
||||
Status string `json:"status"`
|
||||
StopPrice float64 `json:"stopPrice,string"`
|
||||
ClosePosition bool `json:"closePosition"`
|
||||
Symbol string `json:"symbol"`
|
||||
Pair string `json:"pair"`
|
||||
Time int64 `json:"time"`
|
||||
TimeInForce string `json:"timeInForce"`
|
||||
OrderType string `json:"type"`
|
||||
ActivatePrice float64 `json:"activatePrice,string"`
|
||||
PriceRate float64 `json:"priceRate,string"`
|
||||
UpdateTime int64 `json:"updateTime"`
|
||||
WorkingType string `json:"workingType"`
|
||||
PriceProtect bool `json:"priceProtect"`
|
||||
AvgPrice float64 `json:"avgPrice,string"`
|
||||
ClientOrderID string `json:"clientOrderId"`
|
||||
CumBase string `json:"cumBase"`
|
||||
ExecutedQty float64 `json:"executedQty,string"`
|
||||
OrderID int64 `json:"orderId"`
|
||||
OrigQty float64 `json:"origQty,string"`
|
||||
OrigType string `json:"origType"`
|
||||
Price float64 `json:"price,string"`
|
||||
ReduceOnly bool `json:"reduceOnly"`
|
||||
Side string `json:"side"`
|
||||
PositionSide string `json:"positionSide"`
|
||||
Status string `json:"status"`
|
||||
StopPrice float64 `json:"stopPrice,string"`
|
||||
ClosePosition bool `json:"closePosition"`
|
||||
Symbol string `json:"symbol"`
|
||||
Pair string `json:"pair"`
|
||||
Time time.Time `json:"time"`
|
||||
TimeInForce string `json:"timeInForce"`
|
||||
OrderType string `json:"type"`
|
||||
ActivatePrice float64 `json:"activatePrice,string"`
|
||||
PriceRate float64 `json:"priceRate,string"`
|
||||
UpdateTime time.Time `json:"updateTime"`
|
||||
WorkingType string `json:"workingType"`
|
||||
PriceProtect bool `json:"priceProtect"`
|
||||
}
|
||||
|
||||
// OrderVars stores side, status and type for any order/trade
|
||||
|
||||
@@ -211,6 +211,60 @@ func (a *QueryOrderData) UnmarshalJSON(data []byte) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// UnmarshalJSON deserialises the JSON info, including the timestamp
|
||||
func (a *FuturesOrderData) UnmarshalJSON(data []byte) error {
|
||||
type Alias FuturesOrderData
|
||||
aux := &struct {
|
||||
Time binanceTime `json:"time"`
|
||||
UpdateTime binanceTime `json:"updateTime"`
|
||||
*Alias
|
||||
}{
|
||||
Alias: (*Alias)(a),
|
||||
}
|
||||
if err := json.Unmarshal(data, &aux); err != nil {
|
||||
return err
|
||||
}
|
||||
a.Time = aux.Time.Time()
|
||||
a.UpdateTime = aux.UpdateTime.Time()
|
||||
return nil
|
||||
}
|
||||
|
||||
// UnmarshalJSON deserialises the JSON info, including the timestamp
|
||||
func (a *UFuturesOrderData) UnmarshalJSON(data []byte) error {
|
||||
type Alias UFuturesOrderData
|
||||
aux := &struct {
|
||||
Time binanceTime `json:"time"`
|
||||
UpdateTime binanceTime `json:"updateTime"`
|
||||
*Alias
|
||||
}{
|
||||
Alias: (*Alias)(a),
|
||||
}
|
||||
if err := json.Unmarshal(data, &aux); err != nil {
|
||||
return err
|
||||
}
|
||||
a.Time = aux.Time.Time()
|
||||
a.UpdateTime = aux.UpdateTime.Time()
|
||||
return nil
|
||||
}
|
||||
|
||||
// UnmarshalJSON deserialises the JSON info, including the timestamp
|
||||
func (a *UOrderData) UnmarshalJSON(data []byte) error {
|
||||
type Alias UOrderData
|
||||
aux := &struct {
|
||||
Time binanceTime `json:"time"`
|
||||
UpdateTime binanceTime `json:"updateTime"`
|
||||
*Alias
|
||||
}{
|
||||
Alias: (*Alias)(a),
|
||||
}
|
||||
if err := json.Unmarshal(data, &aux); err != nil {
|
||||
return err
|
||||
}
|
||||
a.Time = aux.Time.Time()
|
||||
a.UpdateTime = aux.UpdateTime.Time()
|
||||
return nil
|
||||
}
|
||||
|
||||
// UnmarshalJSON deserialises the JSON info, including the timestamp
|
||||
func (a *Account) UnmarshalJSON(data []byte) error {
|
||||
type Alias Account
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
package binance
|
||||
|
||||
import "time"
|
||||
|
||||
var (
|
||||
validFuturesIntervals = []string{
|
||||
"1m", "3m", "5m", "15m", "30m",
|
||||
@@ -183,56 +185,57 @@ type UCompositeIndexInfoData struct {
|
||||
|
||||
// UOrderData stores order data
|
||||
type UOrderData struct {
|
||||
ClientOrderID string `json:"clientOrderId"`
|
||||
CumQty float64 `json:"cumQty,string"`
|
||||
CumQuote float64 `json:"cumQuote,string"`
|
||||
ExecutedQty float64 `json:"executedQty,string"`
|
||||
OrderID int64 `json:"orderId"`
|
||||
AvgPrice float64 `json:"avgPrice,string"`
|
||||
OrigQty float64 `json:"origQty,string"`
|
||||
Price float64 `json:"price,string"`
|
||||
ReduceOnly bool `json:"reduceOnly"`
|
||||
Side string `json:"side"`
|
||||
PositionSide string `json:"positionSide"`
|
||||
Status string `json:"status"`
|
||||
StopPrice float64 `json:"stopPrice,string"`
|
||||
ClosePosition bool `json:"closePosition"`
|
||||
Symbol string `json:"symbol"`
|
||||
TimeInForce string `json:"timeInForce"`
|
||||
OrderType string `json:"type"`
|
||||
OrigType string `json:"origType"`
|
||||
ActivatePrice float64 `json:"activatePrice,string"`
|
||||
PriceRate float64 `json:"priceRate,string"`
|
||||
UpdateTime int64 `json:"updateTime"`
|
||||
WorkingType string `json:"workingType"`
|
||||
Code int64 `json:"code"`
|
||||
Msg string `json:"msg"`
|
||||
ClientOrderID string `json:"clientOrderId"`
|
||||
Time time.Time `json:"time"`
|
||||
CumulativeQuantity float64 `json:"cumQty,string"`
|
||||
CumulativeQuote float64 `json:"cumQuote,string"`
|
||||
ExecutedQuantity float64 `json:"executedQty,string"`
|
||||
OrderID int64 `json:"orderId"`
|
||||
AveragePrice float64 `json:"avgPrice,string"`
|
||||
OriginalQuantity float64 `json:"origQty,string"`
|
||||
Price float64 `json:"price,string"`
|
||||
ReduceOnly bool `json:"reduceOnly"`
|
||||
Side string `json:"side"`
|
||||
PositionSide string `json:"positionSide"`
|
||||
Status string `json:"status"`
|
||||
StopPrice float64 `json:"stopPrice,string"`
|
||||
ClosePosition bool `json:"closePosition"`
|
||||
Symbol string `json:"symbol"`
|
||||
TimeInForce string `json:"timeInForce"`
|
||||
OrderType string `json:"type"`
|
||||
OriginalType string `json:"origType"`
|
||||
ActivatePrice float64 `json:"activatePrice,string"`
|
||||
PriceRate float64 `json:"priceRate,string"`
|
||||
UpdateTime time.Time `json:"updateTime"`
|
||||
WorkingType string `json:"workingType"`
|
||||
Code int64 `json:"code"`
|
||||
Message string `json:"msg"`
|
||||
}
|
||||
|
||||
// UFuturesOrderData stores order data for ufutures
|
||||
type UFuturesOrderData struct {
|
||||
AvgPrice float64 `json:"avgPrice,string"`
|
||||
ClientOrderID string `json:"clientOrderId"`
|
||||
CumQuote string `json:"cumQuote"`
|
||||
ExecutedQty float64 `json:"executedQty,string"`
|
||||
OrderID int64 `json:"orderId"`
|
||||
OrigQty float64 `json:"origQty,string"`
|
||||
OrigType string `json:"origType"`
|
||||
Price float64 `json:"price,string"`
|
||||
ReduceOnly bool `json:"reduceOnly"`
|
||||
Side string `json:"side"`
|
||||
PositionSide string `json:"positionSide"`
|
||||
Status string `json:"status"`
|
||||
StopPrice float64 `json:"stopPrice,string"`
|
||||
ClosePosition bool `json:"closePosition"`
|
||||
Symbol string `json:"symbol"`
|
||||
Time int64 `json:"time"`
|
||||
TimeInForce string `json:"timeInForce"`
|
||||
OrderType string `json:"type"`
|
||||
ActivatePrice float64 `json:"activatePrice,string"`
|
||||
PriceRate float64 `json:"priceRate,string"`
|
||||
UpdateTime int64 `json:"updateTime"`
|
||||
WorkingType string `json:"workingType"`
|
||||
AvgPrice float64 `json:"avgPrice,string"`
|
||||
ClientOrderID string `json:"clientOrderId"`
|
||||
CumQuote string `json:"cumQuote"`
|
||||
ExecutedQty float64 `json:"executedQty,string"`
|
||||
OrderID int64 `json:"orderId"`
|
||||
OrigQty float64 `json:"origQty,string"`
|
||||
OrigType string `json:"origType"`
|
||||
Price float64 `json:"price,string"`
|
||||
ReduceOnly bool `json:"reduceOnly"`
|
||||
Side string `json:"side"`
|
||||
PositionSide string `json:"positionSide"`
|
||||
Status string `json:"status"`
|
||||
StopPrice float64 `json:"stopPrice,string"`
|
||||
ClosePosition bool `json:"closePosition"`
|
||||
Symbol string `json:"symbol"`
|
||||
Time time.Time `json:"time"`
|
||||
TimeInForce string `json:"timeInForce"`
|
||||
OrderType string `json:"type"`
|
||||
ActivatePrice float64 `json:"activatePrice,string"`
|
||||
PriceRate float64 `json:"priceRate,string"`
|
||||
UpdateTime time.Time `json:"updateTime"`
|
||||
WorkingType string `json:"workingType"`
|
||||
}
|
||||
|
||||
// UAccountBalanceV2Data stores account balance data for ufutures
|
||||
|
||||
@@ -862,7 +862,7 @@ func (b *Bitfinex) GetActiveOrders(req *order.GetOrdersRequest) ([]order.Detail,
|
||||
|
||||
order.FilterOrdersBySide(&orders, req.Side)
|
||||
order.FilterOrdersByType(&orders, req.Type)
|
||||
order.FilterOrdersByTickRange(&orders, req.StartTicks, req.EndTicks)
|
||||
order.FilterOrdersByTimeRange(&orders, req.StartTime, req.EndTime)
|
||||
order.FilterOrdersByCurrencies(&orders, req.Pairs)
|
||||
return orders, nil
|
||||
}
|
||||
@@ -930,7 +930,7 @@ func (b *Bitfinex) GetOrderHistory(req *order.GetOrdersRequest) ([]order.Detail,
|
||||
|
||||
order.FilterOrdersBySide(&orders, req.Side)
|
||||
order.FilterOrdersByType(&orders, req.Type)
|
||||
order.FilterOrdersByTickRange(&orders, req.StartTicks, req.EndTicks)
|
||||
order.FilterOrdersByTimeRange(&orders, req.StartTime, req.EndTime)
|
||||
for i := range req.Pairs {
|
||||
b.appendOptionalDelimiter(&req.Pairs[i])
|
||||
}
|
||||
|
||||
@@ -625,7 +625,7 @@ func (b *Bithumb) GetActiveOrders(req *order.GetOrdersRequest) ([]order.Detail,
|
||||
}
|
||||
|
||||
order.FilterOrdersBySide(&orders, req.Side)
|
||||
order.FilterOrdersByTickRange(&orders, req.StartTicks, req.EndTicks)
|
||||
order.FilterOrdersByTimeRange(&orders, req.StartTime, req.EndTime)
|
||||
order.FilterOrdersByCurrencies(&orders, req.Pairs)
|
||||
return orders, nil
|
||||
}
|
||||
@@ -676,7 +676,7 @@ func (b *Bithumb) GetOrderHistory(req *order.GetOrdersRequest) ([]order.Detail,
|
||||
}
|
||||
|
||||
order.FilterOrdersBySide(&orders, req.Side)
|
||||
order.FilterOrdersByTickRange(&orders, req.StartTicks, req.EndTicks)
|
||||
order.FilterOrdersByTimeRange(&orders, req.StartTime, req.EndTime)
|
||||
order.FilterOrdersByCurrencies(&orders, req.Pairs)
|
||||
return orders, nil
|
||||
}
|
||||
|
||||
@@ -719,6 +719,7 @@ func (b *Bitmex) GetActiveOrders(req *order.GetOrdersRequest) ([]order.Detail, e
|
||||
}
|
||||
|
||||
orderDetail := order.Detail{
|
||||
Date: resp[i].Timestamp,
|
||||
Price: resp[i].Price,
|
||||
Amount: float64(resp[i].OrderQty),
|
||||
Exchange: b.Name,
|
||||
@@ -736,7 +737,7 @@ func (b *Bitmex) GetActiveOrders(req *order.GetOrdersRequest) ([]order.Detail, e
|
||||
|
||||
order.FilterOrdersBySide(&orders, req.Side)
|
||||
order.FilterOrdersByType(&orders, req.Type)
|
||||
order.FilterOrdersByTickRange(&orders, req.StartTicks, req.EndTicks)
|
||||
order.FilterOrdersByTimeRange(&orders, req.StartTime, req.EndTime)
|
||||
order.FilterOrdersByCurrencies(&orders, req.Pairs)
|
||||
return orders, nil
|
||||
}
|
||||
@@ -786,7 +787,7 @@ func (b *Bitmex) GetOrderHistory(req *order.GetOrdersRequest) ([]order.Detail, e
|
||||
|
||||
order.FilterOrdersBySide(&orders, req.Side)
|
||||
order.FilterOrdersByType(&orders, req.Type)
|
||||
order.FilterOrdersByTickRange(&orders, req.StartTicks, req.EndTicks)
|
||||
order.FilterOrdersByTimeRange(&orders, req.StartTime, req.EndTime)
|
||||
order.FilterOrdersByCurrencies(&orders, req.Pairs)
|
||||
return orders, nil
|
||||
}
|
||||
|
||||
@@ -692,7 +692,7 @@ func (b *Bitstamp) GetActiveOrders(req *order.GetOrdersRequest) ([]order.Detail,
|
||||
})
|
||||
}
|
||||
|
||||
order.FilterOrdersByTickRange(&orders, req.StartTicks, req.EndTicks)
|
||||
order.FilterOrdersByTimeRange(&orders, req.StartTime, req.EndTime)
|
||||
order.FilterOrdersByCurrencies(&orders, req.Pairs)
|
||||
return orders, nil
|
||||
}
|
||||
@@ -775,7 +775,7 @@ func (b *Bitstamp) GetOrderHistory(req *order.GetOrdersRequest) ([]order.Detail,
|
||||
})
|
||||
}
|
||||
|
||||
order.FilterOrdersByTickRange(&orders, req.StartTicks, req.EndTicks)
|
||||
order.FilterOrdersByTimeRange(&orders, req.StartTime, req.EndTime)
|
||||
order.FilterOrdersByCurrencies(&orders, req.Pairs)
|
||||
return orders, nil
|
||||
}
|
||||
|
||||
@@ -304,8 +304,8 @@ func TestGetFee(t *testing.T) {
|
||||
// CryptocurrencyWithdrawalFee Basic
|
||||
feeBuilder = setFeeBuilder()
|
||||
feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee
|
||||
if resp, err := b.GetFee(feeBuilder); resp != float64(0.0005) || err != nil {
|
||||
t.Errorf("Expected: %f, Received: %f", float64(0.0005), resp)
|
||||
if resp, err := b.GetFee(feeBuilder); resp != float64(0.00015) || err != nil {
|
||||
t.Errorf("Expected: %f, Received: %f", float64(0.00015), resp)
|
||||
t.Error(err)
|
||||
}
|
||||
|
||||
|
||||
@@ -630,7 +630,7 @@ func (b *Bittrex) GetActiveOrders(req *order.GetOrdersRequest) ([]order.Detail,
|
||||
}
|
||||
|
||||
order.FilterOrdersByType(&orders, req.Type)
|
||||
order.FilterOrdersByTickRange(&orders, req.StartTicks, req.EndTicks)
|
||||
order.FilterOrdersByTimeRange(&orders, req.StartTime, req.EndTime)
|
||||
order.FilterOrdersByCurrencies(&orders, req.Pairs)
|
||||
return orders, nil
|
||||
}
|
||||
@@ -699,7 +699,7 @@ func (b *Bittrex) GetOrderHistory(req *order.GetOrdersRequest) ([]order.Detail,
|
||||
}
|
||||
|
||||
order.FilterOrdersByType(&orders, req.Type)
|
||||
order.FilterOrdersByTickRange(&orders, req.StartTicks, req.EndTicks)
|
||||
order.FilterOrdersByTimeRange(&orders, req.StartTime, req.EndTime)
|
||||
order.FilterOrdersByCurrencies(&orders, req.Pairs)
|
||||
return orders, nil
|
||||
}
|
||||
|
||||
@@ -780,7 +780,7 @@ func (b *BTCMarkets) GetActiveOrders(req *order.GetOrdersRequest) ([]order.Detai
|
||||
}
|
||||
}
|
||||
order.FilterOrdersByType(&resp, req.Type)
|
||||
order.FilterOrdersByTickRange(&resp, req.StartTicks, req.EndTicks)
|
||||
order.FilterOrdersByTimeRange(&resp, req.StartTime, req.EndTime)
|
||||
order.FilterOrdersBySide(&resp, req.Side)
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
@@ -821,7 +821,7 @@ func (b *BTSE) GetActiveOrders(req *order.GetOrdersRequest) ([]order.Detail, err
|
||||
}
|
||||
|
||||
order.FilterOrdersByType(&orders, req.Type)
|
||||
order.FilterOrdersByTickRange(&orders, req.StartTicks, req.EndTicks)
|
||||
order.FilterOrdersByTimeRange(&orders, req.StartTime, req.EndTime)
|
||||
order.FilterOrdersBySide(&orders, req.Side)
|
||||
return orders, nil
|
||||
}
|
||||
|
||||
@@ -765,7 +765,7 @@ func (c *CoinbasePro) GetActiveOrders(req *order.GetOrdersRequest) ([]order.Deta
|
||||
}
|
||||
|
||||
order.FilterOrdersByType(&orders, req.Type)
|
||||
order.FilterOrdersByTickRange(&orders, req.StartTicks, req.EndTicks)
|
||||
order.FilterOrdersByTimeRange(&orders, req.StartTime, req.EndTime)
|
||||
order.FilterOrdersBySide(&orders, req.Side)
|
||||
return orders, nil
|
||||
}
|
||||
@@ -818,7 +818,7 @@ func (c *CoinbasePro) GetOrderHistory(req *order.GetOrdersRequest) ([]order.Deta
|
||||
}
|
||||
|
||||
order.FilterOrdersByType(&orders, req.Type)
|
||||
order.FilterOrdersByTickRange(&orders, req.StartTicks, req.EndTicks)
|
||||
order.FilterOrdersByTimeRange(&orders, req.StartTime, req.EndTime)
|
||||
order.FilterOrdersBySide(&orders, req.Side)
|
||||
return orders, nil
|
||||
}
|
||||
|
||||
@@ -928,7 +928,7 @@ func (c *COINUT) GetActiveOrders(req *order.GetOrdersRequest) ([]order.Detail, e
|
||||
}
|
||||
}
|
||||
|
||||
order.FilterOrdersByTickRange(&orders, req.StartTicks, req.EndTicks)
|
||||
order.FilterOrdersByTimeRange(&orders, req.StartTime, req.EndTime)
|
||||
order.FilterOrdersBySide(&orders, req.Side)
|
||||
return orders, nil
|
||||
}
|
||||
@@ -1034,7 +1034,7 @@ func (c *COINUT) GetOrderHistory(req *order.GetOrdersRequest) ([]order.Detail, e
|
||||
}
|
||||
}
|
||||
|
||||
order.FilterOrdersByTickRange(&allOrders, req.StartTicks, req.EndTicks)
|
||||
order.FilterOrdersByTimeRange(&allOrders, req.StartTime, req.EndTime)
|
||||
order.FilterOrdersBySide(&allOrders, req.Side)
|
||||
return allOrders, nil
|
||||
}
|
||||
|
||||
@@ -601,7 +601,7 @@ func (e *EXMO) GetActiveOrders(req *order.GetOrdersRequest) ([]order.Detail, err
|
||||
})
|
||||
}
|
||||
|
||||
order.FilterOrdersByTickRange(&orders, req.StartTicks, req.EndTicks)
|
||||
order.FilterOrdersByTimeRange(&orders, req.StartTime, req.EndTime)
|
||||
order.FilterOrdersBySide(&orders, req.Side)
|
||||
return orders, nil
|
||||
}
|
||||
@@ -652,7 +652,7 @@ func (e *EXMO) GetOrderHistory(req *order.GetOrdersRequest) ([]order.Detail, err
|
||||
})
|
||||
}
|
||||
|
||||
order.FilterOrdersByTickRange(&orders, req.StartTicks, req.EndTicks)
|
||||
order.FilterOrdersByTimeRange(&orders, req.StartTime, req.EndTime)
|
||||
order.FilterOrdersBySide(&orders, req.Side)
|
||||
return orders, nil
|
||||
}
|
||||
|
||||
@@ -901,7 +901,7 @@ func (f *FTX) GetOrderHistory(getOrdersRequest *order.GetOrdersRequest) ([]order
|
||||
}
|
||||
|
||||
orderData, err := f.FetchOrderHistory(formattedPair.String(),
|
||||
getOrdersRequest.StartTicks, getOrdersRequest.EndTicks, "")
|
||||
getOrdersRequest.StartTime, getOrdersRequest.EndTime, "")
|
||||
if err != nil {
|
||||
return resp, err
|
||||
}
|
||||
@@ -938,8 +938,8 @@ func (f *FTX) GetOrderHistory(getOrdersRequest *order.GetOrdersRequest) ([]order
|
||||
resp = append(resp, tempResp)
|
||||
}
|
||||
triggerOrderData, err := f.GetTriggerOrderHistory(formattedPair.String(),
|
||||
getOrdersRequest.StartTicks,
|
||||
getOrdersRequest.EndTicks,
|
||||
getOrdersRequest.StartTime,
|
||||
getOrdersRequest.EndTime,
|
||||
strings.ToLower(getOrdersRequest.Side.String()),
|
||||
strings.ToLower(getOrdersRequest.Type.String()),
|
||||
"")
|
||||
|
||||
@@ -752,7 +752,7 @@ func (g *Gateio) GetActiveOrders(req *order.GetOrdersRequest) ([]order.Detail, e
|
||||
})
|
||||
}
|
||||
}
|
||||
order.FilterOrdersByTickRange(&orders, req.StartTicks, req.EndTicks)
|
||||
order.FilterOrdersByTimeRange(&orders, req.StartTime, req.EndTime)
|
||||
order.FilterOrdersBySide(&orders, req.Side)
|
||||
return orders, nil
|
||||
}
|
||||
@@ -798,7 +798,7 @@ func (g *Gateio) GetOrderHistory(req *order.GetOrdersRequest) ([]order.Detail, e
|
||||
})
|
||||
}
|
||||
|
||||
order.FilterOrdersByTickRange(&orders, req.StartTicks, req.EndTicks)
|
||||
order.FilterOrdersByTimeRange(&orders, req.StartTime, req.EndTime)
|
||||
order.FilterOrdersBySide(&orders, req.Side)
|
||||
return orders, nil
|
||||
}
|
||||
|
||||
@@ -599,7 +599,7 @@ func (g *Gemini) GetActiveOrders(req *order.GetOrdersRequest) ([]order.Detail, e
|
||||
})
|
||||
}
|
||||
|
||||
order.FilterOrdersByTickRange(&orders, req.StartTicks, req.EndTicks)
|
||||
order.FilterOrdersByTimeRange(&orders, req.StartTime, req.EndTime)
|
||||
order.FilterOrdersBySide(&orders, req.Side)
|
||||
order.FilterOrdersByType(&orders, req.Type)
|
||||
order.FilterOrdersByCurrencies(&orders, req.Pairs)
|
||||
@@ -624,7 +624,7 @@ func (g *Gemini) GetOrderHistory(req *order.GetOrdersRequest) ([]order.Detail, e
|
||||
return nil, err
|
||||
}
|
||||
|
||||
resp, err := g.GetTradeHistory(fpair.String(), req.StartTicks.Unix())
|
||||
resp, err := g.GetTradeHistory(fpair.String(), req.StartTime.Unix())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -660,7 +660,7 @@ func (g *Gemini) GetOrderHistory(req *order.GetOrdersRequest) ([]order.Detail, e
|
||||
})
|
||||
}
|
||||
|
||||
order.FilterOrdersByTickRange(&orders, req.StartTicks, req.EndTicks)
|
||||
order.FilterOrdersByTimeRange(&orders, req.StartTime, req.EndTime)
|
||||
order.FilterOrdersBySide(&orders, req.Side)
|
||||
return orders, nil
|
||||
}
|
||||
|
||||
@@ -719,7 +719,7 @@ func (h *HitBTC) GetActiveOrders(req *order.GetOrdersRequest) ([]order.Detail, e
|
||||
})
|
||||
}
|
||||
|
||||
order.FilterOrdersByTickRange(&orders, req.StartTicks, req.EndTicks)
|
||||
order.FilterOrdersByTimeRange(&orders, req.StartTime, req.EndTime)
|
||||
order.FilterOrdersBySide(&orders, req.Side)
|
||||
return orders, nil
|
||||
}
|
||||
@@ -769,7 +769,7 @@ func (h *HitBTC) GetOrderHistory(req *order.GetOrdersRequest) ([]order.Detail, e
|
||||
})
|
||||
}
|
||||
|
||||
order.FilterOrdersByTickRange(&orders, req.StartTicks, req.EndTicks)
|
||||
order.FilterOrdersByTimeRange(&orders, req.StartTime, req.EndTime)
|
||||
order.FilterOrdersBySide(&orders, req.Side)
|
||||
return orders, nil
|
||||
}
|
||||
|
||||
@@ -1384,7 +1384,7 @@ func (h *HUOBI) GetActiveOrders(req *order.GetOrdersRequest) ([]order.Detail, er
|
||||
}
|
||||
order.FilterOrdersByType(&orders, req.Type)
|
||||
order.FilterOrdersBySide(&orders, req.Side)
|
||||
order.FilterOrdersByTickRange(&orders, req.StartTicks, req.EndTicks)
|
||||
order.FilterOrdersByTimeRange(&orders, req.StartTime, req.EndTime)
|
||||
return orders, nil
|
||||
}
|
||||
|
||||
@@ -1435,7 +1435,7 @@ func (h *HUOBI) GetOrderHistory(req *order.GetOrdersRequest) ([]order.Detail, er
|
||||
for x := range req.Pairs {
|
||||
var currentPage int64 = 0
|
||||
for done := false; !done; {
|
||||
orderHistory, err := h.GetSwapOrderHistory(req.Pairs[x], "all", "all", []order.Status{order.AnyStatus}, int64(req.EndTicks.Sub(req.StartTicks).Hours()/24), currentPage, 50)
|
||||
orderHistory, err := h.GetSwapOrderHistory(req.Pairs[x], "all", "all", []order.Status{order.AnyStatus}, int64(req.EndTime.Sub(req.StartTime).Hours()/24), currentPage, 50)
|
||||
if err != nil {
|
||||
return orders, err
|
||||
}
|
||||
@@ -1479,7 +1479,7 @@ func (h *HUOBI) GetOrderHistory(req *order.GetOrdersRequest) ([]order.Detail, er
|
||||
for x := range req.Pairs {
|
||||
var currentPage int64 = 0
|
||||
for done := false; !done; {
|
||||
openOrders, err := h.FGetOrderHistory(req.Pairs[x], "", "all", "all", "limit", []order.Status{order.AnyStatus}, int64(req.EndTicks.Sub(req.StartTicks).Hours()/24), currentPage, 50)
|
||||
openOrders, err := h.FGetOrderHistory(req.Pairs[x], "", "all", "all", "limit", []order.Status{order.AnyStatus}, int64(req.EndTime.Sub(req.StartTime).Hours()/24), currentPage, 50)
|
||||
if err != nil {
|
||||
return orders, err
|
||||
}
|
||||
@@ -1528,7 +1528,7 @@ func (h *HUOBI) GetOrderHistory(req *order.GetOrdersRequest) ([]order.Detail, er
|
||||
}
|
||||
}
|
||||
}
|
||||
order.FilterOrdersByTickRange(&orders, req.StartTicks, req.EndTicks)
|
||||
order.FilterOrdersByTimeRange(&orders, req.StartTime, req.EndTime)
|
||||
return orders, nil
|
||||
}
|
||||
|
||||
|
||||
@@ -553,7 +553,7 @@ func (i *ItBit) GetActiveOrders(req *order.GetOrdersRequest) ([]order.Detail, er
|
||||
})
|
||||
}
|
||||
|
||||
order.FilterOrdersByTickRange(&orders, req.StartTicks, req.EndTicks)
|
||||
order.FilterOrdersByTimeRange(&orders, req.StartTime, req.EndTime)
|
||||
order.FilterOrdersBySide(&orders, req.Side)
|
||||
order.FilterOrdersByCurrencies(&orders, req.Pairs)
|
||||
return orders, nil
|
||||
@@ -621,7 +621,7 @@ func (i *ItBit) GetOrderHistory(req *order.GetOrdersRequest) ([]order.Detail, er
|
||||
})
|
||||
}
|
||||
|
||||
order.FilterOrdersByTickRange(&orders, req.StartTicks, req.EndTicks)
|
||||
order.FilterOrdersByTimeRange(&orders, req.StartTime, req.EndTime)
|
||||
order.FilterOrdersBySide(&orders, req.Side)
|
||||
order.FilterOrdersByCurrencies(&orders, req.Pairs)
|
||||
return orders, nil
|
||||
|
||||
@@ -1124,7 +1124,7 @@ func (k *Kraken) GetActiveOrders(req *order.GetOrdersRequest) ([]order.Detail, e
|
||||
default:
|
||||
return nil, fmt.Errorf("%s assetType not supported", req.AssetType)
|
||||
}
|
||||
order.FilterOrdersByTickRange(&orders, req.StartTicks, req.EndTicks)
|
||||
order.FilterOrdersByTimeRange(&orders, req.StartTime, req.EndTime)
|
||||
order.FilterOrdersBySide(&orders, req.Side)
|
||||
order.FilterOrdersByCurrencies(&orders, req.Pairs)
|
||||
return orders, nil
|
||||
@@ -1140,11 +1140,11 @@ func (k *Kraken) GetOrderHistory(getOrdersRequest *order.GetOrdersRequest) ([]or
|
||||
switch getOrdersRequest.AssetType {
|
||||
case asset.Spot:
|
||||
req := GetClosedOrdersOptions{}
|
||||
if getOrdersRequest.StartTicks.Unix() > 0 {
|
||||
req.Start = strconv.FormatInt(getOrdersRequest.StartTicks.Unix(), 10)
|
||||
if getOrdersRequest.StartTime.Unix() > 0 {
|
||||
req.Start = strconv.FormatInt(getOrdersRequest.StartTime.Unix(), 10)
|
||||
}
|
||||
if getOrdersRequest.EndTicks.Unix() > 0 {
|
||||
req.End = strconv.FormatInt(getOrdersRequest.EndTicks.Unix(), 10)
|
||||
if getOrdersRequest.EndTime.Unix() > 0 {
|
||||
req.End = strconv.FormatInt(getOrdersRequest.EndTime.Unix(), 10)
|
||||
}
|
||||
|
||||
assetType := getOrdersRequest.AssetType
|
||||
|
||||
@@ -582,7 +582,7 @@ func (l *LakeBTC) GetActiveOrders(req *order.GetOrdersRequest) ([]order.Detail,
|
||||
})
|
||||
}
|
||||
|
||||
order.FilterOrdersByTickRange(&orders, req.StartTicks, req.EndTicks)
|
||||
order.FilterOrdersByTimeRange(&orders, req.StartTime, req.EndTime)
|
||||
order.FilterOrdersBySide(&orders, req.Side)
|
||||
order.FilterOrdersByCurrencies(&orders, req.Pairs)
|
||||
|
||||
@@ -630,7 +630,7 @@ func (l *LakeBTC) GetOrderHistory(req *order.GetOrdersRequest) ([]order.Detail,
|
||||
})
|
||||
}
|
||||
|
||||
order.FilterOrdersByTickRange(&orders, req.StartTicks, req.EndTicks)
|
||||
order.FilterOrdersByTimeRange(&orders, req.StartTime, req.EndTime)
|
||||
order.FilterOrdersBySide(&orders, req.Side)
|
||||
order.FilterOrdersByCurrencies(&orders, req.Pairs)
|
||||
|
||||
|
||||
@@ -552,8 +552,8 @@ func (l *LocalBitcoins) GetActiveOrders(getOrdersRequest *order.GetOrdersRequest
|
||||
})
|
||||
}
|
||||
|
||||
order.FilterOrdersByTickRange(&orders, getOrdersRequest.StartTicks,
|
||||
getOrdersRequest.EndTicks)
|
||||
order.FilterOrdersByTimeRange(&orders, getOrdersRequest.StartTime,
|
||||
getOrdersRequest.EndTime)
|
||||
order.FilterOrdersBySide(&orders, getOrdersRequest.Side)
|
||||
|
||||
return orders, nil
|
||||
@@ -638,8 +638,8 @@ func (l *LocalBitcoins) GetOrderHistory(getOrdersRequest *order.GetOrdersRequest
|
||||
})
|
||||
}
|
||||
|
||||
order.FilterOrdersByTickRange(&orders, getOrdersRequest.StartTicks,
|
||||
getOrdersRequest.EndTicks)
|
||||
order.FilterOrdersByTimeRange(&orders, getOrdersRequest.StartTime,
|
||||
getOrdersRequest.EndTime)
|
||||
order.FilterOrdersBySide(&orders, getOrdersRequest.Side)
|
||||
|
||||
return orders, nil
|
||||
|
||||
@@ -203,7 +203,7 @@ func TestFilterOrdersBySide(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestFilterOrdersByTickRange(t *testing.T) {
|
||||
func TestFilterOrdersByTimeRange(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
var orders = []Detail{
|
||||
@@ -218,25 +218,31 @@ func TestFilterOrdersByTickRange(t *testing.T) {
|
||||
},
|
||||
}
|
||||
|
||||
FilterOrdersByTickRange(&orders, time.Unix(0, 0), time.Unix(0, 0))
|
||||
FilterOrdersByTimeRange(&orders, time.Unix(0, 0), time.Unix(0, 0))
|
||||
if len(orders) != 3 {
|
||||
t.Errorf("Orders failed to be filtered. Expected %v, received %v", 3, len(orders))
|
||||
}
|
||||
|
||||
FilterOrdersByTickRange(&orders, time.Unix(100, 0), time.Unix(111, 0))
|
||||
FilterOrdersByTimeRange(&orders, time.Unix(100, 0), time.Unix(111, 0))
|
||||
if len(orders) != 3 {
|
||||
t.Errorf("Orders failed to be filtered. Expected %v, received %v", 3, len(orders))
|
||||
}
|
||||
|
||||
FilterOrdersByTickRange(&orders, time.Unix(101, 0), time.Unix(111, 0))
|
||||
FilterOrdersByTimeRange(&orders, time.Unix(101, 0), time.Unix(111, 0))
|
||||
if len(orders) != 2 {
|
||||
t.Errorf("Orders failed to be filtered. Expected %v, received %v", 2, len(orders))
|
||||
}
|
||||
|
||||
FilterOrdersByTickRange(&orders, time.Unix(200, 0), time.Unix(300, 0))
|
||||
FilterOrdersByTimeRange(&orders, time.Unix(200, 0), time.Unix(300, 0))
|
||||
if len(orders) != 0 {
|
||||
t.Errorf("Orders failed to be filtered. Expected %v, received %v", 0, len(orders))
|
||||
}
|
||||
orders = append(orders, Detail{})
|
||||
// test for event no timestamp is set on an order, best to include it
|
||||
FilterOrdersByTimeRange(&orders, time.Unix(200, 0), time.Unix(300, 0))
|
||||
if len(orders) != 1 {
|
||||
t.Errorf("Orders failed to be filtered. Expected %v, received %v", 1, len(orders))
|
||||
}
|
||||
}
|
||||
|
||||
func TestFilterOrdersByCurrencies(t *testing.T) {
|
||||
@@ -280,6 +286,11 @@ func TestFilterOrdersByCurrencies(t *testing.T) {
|
||||
if len(orders) != 1 {
|
||||
t.Errorf("Orders failed to be filtered. Expected %v, received %v", 1, len(orders))
|
||||
}
|
||||
currencies = append(currencies, currency.Pair{})
|
||||
FilterOrdersByCurrencies(&orders, currencies)
|
||||
if len(orders) != 1 {
|
||||
t.Errorf("Orders failed to be filtered. Expected %v, received %v", 1, len(orders))
|
||||
}
|
||||
}
|
||||
|
||||
func TestSortOrdersByPrice(t *testing.T) {
|
||||
|
||||
@@ -205,11 +205,11 @@ type TradeHistory struct {
|
||||
|
||||
// GetOrdersRequest used for GetOrderHistory and GetOpenOrders wrapper functions
|
||||
type GetOrdersRequest struct {
|
||||
Type Type
|
||||
Side Side
|
||||
StartTicks time.Time
|
||||
EndTicks time.Time
|
||||
OrderID string
|
||||
Type Type
|
||||
Side Side
|
||||
StartTime time.Time
|
||||
EndTime time.Time
|
||||
OrderID string
|
||||
// Currencies Empty array = all currencies. Some endpoints only support
|
||||
// singular currency enquiries
|
||||
Pairs currency.Pairs
|
||||
|
||||
@@ -427,20 +427,20 @@ func FilterOrdersByType(orders *[]Detail, orderType Type) {
|
||||
*orders = filteredOrders
|
||||
}
|
||||
|
||||
// FilterOrdersByTickRange removes any OrderDetails outside of the tick range
|
||||
func FilterOrdersByTickRange(orders *[]Detail, startTicks, endTicks time.Time) {
|
||||
if startTicks.IsZero() ||
|
||||
endTicks.IsZero() ||
|
||||
startTicks.Unix() == 0 ||
|
||||
endTicks.Unix() == 0 ||
|
||||
endTicks.Before(startTicks) {
|
||||
// FilterOrdersByTimeRange removes any OrderDetails outside of the time range
|
||||
func FilterOrdersByTimeRange(orders *[]Detail, startTime, endTime time.Time) {
|
||||
if startTime.IsZero() ||
|
||||
endTime.IsZero() ||
|
||||
startTime.Unix() == 0 ||
|
||||
endTime.Unix() == 0 ||
|
||||
endTime.Before(startTime) {
|
||||
return
|
||||
}
|
||||
|
||||
var filteredOrders []Detail
|
||||
for i := range *orders {
|
||||
if (*orders)[i].Date.Unix() >= startTicks.Unix() &&
|
||||
(*orders)[i].Date.Unix() <= endTicks.Unix() {
|
||||
if ((*orders)[i].Date.Unix() >= startTime.Unix() && (*orders)[i].Date.Unix() <= endTime.Unix()) ||
|
||||
(*orders)[i].Date.IsZero() {
|
||||
filteredOrders = append(filteredOrders, (*orders)[i])
|
||||
}
|
||||
}
|
||||
@@ -455,6 +455,9 @@ func FilterOrdersByCurrencies(orders *[]Detail, currencies []currency.Pair) {
|
||||
if len(currencies) == 0 {
|
||||
return
|
||||
}
|
||||
if len(currencies) == 1 && currencies[0].IsEmpty() {
|
||||
return
|
||||
}
|
||||
|
||||
var filteredOrders []Detail
|
||||
for i := range *orders {
|
||||
|
||||
@@ -767,7 +767,7 @@ func (p *Poloniex) GetActiveOrders(req *order.GetOrdersRequest) ([]order.Detail,
|
||||
}
|
||||
}
|
||||
|
||||
order.FilterOrdersByTickRange(&orders, req.StartTicks, req.EndTicks)
|
||||
order.FilterOrdersByTimeRange(&orders, req.StartTime, req.EndTime)
|
||||
order.FilterOrdersByCurrencies(&orders, req.Pairs)
|
||||
order.FilterOrdersBySide(&orders, req.Side)
|
||||
|
||||
@@ -781,8 +781,8 @@ func (p *Poloniex) GetOrderHistory(req *order.GetOrdersRequest) ([]order.Detail,
|
||||
return nil, err
|
||||
}
|
||||
|
||||
resp, err := p.GetAuthenticatedTradeHistory(req.StartTicks.Unix(),
|
||||
req.EndTicks.Unix(),
|
||||
resp, err := p.GetAuthenticatedTradeHistory(req.StartTime.Unix(),
|
||||
req.EndTime.Unix(),
|
||||
10000)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
||||
@@ -347,8 +347,8 @@ func TestGetOrderHistory(t *testing.T) {
|
||||
AssetType: asset.Spot,
|
||||
Pairs: []currency.Pair{currency.NewPair(currency.LTC,
|
||||
currency.BTC)},
|
||||
StartTicks: time.Unix(0, 0),
|
||||
EndTicks: time.Unix(math.MaxInt64, 0),
|
||||
StartTime: time.Unix(0, 0),
|
||||
EndTime: time.Unix(math.MaxInt64, 0),
|
||||
}
|
||||
|
||||
_, err := y.GetOrderHistory(&getOrdersRequest)
|
||||
|
||||
@@ -577,7 +577,7 @@ func (y *Yobit) GetActiveOrders(req *order.GetOrdersRequest) ([]order.Detail, er
|
||||
}
|
||||
}
|
||||
|
||||
order.FilterOrdersByTickRange(&orders, req.StartTicks, req.EndTicks)
|
||||
order.FilterOrdersByTimeRange(&orders, req.StartTime, req.EndTime)
|
||||
order.FilterOrdersBySide(&orders, req.Side)
|
||||
return orders, nil
|
||||
}
|
||||
@@ -598,8 +598,8 @@ func (y *Yobit) GetOrderHistory(req *order.GetOrdersRequest) ([]order.Detail, er
|
||||
resp, err := y.GetTradeHistory(0,
|
||||
10000,
|
||||
math.MaxInt64,
|
||||
req.StartTicks.Unix(),
|
||||
req.EndTicks.Unix(),
|
||||
req.StartTime.Unix(),
|
||||
req.EndTime.Unix(),
|
||||
"DESC",
|
||||
fpair.String())
|
||||
if err != nil {
|
||||
|
||||
@@ -724,7 +724,7 @@ func (z *ZB) GetActiveOrders(req *order.GetOrdersRequest) ([]order.Detail, error
|
||||
})
|
||||
}
|
||||
|
||||
order.FilterOrdersByTickRange(&orders, req.StartTicks, req.EndTicks)
|
||||
order.FilterOrdersByTimeRange(&orders, req.StartTime, req.EndTime)
|
||||
order.FilterOrdersBySide(&orders, req.Side)
|
||||
return orders, nil
|
||||
}
|
||||
@@ -807,7 +807,7 @@ func (z *ZB) GetOrderHistory(req *order.GetOrdersRequest) ([]order.Detail, error
|
||||
})
|
||||
}
|
||||
|
||||
order.FilterOrdersByTickRange(&orders, req.StartTicks, req.EndTicks)
|
||||
order.FilterOrdersByTimeRange(&orders, req.StartTime, req.EndTime)
|
||||
return orders, nil
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user