Skip to content

Commit 3533332

Browse files
authored
feat: portfolio margin user data streams (sammchardy#1534)
1 parent 0ac441f commit 3533332

File tree

4 files changed

+99
-6
lines changed

4 files changed

+99
-6
lines changed

binance/async_client.py

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2463,6 +2463,28 @@ async def convert_accept_quote(self, **params):
24632463
====================================================================================================================
24642464
"""
24652465

2466+
async def papi_stream_get_listen_key(self):
2467+
res = await self._request_papi_api("post", "listenKey", signed=False, data={})
2468+
return res["listenKey"]
2469+
2470+
papi_stream_get_listen_key.__doc__ = Client.papi_stream_get_listen_key.__doc__
2471+
2472+
async def papi_stream_keepalive(self, listenKey):
2473+
params = {"listenKey": listenKey}
2474+
return await self._request_papi_api(
2475+
"put", "listenKey", signed=False, data=params
2476+
)
2477+
2478+
papi_stream_keepalive.__doc__ = Client.papi_stream_keepalive.__doc__
2479+
2480+
async def papi_stream_close(self, listenKey):
2481+
params = {"listenKey": listenKey}
2482+
return await self._request_papi_api(
2483+
"delete", "listenKey", signed=False, data=params
2484+
)
2485+
2486+
papi_stream_close.__doc__ = Client.papi_stream_close.__doc__
2487+
24662488
async def papi_get_balance(self, **params):
24672489
return await self._request_papi_api("get", "balance", signed=True, data=params)
24682490

@@ -3991,9 +4013,9 @@ async def margin_max_borrowable(self, **params):
39914013

39924014
margin_max_borrowable.__doc__ = Client.margin_max_borrowable.__doc__
39934015

3994-
####################################################
3995-
# Futures Data
3996-
####################################################
4016+
####################################################
4017+
# Futures Data
4018+
####################################################
39974019

39984020
async def futures_historical_data_link(self, **params):
39994021
return await self._request_margin_api("get", "futures/data/histDataLink", signed=True, data=params)

binance/client.py

Lines changed: 55 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9433,6 +9433,58 @@ def papi_get_balance(self, **params):
94339433
"""
94349434
return self._request_papi_api("get", "balance", signed=True, data=params)
94359435

9436+
def papi_stream_get_listen_key(self):
9437+
"""Start a new user data stream for Portfolio Margin account.
9438+
9439+
https://developers.binance.com/docs/derivatives/portfolio-margin/user-data-streams/Start-User-Data-Stream
9440+
9441+
:returns: API response
9442+
9443+
{
9444+
"listenKey": "pM_XXXXXXX"
9445+
}
9446+
9447+
The stream will close after 60 minutes unless a keepalive is sent.
9448+
If the account has an active listenKey, that listenKey will be returned and its validity will be extended for 60 minutes.
9449+
9450+
Weight: 1
9451+
9452+
"""
9453+
res = self._request_papi_api("post", "listenKey", signed=False, data={})
9454+
return res["listenKey"]
9455+
9456+
def papi_stream_keepalive(self, listenKey):
9457+
"""Keepalive a user data stream to prevent a time out.
9458+
9459+
https://developers.binance.com/docs/derivatives/portfolio-margin/user-data-streams/Keepalive-User-Data-Stream
9460+
9461+
:returns: API response
9462+
9463+
{}
9464+
9465+
User data streams will close after 60 minutes. It's recommended to send a ping about every 60 minutes.
9466+
9467+
Weight: 1
9468+
9469+
"""
9470+
params = {"listenKey": listenKey}
9471+
return self._request_papi_api("put", "listenKey", signed=False, data=params)
9472+
9473+
def papi_stream_close(self, listenKey):
9474+
"""Close out a user data stream.
9475+
9476+
https://developers.binance.com/docs/derivatives/portfolio-margin/user-data-streams/Close-User-Data-Stream
9477+
9478+
:returns: API response
9479+
9480+
{}
9481+
9482+
Weight: 1
9483+
9484+
"""
9485+
params = {"listenKey": listenKey}
9486+
return self._request_papi_api("delete", "listenKey", signed=False, data=params)
9487+
94369488
def papi_get_account(self, **params):
94379489
"""Query account information.
94389490
@@ -13478,9 +13530,9 @@ def margin_max_borrowable(self, **params):
1347813530
"get", "margin/maxBorrowable", signed=True, data=params
1347913531
)
1348013532

13481-
####################################################
13482-
# Futures Data
13483-
####################################################
13533+
####################################################
13534+
# Futures Data
13535+
####################################################
1348413536

1348513537
def futures_historical_data_link(self, **params):
1348613538
"""Get Future TickLevel Orderbook Historical Data Download Link.

binance/ws/keepalive_websocket.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@ async def _get_listen_key(self):
6666
listen_key = await self._client.futures_stream_get_listen_key()
6767
elif self._keepalive_type == "coin_futures":
6868
listen_key = await self._client.futures_coin_stream_get_listen_key()
69+
elif self._keepalive_type == "portfolio_margin":
70+
listen_key = await self._client.papi_stream_get_listen_key()
6971
else: # isolated margin
7072
# Passing symbol for isolated margin
7173
listen_key = await self._client.isolated_margin_stream_get_listen_key(
@@ -90,6 +92,8 @@ async def _keepalive_socket(self):
9092
await self._client.futures_stream_keepalive(self._listen_key)
9193
elif self._keepalive_type == "coin_futures":
9294
await self._client.futures_coin_stream_keepalive(self._listen_key)
95+
elif self._keepalive_type == "portfolio_margin":
96+
await self._client.papi_stream_keepalive(self._listen_key)
9397
else: # isolated margin
9498
# Passing symbol for isolated margin
9599
await self._client.isolated_margin_stream_keepalive(

binance/ws/streams.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1003,6 +1003,21 @@ def coin_futures_socket(self):
10031003
stream_url = self.DSTREAM_TESTNET_URL
10041004
return self._get_account_socket("coin_futures", stream_url=stream_url)
10051005

1006+
def portfolio_margin_socket(self):
1007+
"""Start a websocket for portfolio margin user data
1008+
1009+
https://developers.binance.com/docs/derivatives/portfolio-margin/user-data-streams
1010+
1011+
:returns: connection key string if successful, False otherwise
1012+
1013+
Message Format - see Binance API docs for all types
1014+
"""
1015+
stream_url = self.FSTREAM_URL
1016+
if self.testnet:
1017+
stream_url = self.FSTREAM_TESTNET_URL
1018+
stream_url += "pm/"
1019+
return self._get_account_socket("portfolio_margin", stream_url=stream_url)
1020+
10061021
def isolated_margin_socket(self, symbol: str):
10071022
"""Start a websocket for isolated margin data
10081023

0 commit comments

Comments
 (0)