Skip to content

Commit

Permalink
Merge pull request #1024 from c9s/fix/binance-my-trades-api
Browse files Browse the repository at this point in the history
fix: binance my trades api
  • Loading branch information
c9s authored Dec 9, 2022
2 parents 37f4435 + 096defc commit d3dea28
Show file tree
Hide file tree
Showing 7 changed files with 289 additions and 35 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/go.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ jobs:

- uses: actions/checkout@v2
with:
lfs: 'true'
# lfs: 'true'
ssh-key: ${{ secrets.git_ssh_key }}

- uses: actions/cache@v2
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ go 1.17
require (
github.com/DATA-DOG/go-sqlmock v1.5.0
github.com/Masterminds/squirrel v1.5.3
github.com/adshao/go-binance/v2 v2.3.8
github.com/adshao/go-binance/v2 v2.3.10
github.com/c-bata/goptuna v0.8.1
github.com/c9s/requestgen v1.3.0
github.com/c9s/rockhopper v1.2.2-0.20220617053729-ffdc87df194b
Expand Down
2 changes: 2 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,8 @@ github.com/adshao/go-binance/v2 v2.3.5 h1:WVYZecm0w8l14YoWlnKZj6xxZT2AKMTHpMQSqI
github.com/adshao/go-binance/v2 v2.3.5/go.mod h1:8Pg/FGTLyAhq8QXA0IkoReKyRpoxJcK3LVujKDAZV/c=
github.com/adshao/go-binance/v2 v2.3.8 h1:9VsAX4jUopnIOlzrvnKUFUf9SWB/nwPgJtUsM2dkj6A=
github.com/adshao/go-binance/v2 v2.3.8/go.mod h1:Z3MCnWI0gHC4Rea8TWiF3aN1t4nV9z3CaU/TeHcKsLM=
github.com/adshao/go-binance/v2 v2.3.10 h1:iWtHD/sQ8GK6r+cSMMdOynpGI/4Q6P5LZtiEHdWOjag=
github.com/adshao/go-binance/v2 v2.3.10/go.mod h1:Z3MCnWI0gHC4Rea8TWiF3aN1t4nV9z3CaU/TeHcKsLM=
github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
Expand Down
27 changes: 27 additions & 0 deletions pkg/exchange/binance/binanceapi/get_my_trades_request.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package binanceapi

import (
"time"

"github.com/c9s/requestgen"

"github.com/adshao/go-binance/v2"
)

type Trade = binance.TradeV3

//go:generate requestgen -method GET -url "/api/v3/myTrades" -type GetMyTradesRequest -responseType []Trade
type GetMyTradesRequest struct {
client requestgen.AuthenticatedAPIClient

symbol string `param:"symbol"`
orderID *uint64 `param:"orderId"`
startTime *time.Time `param:"startTime,milliseconds"`
endTime *time.Time `param:"endTime,milliseconds"`
fromID *uint64 `param:"fromId"`
limit *uint64 `param:"limit"`
}

func (c *RestClient) NewGetMyTradesRequest() *GetMyTradesRequest {
return &GetMyTradesRequest{client: c}
}
218 changes: 218 additions & 0 deletions pkg/exchange/binance/binanceapi/get_my_trades_request_requestgen.go

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

67 changes: 34 additions & 33 deletions pkg/exchange/binance/exchange.go
Original file line number Diff line number Diff line change
Expand Up @@ -1413,22 +1413,23 @@ func (e *Exchange) queryMarginTrades(ctx context.Context, symbol string, options
req.Limit(1000)
}

// BINANCE seems to have an API bug, we can't use both fromId and the start time/end time
// BINANCE uses inclusive last trade ID
if options.LastTradeID > 0 {
req.FromID(int64(options.LastTradeID))
}

if options.StartTime != nil && options.EndTime != nil {
if options.EndTime.Sub(*options.StartTime) < 24*time.Hour {
} else {
if options.StartTime != nil && options.EndTime != nil {
if options.EndTime.Sub(*options.StartTime) < 24*time.Hour {
req.StartTime(options.StartTime.UnixMilli())
req.EndTime(options.EndTime.UnixMilli())
} else {
req.StartTime(options.StartTime.UnixMilli())
}
} else if options.StartTime != nil {
req.StartTime(options.StartTime.UnixMilli())
} else if options.EndTime != nil {
req.EndTime(options.EndTime.UnixMilli())
} else {
req.StartTime(options.StartTime.UnixMilli())
}
} else if options.StartTime != nil {
req.StartTime(options.StartTime.UnixMilli())
} else if options.EndTime != nil {
req.EndTime(options.EndTime.UnixMilli())
}

remoteTrades, err = req.Do(ctx)
Expand Down Expand Up @@ -1499,40 +1500,40 @@ func (e *Exchange) queryFuturesTrades(ctx context.Context, symbol string, option
}

func (e *Exchange) querySpotTrades(ctx context.Context, symbol string, options *types.TradeQueryOptions) (trades []types.Trade, err error) {
var remoteTrades []*binance.TradeV3
req := e.client.NewListTradesService().
Symbol(symbol)

if options.Limit > 0 {
req.Limit(int(options.Limit))
} else {
req.Limit(1000)
}
req := e.client2.NewGetMyTradesRequest()
req.Symbol(symbol)

// BINANCE uses inclusive last trade ID
if options.LastTradeID > 0 {
req.FromID(int64(options.LastTradeID))
req.FromID(options.LastTradeID)
} else {
if options.StartTime != nil && options.EndTime != nil {
if options.EndTime.Sub(*options.StartTime) < 24*time.Hour {
req.StartTime(*options.StartTime)
req.EndTime(*options.EndTime)
} else {
req.StartTime(*options.StartTime)
}
} else if options.StartTime != nil {
req.StartTime(*options.StartTime)
} else if options.EndTime != nil {
req.EndTime(*options.EndTime)
}
}

if options.StartTime != nil && options.EndTime != nil {
if options.EndTime.Sub(*options.StartTime) < 24*time.Hour {
req.StartTime(options.StartTime.UnixMilli())
req.EndTime(options.EndTime.UnixMilli())
} else {
req.StartTime(options.StartTime.UnixMilli())
}
} else if options.StartTime != nil {
req.StartTime(options.StartTime.UnixMilli())
} else if options.EndTime != nil {
req.EndTime(options.EndTime.UnixMilli())
if options.Limit > 0 {
req.Limit(uint64(options.Limit))
} else {
req.Limit(1000)
}

remoteTrades, err = req.Do(ctx)
remoteTrades, err := req.Do(ctx)
if err != nil {
return nil, err
}

for _, t := range remoteTrades {
localTrade, err := toGlobalTrade(*t, e.IsMargin)
localTrade, err := toGlobalTrade(t, e.IsMargin)
if err != nil {
log.WithError(err).Errorf("can not convert binance trade: %+v", t)
continue
Expand Down
6 changes: 6 additions & 0 deletions pkg/strategy/grid2/strategy_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import (
"github.com/c9s/bbgo/pkg/fixedpoint"
"github.com/c9s/bbgo/pkg/types"
"github.com/c9s/bbgo/pkg/types/mocks"
"github.com/c9s/bbgo/pkg/util"

gridmocks "github.com/c9s/bbgo/pkg/strategy/grid2/mocks"
)
Expand Down Expand Up @@ -816,6 +817,11 @@ func TestStrategy_checkMinimalQuoteInvestment(t *testing.T) {
}

func TestBacktestStrategy(t *testing.T) {
if v, ok := util.GetEnvVarBool("TEST_BACKTEST"); !ok || !v {
t.Skip("backtest flag is required")
return
}

market := types.Market{
BaseCurrency: "BTC",
QuoteCurrency: "USDT",
Expand Down

0 comments on commit d3dea28

Please sign in to comment.