✅ GMOコインのWebSocket API制限により複数購読ができない 50
✅ BybitのDataStoreクラスにタイムスタンプを追加する 47
✅ ws_connectのハンドラ未指定の場合はprintハンドラを選択する 46
✅ Binanceで認証を利用するとPublic APIがパラメーターエラーとなる 44
✅ HTTPリクエストのparams/data引数の指定間違いに警告を表示する 43
✅ Binance Futures USDⓈ-MのDataStoreを実装する 20
✅ DataStore サブクラスインスタンス取得時の型エラーを解決 55
✅ GitHub Actions の matrix 実行で fail-fast を無効化 54
✅ GitHub Actions による自動テスト実行 49
🚀 New Experience
✨ Binance Futures USDⓈ-MのDataStoreを正式に実装しました
BinanceのWebSocketをハンドリングする `pybotters.BinanceDataStore` の実装が完了しました。
リアルタイムで板情報・ティッカー・アカウントのオーダーやポジションなどがDataStoreにキャッシュされ高速に参照することが可能です!
今回はBinance Futures USDⓈ-Mのみ対応しており、Binance Futures COIN-M、Spotは未対応です。
「listenKey」の自動延長はDataStoreのinitializeメソッドの機能で組み込んであるのでこれを利用することで持続的にユーザーストリームを購読できます。
全てのマーケットストリーム・ユーザーストリームを購読しREST APIで初期化する全部入りサンプル🔥
python
async def main():
async with pybotters.Client(apis=apis, base_url='https://fapi.binance.com') as client:
store = pybotters.BinanceDataStore()
await store.initialize(
client.get('/fapi/v2/balance'),
client.get('/fapi/v2/positionRisk?symbol=BTCUSDT'),
client.get('/fapi/v1/openOrders?symbol=BTCUSDT'),
client.post('/fapi/v1/listenKey'),
)
streams = '/'.join([
'btcusdtaggTrade',
'btcusdtmarkPrice',
'btcusdtkline_1m',
'btcusdt_perpetualcontinuousKline_1m',
'btcusdtticker', or btcusdtminiTicker
'btcusdtbookTicker',
'btcusdtforceOrder',
'btcusdtdepth20500ms',
'btcusdtdepth',
store.listenkey,
])
wstask = await client.ws_connect(
f'wss://fstream.binance.com/stream?streams={streams}',
hdlr_json=store.onmessage,
)
while not all([
len(store.markprice),
len(store.kline),
len(store.continuouskline),
len(store.ticker),
len(store.bookticker),
len(store.orderbook) >= 40,
]):
await store.wait()
サンプル: オーダーブックを監視
while True:
pybotters.print(store.orderbook.sorted())
await store.orderbook.wait()
✨ BybitのDataStoreにタイムスタンプ機能を追加しました
BybitのWebSocketで配信される一部データにあるタイムスタンプ(timestamp_e6)を `pybotters.BybitDataStore`に整数型で記録します。
疑似的にBybitのサーバータイムスタンプとして遅延を計ることなとが可能です。
この機能はorderBookL2_25, orderBook_200, instrument_info, klineV2を購読することで利用が可能です。
py
async def main():
async with pybotters.Client() as client:
store = pybotters.BybitDataStore()
wstasks = await asyncio.gather(
client.ws_connect(
'wss://stream.bybit.com/realtime',
send_json={'op': 'subscribe', 'args': [
'orderBookL2_25.BTCUSD|BTCUSDM21', or orderBook_200.100ms.BTCUSD|BTCUSDM21
'instrument_info.100ms.BTCUSD|BTCUSDM21',
'klineV2.1.BTCUSD|BTCUSDM21',
]},
hdlr_json=store.onmessage,
),
client.ws_connect(
'wss://stream.bybit.com/realtime_public',
send_json={'op': 'subscribe', 'args': [
'orderBookL2_25.BTCUSDT', or orderBook_200.100ms.BTCUSDT
'instrument_info.100ms.BTCUSDT',
'candle.1.BTCUSDT',
]},
hdlr_json=store.onmessage,
),
)
while True:
print(store.timestamp_e6)
1623609894038501
await store.wait()
✨ API自動認証をオフにする引数を追加しました
pybottersはREST/WebSocket APIを自動認証していますが、全て自動的に認証を行っていたので一部の取引所のPublic APIは認証により逆にエラーとなっていました。
リクエストメソッドの `auth` 引数を `None` にすることで手動で認証をオフに出来ます。
py
async def main():
async with pybotters.Client(apis=apis) as client:
ERROR
r = await client.get('https://api.binance.com/api/v3/depth', params={'symbol': 'BTCUSDT', 'limit': '10'})
print(await r.json())
{'code': -1101, 'msg': "Too many parameters; expected '2' and received '4'."}
OK
r = await client.get('https://api.binance.com/api/v3/depth', params={'symbol': 'BTCUSDT', 'limit': '10'}, auth=None)
print(await r.json())
細かい新機能
GMOコインのWebSocketにおいて複数チャンネルを購読できない問題を解消しました。
その他は各Issueをご覧ください。
♻ CI/CD
✨ GitHub Actions による自動テスト実行などを追加しました
自動テスト実行などによってpybottersの開発品質が向上します!
こちらは supermomonga 氏にコントリビュートして頂きました💖