From 52a2d763791aea7a282fbbc53f1a443caa870a16 Mon Sep 17 00:00:00 2001 From: itsdeka Date: Sun, 23 Jan 2022 22:33:10 +0100 Subject: [PATCH 1/5] -) Added User Settings Write/Read/Delete endpoints (REST) -) Added Balance Available for Orders/Offers endpoint (REST) --- CHANGELOG | 4 +++ bfxapi/rest/bfx_rest.py | 72 +++++++++++++++++++++++++++++++++++++++++ bfxapi/version.py | 2 +- setup.py | 2 +- 4 files changed, 78 insertions(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 0ce99026..dc277994 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,7 @@ +2.0.1 +-) Added User Settings Write/Read/Delete endpoints (REST) +-) Added Balance Available for Orders/Offers endpoint (REST) + 2.0.0 -) Implemented Movement endpoints (REST) -) Fixed unawaited stop diff --git a/bfxapi/rest/bfx_rest.py b/bfxapi/rest/bfx_rest.py index e2b0c908..1339db1c 100644 --- a/bfxapi/rest/bfx_rest.py +++ b/bfxapi/rest/bfx_rest.py @@ -1005,6 +1005,78 @@ async def claim_position(self, position_id, amount): message = await self.post(endpoint, payload) return message + async def calc_order_avail(self, symbol, type, lev, dir=None, rate=None): + """ + Calculate the balance available for orders/offers + + # Attributes + @param symbol str: Symbol (tBTCUSD, tBTCUST, fUSD, .... ) + @param dir int: Direction of the order (1 for by, -1 for sell) (Mandator for EXCHANGE and MARGIN type, not used for FUNDING) + @param rate str: Order price (Mandator for EXCHANGE and MARGIN type, not used for FUNDING) + @param type str: Type of the order/offer EXCHANGE, MARGIN, DERIV, or FUNDING + @param lev str: Leverage that you want to use in calculating the max order amount (DERIV only) + """ + endpoint = f"auth/calc/order/avail" + payload = { + "symbol": symbol, + "type": type, + "lev": lev + } + + if dir: + payload["dir"] = dir + + if rate: + payload["rate"] = rate + + message = await self.post(endpoint, payload) + return message + + async def write_user_settings(self, settings): + """ + Allows you to create custom settings by creating key: value pairs + + # Attributes + @param Settings object: object of keys and values to be set. Must follow regex pattern /^api:[A-Za-z0-9_-]*$/ + """ + endpoint = f"auth/w/settings/set" + payload = { + "Settings": settings + } + + message = await self.post(endpoint, payload) + return message + + async def read_user_settings(self, keys): + """ + Allows you to read custom settings by providing a key + + # Attributes + @param Keys array: the keys for which you wish to retrieve the values + """ + endpoint = f"auth/w/settings" + payload = { + "Keys": keys + } + + message = await self.post(endpoint, payload) + return message + + async def delete_user_settings(self, settings): + """ + Allows you to delete custom settings + + # Attributes + @param settings object: object of keys to be deleted followed by value 1. Must follow regex pattern /^api:[A-Za-z0-9_-]*$/ + """ + endpoint = f"auth/w/settings/del" + payload = { + "Settings": settings + } + + message = await self.post(endpoint, payload) + return message + async def get_auth_pulse_hist(self, is_public=None): """ Allows you to retrieve your private pulse history or the public pulse history with an additional UID_LIKED field. diff --git a/bfxapi/version.py b/bfxapi/version.py index b16d0cf8..f5a20c1c 100644 --- a/bfxapi/version.py +++ b/bfxapi/version.py @@ -2,4 +2,4 @@ This module contains the current version of the bfxapi lib """ -__version__ = '2.0.0' +__version__ = '2.0.1' diff --git a/setup.py b/setup.py index 1223b297..af19bde6 100644 --- a/setup.py +++ b/setup.py @@ -11,7 +11,7 @@ here = path.abspath(path.dirname(__file__)) setup( name='bitfinex-api-py', - version='2.0.0', + version='2.0.1', description='Official Bitfinex Python API', long_description='A Python reference implementation of the Bitfinex API for both REST and websocket interaction', long_description_content_type='text/markdown', From 8ed2e51228e9fc7fb549c58953d98d12273a12f8 Mon Sep 17 00:00:00 2001 From: itsdeka Date: Tue, 25 Jan 2022 14:42:34 +0100 Subject: [PATCH 2/5] added alerts endpoints --- CHANGELOG | 1 + bfxapi/rest/bfx_rest.py | 42 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index dc277994..f84b02ea 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,7 @@ 2.0.1 -) Added User Settings Write/Read/Delete endpoints (REST) -) Added Balance Available for Orders/Offers endpoint (REST) +-) Added Alerts endpoints (REST) 2.0.0 -) Implemented Movement endpoints (REST) diff --git a/bfxapi/rest/bfx_rest.py b/bfxapi/rest/bfx_rest.py index 1339db1c..44778715 100644 --- a/bfxapi/rest/bfx_rest.py +++ b/bfxapi/rest/bfx_rest.py @@ -1005,6 +1005,48 @@ async def claim_position(self, position_id, amount): message = await self.post(endpoint, payload) return message + async def get_alerts(self): + """ + Retrieve a list of active price alerts + """ + endpoint = f"auth/r/alerts" + + message = await self.post(endpoint, {}) + return message + + async def set_alert(self, type, symbol, price): + """ + Sets up a price alert at the given value + + # Attributes + @param type string + @param symbol string + @param price float + """ + endpoint = f"auth/w/alert/set" + payload = { + "Settings": settings + } + + message = await self.post(endpoint, payload) + return message + + async def delete_alert(self, symbol, price): + """ + Delete an active alert + + # Attributes + @param symbol string + @param price float + """ + endpoint = f"auth/w/alert/price:{symbol}:{price}/del" + payload = { + "Settings": settings + } + + message = await self.post(endpoint, payload) + return message + async def calc_order_avail(self, symbol, type, lev, dir=None, rate=None): """ Calculate the balance available for orders/offers From 87cc56440ab23005100ac9577f630b8d0d7cb9df Mon Sep 17 00:00:00 2001 From: itsdeka Date: Tue, 25 Jan 2022 14:45:22 +0100 Subject: [PATCH 3/5] fixed payloads --- bfxapi/rest/bfx_rest.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/bfxapi/rest/bfx_rest.py b/bfxapi/rest/bfx_rest.py index 44778715..b276f13d 100644 --- a/bfxapi/rest/bfx_rest.py +++ b/bfxapi/rest/bfx_rest.py @@ -1025,7 +1025,9 @@ async def set_alert(self, type, symbol, price): """ endpoint = f"auth/w/alert/set" payload = { - "Settings": settings + "type": type, + "symbol": symbol, + "price": price } message = await self.post(endpoint, payload) @@ -1041,7 +1043,8 @@ async def delete_alert(self, symbol, price): """ endpoint = f"auth/w/alert/price:{symbol}:{price}/del" payload = { - "Settings": settings + "symbol": symbol, + "price": price } message = await self.post(endpoint, payload) From d3c105a710f4c4058a36a6ac68d7122d39f86531 Mon Sep 17 00:00:00 2001 From: itsdeka Date: Sat, 29 Jan 2022 22:32:17 +0100 Subject: [PATCH 4/5] fixed trades handling error --- CHANGELOG | 1 + bfxapi/websockets/bfx_websocket.py | 53 +++++++++--------------------- 2 files changed, 17 insertions(+), 37 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index f84b02ea..69a4b97c 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -2,6 +2,7 @@ -) Added User Settings Write/Read/Delete endpoints (REST) -) Added Balance Available for Orders/Offers endpoint (REST) -) Added Alerts endpoints (REST) +-) Fixed trades handling error 2.0.0 -) Implemented Movement endpoints (REST) diff --git a/bfxapi/websockets/bfx_websocket.py b/bfxapi/websockets/bfx_websocket.py index 41aff694..6df4487f 100644 --- a/bfxapi/websockets/bfx_websocket.py +++ b/bfxapi/websockets/bfx_websocket.py @@ -66,36 +66,6 @@ def _parse_trade(tData, symbol): 'symbol': symbol } -def _parse_account_trade(tData): - return { - 'id': tData[0], - 'symbol': tData[1], - 'mts_create': tData[2], - 'order_id': tData[3], - 'exec_amount': tData[4], - 'exec_price': tData[5], - 'order_type': tData[6], - 'order_price': tData[7], - 'maker': tData[8], - 'cid': tData[11], - } - - -def _parse_account_trade_update(tData): - return { - 'id': tData[0], - 'symbol': tData[1], - 'mts_create': tData[2], - 'order_id': tData[3], - 'exec_amount': tData[4], - 'exec_price': tData[5], - 'order_type': tData[6], - 'order_price': tData[7], - 'maker': tData[8], - 'fee': tData[9], - 'fee_currency': tData[10], - 'cid': tData[11], - } def _parse_deriv_status_update(sData, symbol): return { @@ -309,15 +279,19 @@ async def _system_auth_handler(self, socketId, data): async def _trade_update_handler(self, data): tData = data[2] - # [0,"tu",[738045455,"tTESTBTC:TESTUSD",1622169615771,66635385225,0.001,38175,"EXCHANGE LIMIT",39000,-1,-0.000002,"TESTBTC",1622169615685]] - tradeObj = _parse_account_trade_update(tData) - self._emit('trade_update', tradeObj) + # [209, 'tu', [312372989, 1542303108930, 0.35, 5688.61834032]] + if self.subscriptionManager.is_subscribed(data[0]): + symbol = self.subscriptionManager.get(data[0]).symbol + tradeObj = _parse_trade(tData, symbol) + self._emit('trade_update', tradeObj) async def _trade_executed_handler(self, data): tData = data[2] - # [0,"te",[738045455,"tTESTBTC:TESTUSD",1622169615771,66635385225,0.001,38175,"EXCHANGE LIMIT",39000,-1,null,null,1622169615685]] - tradeObj = _parse_account_trade(tData) - self._emit('new_trade', tradeObj) + # [209, 'te', [312372989, 1542303108930, 0.35, 5688.61834032]] + if self.subscriptionManager.is_subscribed(data[0]): + symbol = self.subscriptionManager.get(data[0]).symbol + tradeObj = _parse_trade(tData, symbol) + self._emit('new_trade', tradeObj) async def _wallet_update_handler(self, data): # [0,"wu",["exchange","USD",89134.66933283,0]] @@ -436,7 +410,12 @@ async def _trade_handler(self, data): # connection data.reverse() for t in data: - trade = _parse_trade(t, symbol) + trade = { + 'mts': t[1], + 'amount': t[2], + 'price': t[3], + 'symbol': symbol + } self._emit('seed_trade', trade) async def _candle_handler(self, data): From 3650bc7944f0381441be2430c0b1bb44214f8d76 Mon Sep 17 00:00:00 2001 From: itsdeka Date: Sun, 30 Jan 2022 12:54:57 +0100 Subject: [PATCH 5/5] fixed trades handling error added new_user_trade use to examples updated docs --- .../examples/ws/subscribe_trades_candles.py | 4 ++ bfxapi/websockets/bfx_websocket.py | 43 +++++++++++++++++++ docs/ws_v2.md | 2 + 3 files changed, 49 insertions(+) diff --git a/bfxapi/examples/ws/subscribe_trades_candles.py b/bfxapi/examples/ws/subscribe_trades_candles.py index 2e17fe35..d7135e69 100644 --- a/bfxapi/examples/ws/subscribe_trades_candles.py +++ b/bfxapi/examples/ws/subscribe_trades_candles.py @@ -20,6 +20,10 @@ def log_candle(candle): def log_trade(trade): print ("New trade: {}".format(trade)) +@bfx.ws.on('new_user_trade') +def log_user_trade(trade): + print ("New user trade: {}".format(trade)) + async def start(): await bfx.ws.subscribe('candles', 'tBTCUSD', timeframe='1m') await bfx.ws.subscribe('trades', 'tBTCUSD') diff --git a/bfxapi/websockets/bfx_websocket.py b/bfxapi/websockets/bfx_websocket.py index 6df4487f..74c23717 100644 --- a/bfxapi/websockets/bfx_websocket.py +++ b/bfxapi/websockets/bfx_websocket.py @@ -67,6 +67,38 @@ def _parse_trade(tData, symbol): } +def _parse_user_trade(tData): + return { + 'id': tData[0], + 'symbol': tData[1], + 'mts_create': tData[2], + 'order_id': tData[3], + 'exec_amount': tData[4], + 'exec_price': tData[5], + 'order_type': tData[6], + 'order_price': tData[7], + 'maker': tData[8], + 'cid': tData[11], + } + + +def _parse_user_trade_update(tData): + return { + 'id': tData[0], + 'symbol': tData[1], + 'mts_create': tData[2], + 'order_id': tData[3], + 'exec_amount': tData[4], + 'exec_price': tData[5], + 'order_type': tData[6], + 'order_price': tData[7], + 'maker': tData[8], + 'fee': tData[9], + 'fee_currency': tData[10], + 'cid': tData[11], + } + + def _parse_deriv_status_update(sData, symbol): return { 'symbol': symbol, @@ -141,6 +173,7 @@ class BfxWebsocket(GenericWebsocket): - `funding_credit_snapshot` (array): Opening funding credit balances - `balance_update` (array): When the state of a balance is changed - `new_trade` (array): A new trade on the market has been executed + - `new_user_trade` (array): A new - your - trade has been executed - `new_ticker` (Ticker|FundingTicker): A new ticker update has been published - `new_funding_ticker` (FundingTicker): A new funding ticker update has been published - `new_trading_ticker` (Ticker): A new trading ticker update has been published @@ -284,6 +317,11 @@ async def _trade_update_handler(self, data): symbol = self.subscriptionManager.get(data[0]).symbol tradeObj = _parse_trade(tData, symbol) self._emit('trade_update', tradeObj) + else: + # user trade + # [0,"tu",[738045455,"tTESTBTC:TESTUSD",1622169615771,66635385225,0.001,38175,"EXCHANGE LIMIT",39000,-1,-0.000002,"TESTBTC",1622169615685]] + tradeObj = _parse_user_trade_update(tData) + self._emit('user_trade_update', tradeObj) async def _trade_executed_handler(self, data): tData = data[2] @@ -292,6 +330,11 @@ async def _trade_executed_handler(self, data): symbol = self.subscriptionManager.get(data[0]).symbol tradeObj = _parse_trade(tData, symbol) self._emit('new_trade', tradeObj) + else: + # user trade + # [0, 'te', [37558151, 'tBTCUSD', 1643542688513, 1512164914, 0.0001, 30363, 'EXCHANGE MARKET', 100000, -1, None, None, 1643542688390]] + tradeObj = _parse_user_trade(tData) + self._emit('new_user_trade', tradeObj) async def _wallet_update_handler(self, data): # [0,"wu",["exchange","USD",89134.66933283,0]] diff --git a/docs/ws_v2.md b/docs/ws_v2.md index 783e74f5..f0cc3bbd 100644 --- a/docs/ws_v2.md +++ b/docs/ws_v2.md @@ -76,10 +76,12 @@ https://github.com/Crypto-toolbox/btfxwss - `funding_credit_snapshot` (array): Opening funding credit balances - `balance_update` (array): When the state of a balance is changed - `new_trade` (array): A new trade on the market has been executed + - `new_user_trade` (array): A new - your - trade has been executed - `new_ticker` (Ticker|FundingTicker): A new ticker update has been published - `new_funding_ticker` (FundingTicker): A new funding ticker update has been published - `new_trading_ticker` (Ticker): A new trading ticker update has been published - `trade_update` (array): A trade on the market has been updated + - `user_trade_update` (array): A - your - trade has been updated - `new_candle` (array): A new candle has been produced - `margin_info_updates` (array): New margin information has been broadcasted - `funding_info_updates` (array): New funding information has been broadcasted