Skip to content

Commit f586d37

Browse files
committed
1. support /fapi/v3/positionRisk; 2. use built-in json 3. enable
websocket compression
1 parent 03a0e81 commit f586d37

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+231
-22
lines changed

v2/account_service.go

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package binance
22

33
import (
44
"context"
5+
"encoding/json"
56
"net/http"
67
)
78

v2/asset_detail_service.go

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package binance
22

33
import (
44
"context"
5+
"encoding/json"
56
"net/http"
67
)
78

v2/asset_dividend_service.go

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package binance
22

33
import (
44
"context"
5+
"encoding/json"
56
"net/http"
67
)
78

v2/bnb_burn_service.go

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package binance
22

33
import (
44
"context"
5+
"encoding/json"
56
"net/http"
67
)
78

v2/c2c_service.go

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package binance
22

33
import (
44
"context"
5+
"encoding/json"
56
"net/http"
67
)
78

v2/client.go

+2-4
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,9 @@ import (
1212
"os"
1313
"time"
1414

15+
"encoding/json"
16+
1517
"github.com/bitly/go-simplejson"
16-
jsoniter "github.com/json-iterator/go"
1718

1819
"github.com/adshao/go-binance/v2/common"
1920
"github.com/adshao/go-binance/v2/delivery"
@@ -133,9 +134,6 @@ type SelfTradePreventionMode string
133134
// UseTestnet switch all the API endpoints from production to the testnet
134135
var UseTestnet = false
135136

136-
// Redefining the standard package
137-
var json = jsoniter.ConfigCompatibleWithStandardLibrary
138-
139137
// Global enums
140138
const (
141139
SideTypeBuy SideType = "BUY"

v2/common/helpers.go

+13
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,19 @@ func AmountToLotSize(lot float64, precision int, amount float64) float64 {
1111
return math.Trunc(math.Floor(amount/lot)*lot*math.Pow10(precision)) / math.Pow10(precision)
1212
}
1313

14+
func RoundPriceToTickSize(price, tickSize float64) float64 {
15+
if tickSize == 0 {
16+
return price // To avoid division by zero
17+
}
18+
// Calculate the factor by which to multiply and divide the price to conform to the tick size.
19+
factor := 1 / tickSize
20+
21+
// Round the price to the nearest tick size.
22+
roundedPrice := math.Round(price*factor) / factor
23+
24+
return roundedPrice
25+
}
26+
1427
// ToJSONList convert v to json list if v is a map
1528
func ToJSONList(v []byte) []byte {
1629
if len(v) > 0 && v[0] == '{' {

v2/convert_trade.go

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package binance
22

33
import (
44
"context"
5+
"encoding/json"
56
"net/http"
67
)
78

v2/delivery/websocket.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ var wsServe = func(cfg *WsConfig, handler WsHandler, errHandler ErrHandler) (don
3939
Dialer := websocket.Dialer{
4040
Proxy: proxy,
4141
HandshakeTimeout: 45 * time.Second,
42-
EnableCompression: false,
42+
EnableCompression: true,
4343
}
4444

4545
c, _, err := Dialer.Dial(cfg.Endpoint, nil)

v2/deposit_service.go

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package binance
22

33
import (
44
"context"
5+
"encoding/json"
56
"net/http"
67
)
78

v2/dust_log_service.go

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ package binance
1111

1212
import (
1313
"context"
14+
"encoding/json"
1415
"net/http"
1516
)
1617

v2/exchange_info_service.go

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package binance
22

33
import (
44
"context"
5+
"encoding/json"
56
"net/http"
67

78
"github.com/adshao/go-binance/v2/common"

v2/fiat_service.go

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package binance
22

33
import (
44
"context"
5+
"encoding/json"
56
"net/http"
67
)
78

v2/futures/client.go

+4-1
Original file line numberDiff line numberDiff line change
@@ -525,7 +525,10 @@ func (c *Client) NewGetBalanceService() *GetBalanceService {
525525
return &GetBalanceService{c: c}
526526
}
527527

528-
// NewGetPositionRiskService init getting position risk service
528+
func (c *Client) NewGetPositionRiskV2Service() *GetPositionRiskV2Service {
529+
return &GetPositionRiskV2Service{c: c}
530+
}
531+
529532
func (c *Client) NewGetPositionRiskService() *GetPositionRiskService {
530533
return &GetPositionRiskService{c: c}
531534
}

v2/futures/order_service.go

+1
Original file line numberDiff line numberDiff line change
@@ -664,6 +664,7 @@ func (s *CancelOrderService) Do(ctx context.Context, opts ...RequestOption) (res
664664
if s.origClientOrderID != nil {
665665
r.setFormParam("origClientOrderId", *s.origClientOrderID)
666666
}
667+
667668
data, _, err := s.c.callAPI(ctx, r, opts...)
668669
if err != nil {
669670
return nil, err

v2/futures/position_risk.go

+74-7
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,19 @@ import (
77
)
88

99
// GetPositionRiskService get account balance
10-
type GetPositionRiskService struct {
10+
type GetPositionRiskV2Service struct {
1111
c *Client
1212
symbol string
1313
}
1414

1515
// Symbol set symbol
16-
func (s *GetPositionRiskService) Symbol(symbol string) *GetPositionRiskService {
16+
func (s *GetPositionRiskV2Service) Symbol(symbol string) *GetPositionRiskV2Service {
1717
s.symbol = symbol
1818
return s
1919
}
2020

2121
// Do send request
22-
func (s *GetPositionRiskService) Do(ctx context.Context, opts ...RequestOption) (res []*PositionRisk, err error) {
22+
func (s *GetPositionRiskV2Service) Do(ctx context.Context, opts ...RequestOption) (res []*PositionRiskV2, err error) {
2323
r := &request{
2424
method: http.MethodGet,
2525
endpoint: "/fapi/v2/positionRisk",
@@ -30,18 +30,18 @@ func (s *GetPositionRiskService) Do(ctx context.Context, opts ...RequestOption)
3030
}
3131
data, _, err := s.c.callAPI(ctx, r, opts...)
3232
if err != nil {
33-
return []*PositionRisk{}, err
33+
return []*PositionRiskV2{}, err
3434
}
35-
res = make([]*PositionRisk, 0)
35+
res = make([]*PositionRiskV2, 0)
3636
err = json.Unmarshal(data, &res)
3737
if err != nil {
38-
return []*PositionRisk{}, err
38+
return []*PositionRiskV2{}, err
3939
}
4040
return res, nil
4141
}
4242

4343
// PositionRisk define position risk info
44-
type PositionRisk struct {
44+
type PositionRiskV2 struct {
4545
EntryPrice string `json:"entryPrice"`
4646
BreakEvenPrice string `json:"breakEvenPrice"`
4747
MarginType string `json:"marginType"`
@@ -58,3 +58,70 @@ type PositionRisk struct {
5858
Notional string `json:"notional"`
5959
IsolatedWallet string `json:"isolatedWallet"`
6060
}
61+
62+
type GetPositionRiskService struct {
63+
c *Client
64+
symbol string
65+
recvWindow *int64
66+
}
67+
68+
// Symbol set symbol
69+
func (s *GetPositionRiskService) Symbol(symbol string) *GetPositionRiskService {
70+
s.symbol = symbol
71+
return s
72+
}
73+
74+
func (s *GetPositionRiskService) RecvWindow(rw int64) *GetPositionRiskService {
75+
s.recvWindow = &rw
76+
return s
77+
}
78+
79+
// Do send request
80+
func (s *GetPositionRiskService) Do(ctx context.Context, opts ...RequestOption) (res []*PositionRisk, err error) {
81+
r := &request{
82+
method: http.MethodGet,
83+
endpoint: "/fapi/v3/positionRisk",
84+
secType: secTypeSigned,
85+
}
86+
if s.symbol != "" {
87+
r.setParam("symbol", s.symbol)
88+
}
89+
if s.recvWindow != nil {
90+
r.recvWindow = *s.recvWindow
91+
}
92+
93+
data, _, err := s.c.callAPI(ctx, r, opts...)
94+
if err != nil {
95+
return []*PositionRisk{}, err
96+
}
97+
res = make([]*PositionRisk, 0)
98+
err = json.Unmarshal(data, &res)
99+
if err != nil {
100+
return []*PositionRisk{}, err
101+
}
102+
return res, nil
103+
}
104+
105+
// PositionRisk define position risk info
106+
type PositionRisk struct {
107+
Symbol string `json:"symbol"`
108+
PositionSide string `json:"positionSide"`
109+
PositionAmt string `json:"positionAmt"`
110+
EntryPrice string `json:"entryPrice"`
111+
BreakEvenPrice string `json:"breakEvenPrice"`
112+
MarkPrice string `json:"markPrice"`
113+
UnRealizedProfit string `json:"unRealizedProfit"`
114+
LiquidationPrice string `json:"liquidationPrice"`
115+
IsolatedMargin string `json:"isolatedMargin"`
116+
Notional string `json:"notional"`
117+
MarginAsset string `json:"marginAsset"`
118+
IsolatedWallet string `json:"isolatedWallet"`
119+
InitialMargin string `json:"initialMargin"`
120+
MaintMargin string `json:"maintMargin"`
121+
PositionInitialMargin string `json:"positionInitialMargin"`
122+
OpenOrderInitialMargin string `json:"openOrderInitialMargin"`
123+
Adl int64 `json:"adl"`
124+
BidNotional string `json:"bidNotional"`
125+
AskNotional string `json:"askNotional"`
126+
UpdateTime int64 `json:"updateTime"`
127+
}

v2/futures/position_risk_test.go

+95-5
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ func TestPositionRiskTestService(t *testing.T) {
1414
suite.Run(t, new(positionRiskServiceTestSuite))
1515
}
1616

17-
func (s *positionRiskServiceTestSuite) TestGetPositionRisk() {
17+
func (s *positionRiskServiceTestSuite) TestGetPositionRiskV2() {
1818
data := []byte(`[
1919
{
2020
"entryPrice": "10359.38000",
@@ -44,12 +44,12 @@ func (s *positionRiskServiceTestSuite) TestGetPositionRisk() {
4444
})
4545
s.assertRequestEqual(e, r)
4646
})
47-
res, err := s.client.NewGetPositionRiskService().Symbol(symbol).
47+
res, err := s.client.NewGetPositionRiskV2Service().Symbol(symbol).
4848
Do(newContext(), WithRecvWindow(recvWindow))
4949
r := s.r()
5050
r.NoError(err)
5151
r.Len(res, 1)
52-
e := &PositionRisk{
52+
e := &PositionRiskV2{
5353
EntryPrice: "10359.38000",
5454
BreakEvenPrice: "10387.38000",
5555
MarginType: "isolated",
@@ -64,10 +64,10 @@ func (s *positionRiskServiceTestSuite) TestGetPositionRisk() {
6464
UnRealizedProfit: "-0.03331353",
6565
PositionSide: "BOTH",
6666
}
67-
s.assertPositionRiskEqual(e, res[0])
67+
s.assertPositionRiskV2Equal(e, res[0])
6868
}
6969

70-
func (s *positionRiskServiceTestSuite) assertPositionRiskEqual(e, a *PositionRisk) {
70+
func (s *positionRiskServiceTestSuite) assertPositionRiskV2Equal(e, a *PositionRiskV2) {
7171
r := s.r()
7272
r.Equal(e.EntryPrice, a.EntryPrice, "EntryPrice")
7373
r.Equal(e.BreakEvenPrice, a.BreakEvenPrice, "BreakEvenPrice")
@@ -83,3 +83,93 @@ func (s *positionRiskServiceTestSuite) assertPositionRiskEqual(e, a *PositionRis
8383
r.Equal(e.UnRealizedProfit, a.UnRealizedProfit, "UnRealizedProfit")
8484
r.Equal(e.PositionSide, a.PositionSide, "PositionSide")
8585
}
86+
87+
func (s *positionRiskServiceTestSuite) TestGetPositionRisk() {
88+
data := []byte(`[
89+
{
90+
"symbol": "BTCUSDT",
91+
"positionSide": "BOTH",
92+
"positionAmt": "0.000",
93+
"entryPrice": "0.0",
94+
"breakEvenPrice": "0.0",
95+
"markPrice": "96658.09948227",
96+
"unRealizedProfit": "0.00000000",
97+
"liquidationPrice": "0",
98+
"isolatedMargin": "0",
99+
"notional": "0",
100+
"marginAsset": "USDT",
101+
"isolatedWallet": "0",
102+
"initialMargin": "23.75000000",
103+
"maintMargin": "0",
104+
"positionInitialMargin": "0",
105+
"openOrderInitialMargin": "23.75000000",
106+
"adl": 0,
107+
"bidNotional": "190",
108+
"askNotional": "0",
109+
"updateTime": 0
110+
}
111+
]`)
112+
s.mockDo(data, nil)
113+
defer s.assertDo()
114+
115+
symbol := "BTCUSDT"
116+
recvWindow := int64(1000)
117+
s.assertReq(func(r *request) {
118+
e := newSignedRequest().setParams(params{
119+
"symbol": symbol,
120+
"recvWindow": recvWindow,
121+
})
122+
s.assertRequestEqual(e, r)
123+
})
124+
res, err := s.client.NewGetPositionRiskService().Symbol(symbol).
125+
Do(newContext(), WithRecvWindow(recvWindow))
126+
r := s.r()
127+
r.NoError(err)
128+
r.Len(res, 1)
129+
e := &PositionRisk{
130+
Symbol: "BTCUSDT",
131+
PositionSide: "BOTH",
132+
PositionAmt: "0.000",
133+
EntryPrice: "0.0",
134+
BreakEvenPrice: "0.0",
135+
MarkPrice: "96658.09948227",
136+
UnRealizedProfit: "0.00000000",
137+
LiquidationPrice: "0",
138+
IsolatedMargin: "0",
139+
Notional: "0",
140+
MarginAsset: "USDT",
141+
IsolatedWallet: "0",
142+
InitialMargin: "23.75000000",
143+
MaintMargin: "0",
144+
PositionInitialMargin: "0",
145+
OpenOrderInitialMargin: "23.75000000",
146+
Adl: 0,
147+
BidNotional: "190",
148+
AskNotional: "0",
149+
UpdateTime: 0,
150+
}
151+
s.assertPositionRiskEqual(e, res[0])
152+
}
153+
154+
func (s *positionRiskServiceTestSuite) assertPositionRiskEqual(e, a *PositionRisk) {
155+
r := s.r()
156+
r.Equal(e.Symbol, a.Symbol, "Symbol")
157+
r.Equal(e.PositionSide, a.PositionSide, "PositionSide")
158+
r.Equal(e.PositionAmt, a.PositionAmt, "PositionAmt")
159+
r.Equal(e.EntryPrice, a.EntryPrice, "EntryPrice")
160+
r.Equal(e.BreakEvenPrice, a.BreakEvenPrice, "BreakEvenPrice")
161+
r.Equal(e.MarkPrice, a.MarkPrice, "MarkPrice")
162+
r.Equal(e.UnRealizedProfit, a.UnRealizedProfit, "UnRealizedProfit")
163+
r.Equal(e.LiquidationPrice, a.LiquidationPrice, "LiquidationPrice")
164+
r.Equal(e.IsolatedMargin, a.IsolatedMargin, "IsolatedMargin")
165+
r.Equal(e.Notional, a.Notional, "Notional")
166+
r.Equal(e.MarginAsset, a.MarginAsset, "MarginAsset")
167+
r.Equal(e.IsolatedWallet, a.IsolatedWallet, "IsolatedWallet")
168+
r.Equal(e.InitialMargin, a.InitialMargin, "InitialMargin")
169+
r.Equal(e.MaintMargin, a.MaintMargin, "MaintMargin")
170+
r.Equal(e.PositionInitialMargin, a.PositionInitialMargin, "PositionInitialMargin")
171+
r.Equal(e.Adl, a.Adl, "Adl")
172+
r.Equal(e.BidNotional, a.BidNotional, "BidNotional")
173+
r.Equal(e.AskNotional, a.AskNotional, "AskNotional")
174+
r.Equal(e.UpdateTime, a.UpdateTime, "UpdateTime")
175+
}

0 commit comments

Comments
 (0)