Skip to content

Commit

Permalink
Merge pull request #42 from MtkN1/develop
Browse files Browse the repository at this point in the history
✨v0.2.2リリース

データストアでソート済みの板情報の取得可能にする #40
Bybitデータストアのinitializeメソッド引数仕様の変更漏れ #41
  • Loading branch information
MtkN1 committed May 23, 2021
2 parents 289b382 + a0dde7a commit d399787
Show file tree
Hide file tree
Showing 4 changed files with 22 additions and 29 deletions.
31 changes: 7 additions & 24 deletions pybotters/models/bybit.py
Expand Up @@ -25,16 +25,10 @@ def _init(self) -> None:
self.create('stoporder', datastore_class=StopOrder)
self.create('wallet', datastore_class=Wallet)

async def initialize(self, aws: List[Awaitable[aiohttp.ClientResponse]]):
async def initialize(self, *aws: Awaitable[aiohttp.ClientResponse]) -> None:
for f in asyncio.as_completed(aws):
resp = await f
if resp.status != 200:
logger.warning(f'status code != 200 ({resp.url.scheme}://{resp.url.host}{resp.url.path})')
continue
data = await resp.json()
if data['ret_code'] != 0:
logger.warning(f'ret_code != 0 ({resp.url.scheme}://{resp.url.host}{resp.url.path}) {data}')
continue
if resp.url.path in (
'/v2/private/order',
'/private/linear/order/search',
Expand Down Expand Up @@ -144,25 +138,14 @@ def wallet(self) -> 'Wallet':
class OrderBook(DataStore):
_KEYS = ['symbol', 'id', 'side']

def getbest(self, symbol: str) -> Dict[str, Optional[Item]]:
result = {'Sell': {}, 'Buy': {}}
for item in self._data.values():
if item['symbol'] == symbol:
result[item['side']][float(item['price'])] = item
return {
'Sell': result['Sell'][min(result['Sell'])] if result['Sell'] else None,
'Buy': result['Buy'][max(result['Buy'])] if result['Buy'] else None
}

def getsorted(self, symbol: str) -> Dict[str, List[Item]]:
def sorted(self, query: Item={}) -> Dict[str, List[Item]]:
result = {'Sell': [], 'Buy': []}
for item in self._data.values():
if item['symbol'] == symbol:
for item in self:
if all(k in item and query[k] == item[k] for k in query):
result[item['side']].append(item)
return {
'Sell': sorted(result['Sell'], key=lambda x: float(x['price'])),
'Buy': sorted(result['Buy'], key=lambda x: float(x['price']), reverse=True)
}
result['Sell'].sort(key=lambda x: x['id'])
result['Buy'].sort(key=lambda x: x['id'], reverse=True)
return result

def _onmessage(self, type_: str, data: Union[List[Item], Item]) -> None:
if type_ == 'snapshot':
Expand Down
14 changes: 12 additions & 2 deletions pybotters/models/ftx.py
@@ -1,5 +1,5 @@
import asyncio
from typing import Any, Awaitable, List, Tuple
from typing import Any, Awaitable, Dict, List

import aiohttp

Expand All @@ -18,7 +18,7 @@ def _init(self) -> None:
self.create('orders', datastore_class=Orders)
self.create('positions', datastore_class=Positions)

async def initialize(self, *aws: Tuple[Awaitable[aiohttp.ClientResponse], ...]) -> None:
async def initialize(self, *aws: Awaitable[aiohttp.ClientResponse]) -> None:
for f in asyncio.as_completed(aws):
resp = await f
data = await resp.json()
Expand Down Expand Up @@ -111,6 +111,16 @@ def _onmessage(self, market: str, data: List[Item]) -> None:

class OrderBook(DataStore):
_KEYS = ['market', 'side', 'price']
_BDSIDE = {'sell': 'asks', 'buy': 'bids'}

def sorted(self, query: Item={}) -> Dict[str, List[float]]:
result = {'asks': [], 'bids': []}
for item in self:
if all(k in item and query[k] == item[k] for k in query):
result[self._BDSIDE[item['side']]].append([item['price'], item['size']])
result['asks'].sort(key=lambda x: x[0])
result['bids'].sort(key=lambda x: x[0], reverse=True)
return result

def _onmessage(self, market: str, data: List[Item]) -> None:
if data['action'] == 'partial':
Expand Down
4 changes: 2 additions & 2 deletions pybotters/store.py
Expand Up @@ -121,9 +121,9 @@ def get(self, item: Item) -> Optional[Item]:

def find(self, query: Item={}) -> List[Item]:
if query:
return [item for item in self._data.values() if all(k in item and query[k] == item[k] for k in query)]
return [item for item in self if all(k in item and query[k] == item[k] for k in query)]
else:
return [item for item in self._data.values()]
return list(self)

def _set(self) -> None:
for event in self._events:
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
@@ -1,6 +1,6 @@
[tool.poetry]
name = "pybotters"
version = "0.2.0"
version = "0.2.2"
description = "An advanced api client for python botters."
license = "MIT"
authors = ["MtkN1 <51289448+MtkN1@users.noreply.github.com>"]
Expand Down

0 comments on commit d399787

Please sign in to comment.