Pybotters

Latest version: v1.5.1

Safety actively analyzes 681866 Python packages for vulnerabilities to keep your Python projects secure.

Scan your dependencies

Page 4 of 8

0.16.0

🪧 What's Changed
* Workaround: Bybit の Derivatives v3 Contract API に対応する by cococig in https://github.com/MtkN1/pybotters/pull/219
* typing-extensionsのバージョンアップ by yota-p in https://github.com/MtkN1/pybotters/pull/222
* Bybit の認証方式を新しい認証方式に変更する by MtkN1 in https://github.com/MtkN1/pybotters/pull/223
* PyPI へのアップロードを自動化する by MtkN1 in https://github.com/MtkN1/pybotters/pull/224
* README.md のバッジや分類を追加する by MtkN1 in https://github.com/MtkN1/pybotters/pull/225
* Bybit V5 API DataStore by MtkN1 in https://github.com/MtkN1/pybotters/pull/226

🚀 New Features

✅ Bybit V5 API をサポートしました (API 認証 / DataStore)

Bybit にて新しくリリースされた V5 API [^1] を pybotters で利用できるようになりました!
V5 API では Bybit の以下主要プロダクトの API インターフェースが統合されました。

[^1]: https://bybit-exchange.github.io/docs/v5/intro

- USDT 無期限
- USDC 無期限
- USDC オプション
- インバース契約
- 現物取引
- マージン取引
- レバレッジトークン

⚠️ 注意:
1. V5 API でこれら全てのプロダクトを利用するには Bybit 側で「統合取引アカウント」 [^2] へのアップグレートが必要です。
アップグレートを行っていない「デリバティブアカウント」の場合は、V5 API からは USDT 無期限とインバース契約のみ利用可能 [^3] です。
基本的には「統合取引アカウント」へアップグレートをおすすめしますが、既存の口座をアップグレートしたくない場合は、サブアカウントを作成してそちらを「統合取引アカウント」へアップグレートして利用することも可能です。
2. (**互換性のある変更**) pybotters 内部の自動認証の仕組みにおいて Bybit への REST API リクエストを全て新しい認証方式 [^4] に変更しています。 URL クエリまたはリクエストボディに与えられていた認証情報がリクエストヘッダーに付与されるようになります。 これは従来の V2 API [^5] の認証にも影響を与えますが、新しい認証方式でも動作することは確認済みです。
3. (**互換性のある変更**) 同様に WebSocket API の認証方式も変更しています。 URL クエリに付与されていた認証情報は、WebSocket メッセージとして送信されるようになります。 こちらも V2 API でも動作することは確認済みです。

[^2]: https://www.bybithelp.com/ja-JP/s/article/Introduction-to-Bybit-Unified-Trading-Account
[^3]: https://bybit-exchange.github.io/docs/v5/upgrade-guide#current-api-coverage
[^4]: https://bybit-exchange.github.io/docs/v5/intro#parameters-for-authenticated-endpoints
[^5]: https://bybit-exchange.github.io/docs-legacy/futuresV2/linear/#t-introduction

統合された API インターフェースを利用することで各プロダクト間での API 呼び出しがシームレスになります!
pybotters で V5 API を利用して他のトレーダーに差を付けましょう 🚀

💡 サンプルコード

REST API で成行注文を送信する

0.15.0

🪧 What's Changed
* GMOコインの現物取引所にここ一年半ほどで追加された銘柄に対応 by meetaco in https://github.com/MtkN1/pybotters/pull/204
* Dev Containers 仕様のオープン化に対応及びローカルの API 設定がマウントされるようにした by MtkN1 in https://github.com/MtkN1/pybotters/pull/202
* Coincheck の WebSocket 仕様変更に対応した by MtkN1 in https://github.com/MtkN1/pybotters/pull/207
* GitHub Actions のテストに Python 3.10+ を追加した by MtkN1 in https://github.com/MtkN1/pybotters/pull/208
* WebSocketのメッセージキューを実装する by MtkN1 in https://github.com/MtkN1/pybotters/pull/209
* PhemexDataStore で条件付き注文のデータを格納する by MtkN1 in https://github.com/MtkN1/pybotters/pull/210
* bitFlyer のストアに現物向けの Balance を追加する by MtkN1 in https://github.com/MtkN1/pybotters/pull/211
* watch メソッドの変更クラスに影響されたストアとデータを追加する by MtkN1 in https://github.com/MtkN1/pybotters/pull/212
* Hotfix: bitFlyer の Positions ストアのメッセージ判断条件を修正する by MtkN1 in https://github.com/MtkN1/pybotters/pull/213
* ストアにおけるアイテムの参照性を変更する by MtkN1 in https://github.com/MtkN1/pybotters/pull/214
* Liquid に関する機能を廃止する by MtkN1 in https://github.com/MtkN1/pybotters/pull/215
* FTX に関する機能を廃止する by MtkN1 in https://github.com/MtkN1/pybotters/pull/216
* bitFlyer Positions ストアでのアップデートの watch ストリームを有効にする by MtkN1 in https://github.com/MtkN1/pybotters/pull/217

🚀 New Features

✅ bitFlyer の資産残高のストアを実装しました

bitFlyer の現物資産残高のストアが利用できるようになりました!

WebSocket の *child_order_events* チャンネルのデータを元に資産残高を計算し、リアルタイムで情報を利用できます。 また REST API による初期化にも対応しています。 ストアの値は [`GET /v1/me/getbalance`](https://lightning.bitflyer.com/docs#%E8%B3%87%E7%94%A3%E6%AE%8B%E9%AB%98%E3%82%92%E5%8F%96%E5%BE%97) の形式で格納されます。


[
{
"currency_code": "JPY",
"amount": 1024078,
"available": 508000
},
{
"currency_code": "BTC",
"amount": 10.24,
"available": 4.12
},
{
"currency_code": "ETH",
"amount": 20.48,
"available": 16.38
}
]


⚠️ !注意! 残高 (***amount***) の値の計算のみ対応しており、利用可能残高 (***available***) は現状対応していません。

サンプルコード

`Balance` ストアの利用方法です。 REST API でデータを初期化し、watch メソッドで WebSocket からのデータを監視します。

py
import asyncio

import pybotters


async def main():
async with pybotters.Client(base_url="https://api.bitflyer.com", apis=apis) as client:
store = pybotters.bitFlyerDataStore()

await client.ws_connect(
"wss://ws.lightstream.bitflyer.com/json-rpc",
send_json={
"method": "subscribe",
"params": {"channel": "child_order_events"},
},
hdlr_json=store.onmessage,
)

with store.balance.watch() as stream:
await store.initialize(client.get("/v1/me/getbalance"))
async for change in stream:
print(change)


if __name__ == "__main__":
try:
asyncio.run(main())
except KeyboardInterrupt:
pass


詳細は https://github.com/MtkN1/pybotters/pull/211 をご覧ください。

✅ WebSocket のメッセージキューを実装しました

pybotters では WebSocket のハンドラとして各取引所の *DataStore* を提供していましたが、新たに ***WebSocketQueue*** を実装しました。 ***WebSocketQueue*** はシンプルなメッセージキューです。 *asyncio.Queue* を継承して実装されています。

💡 使いどころ

- DataStore を利用せずに素の WebSocket データを利用したい場合
- DataStore が実装されていない取引所の WebSocket データを利用したい場合

💡 DataStore の watch メソッドとの比較

DataStore の ***watch*** メソッドでもデータのキューイングが可能ですが、***WebSocketQueue*** とは仕様が異なります。 少し似た機能なので、違いを説明します。

- 取得するデータ単位
- watch
- DataStore アイテムごと
- 例えば trade というストアがあり WebSocket から `{"channel": "trade, "data": [{"id": 1}, {"id": 2}]}` のようなデータが配信されたとしたら、ストア内の処理で `{"id": 1}` と `{"id": 2}` の 2 つのアイテムとして登録され、その 2 つが watch のストリームから取得されます。
- WebSocketQueue
- WebSocket メッセージごと
- 上記の例で言うと、WebSocket メッセージ `{"channel": "trade, "data": [{"id": 1}, {"id": 2}]}` がそのまま取得されます。
- 発火の単位
- watch
- DataStore アイテムの更新ごと
- 例えば order というストアが WebSocket からあるオーダー ID がキャンセルされた旨のメッセージが配信された時に、order ストアに該当オーダー ID が存在していればそのアイテムは削除され watch に配信されます。 しかし該当オーダー ID が存在しない場合はストアに変更は存在しない為、watch に変更は配信されません。 つまり、`WebSocket メッセージの配信数 >= watch の発火数` です。
- WebSocketQueue
- WebSocket メッセージの配信ごと
- `WebSocket メッセージの配信数 == WebSocketQueue の発火数` です。
- データの形式
- watch
- 例えば trade というストアに WebSocket メッセージ `{"channel": "trade, "data": [{"id": 1}]}` が配信されたとしたら、ストア内の処理で `{"id": 1}` にパースされストアに格納されます。 このアイテムが watch で取得されます。
- WebSocketQueue
- 上記の例で言うと、`{"channel": "trade, "data": [{"id": 1}]}` がそのまま取得されます。

サンプルコード

Coincheck で約定をキューイングするサンプルコードです。

1. `pybotters.WebSocketQueue()` でインスタンスを生成する
2. `onmessage` メソッドをハンドラに渡す
3. `iter_msg` メソッドをコールして `async for` ループに渡す
4. WebSocket メッセージ受信時、`async for` で定義したループ変数に値が格納される

py
import asyncio

import pybotters


async def main():
async with pybotters.Client() as client:
wsq = pybotters.WebSocketQueue()

await client.ws_connect(
"wss://ws-api.coincheck.com/",
send_json={"type": "subscribe", "channel": "btc_jpy-trades"},
hdlr_json=wsq.onmessage,
)

async for msg in wsq.iter_msg():
print(msg)


if __name__ == "__main__":
try:
asyncio.run(main())
except KeyboardInterrupt:
pass


`iter_msg` はタイムアウトを指定するなども可能です。 また *asyncio.Queue* の継承クラスなので `get` を利用することもできます。

詳細は https://github.com/MtkN1/pybotters/pull/209 をご覧ください。

⏫ Improvements

✅ watch 機能で影響元のデータとストアが分かるようになりました

例えば bitFlyer でオーダーがキャンセルされた時に watch で受け取るデータは以下の通りでした。

py
変更前
StoreChange(
│ operation='delete',
│ data={
│ │ 'product_code': 'BTC_JPY',
│ │ 'child_order_id': 'JOR20221228-121846-331601',
│ │ 'child_order_acceptance_id': 'JRF20221228-121846-183970',
│ │ 'event_date': '2022-12-28T12:18:46.9290446Z',
│ │ 'event_type': 'ORDER',
│ │ 'child_order_type': 'LIMIT',
│ │ 'side': 'BUY',
│ │ 'price': 2228600,

0.14.1

🪧 What's Changed
* Binance の DataStore で Spot の listenkey が更新されない問題を修正した by MtkN1 in https://github.com/MtkN1/pybotters/pull/196
* KuCoinDataStore のポジションが正しく反映されないバグを修正した by ko0hi in https://github.com/MtkN1/pybotters/pull/198
* ws_connect に heartbeat のデフォルト値を追加した by MtkN1 in https://github.com/MtkN1/pybotters/pull/201


**Full Changelog**: https://github.com/MtkN1/pybotters/compare/v0.14.0...v0.14.1

0.14.0

🪧 What's Changed
* Binance DataStore が Spot / COIN-M をサポートしました by ko0hi in https://github.com/MtkN1/pybotters/pull/189
* KuCoin をサポートしました by ko0hi in https://github.com/MtkN1/pybotters/pull/185
* Bitget Trade DataStoreで side の項目に間違った値が入っている問題を修正しました by ko0hi in https://github.com/MtkN1/pybotters/pull/183
* bitFlyer Positions DataStore で watch 機能を利用した際、ポジションが解消されたイベントが受け取れない問題を修正しました by ko0hi in https://github.com/MtkN1/pybotters/pull/182

🚀 New Features

✨ Binance DataStore が Spot / COIN-M をサポートしました

BinanceDataStore は USDⓈ-M Futures トレードの WebSocket 配信情報のみをサポートしていましたが、このアップデートにより Spot と COIN-M のサポートを追加しました!
追加された Spot と COIN-M のストアも、従来の USDⓈ-M ストア同様に WebSocket から配信される板情報やオーダー情報などを利用できます。

1. 非推奨

既存のクラス `pybotters.BinanceDataStore` は USDⓈ-M のストアとして実装されていますが、このクラスは非推奨となり将来的に削除されます。
Spot / USDⓈ-M / COIN-M のストアはそれぞれ新しいクラス名で提供されます。 (以下参照)

2. リファレンス

実装されているストアのプロパティ変数名と、それに対応する WebSocket Streams を表します。

**Spot**

- _class_ pybotters.BinanceSpotDataStore
- _coroutine_ **initialize**(_*aws_)
- [Order Book](https://binance-docs.github.io/apidocs/spot/en/#order-book)
- **orderbook**
- [Kline/Candlestick Data](https://binance-docs.github.io/apidocs/spot/en/#kline-candlestick-data)
- **kline**
- [Current Open Orders](https://binance-docs.github.io/apidocs/spot/en/#current-open-orders-user_data)
- **order**
- [Query Open OCO](https://binance-docs.github.io/apidocs/spot/en/#query-open-oco-user_data)
- **ocoorder**
- [Account Information](https://binance-docs.github.io/apidocs/spot/en/#account-information-user_data)
- **account**
- [LISTEN KEY (SPOT)](https://binance-docs.github.io/apidocs/spot/en/#listen-key-spot)
- **listenkey**
- 自動で定期的に listenkey を延長する
- **trade**
- [Aggregate Trade Streams](https://binance-docs.github.io/apidocs/spot/en/#aggregate-trade-streams)
- [Trade Streams](https://binance-docs.github.io/apidocs/spot/en/#trade-streams)
- **kline**
- [Kline/Candlestick Streams](https://binance-docs.github.io/apidocs/spot/en/#kline-candlestick-streams)
- **ticker**
- [Mini Ticker Stream](https://binance-docs.github.io/apidocs/spot/en/#individual-symbol-mini-ticker-stream)
- [Ticker Streams](https://binance-docs.github.io/apidocs/spot/en/#individual-symbol-ticker-streams)
- **bookticker**
- [Book Ticker Streams](https://binance-docs.github.io/apidocs/spot/en/#individual-symbol-book-ticker-streams)
- **orderbook**
- [Diff. Depth Stream](https://binance-docs.github.io/apidocs/spot/en/#diff-depth-stream)
- **account**
- [Account Update](https://binance-docs.github.io/apidocs/spot/en/#payload-account-update)
- **order**
- [Order Update](https://binance-docs.github.io/apidocs/spot/en/#payload-order-update) の `executionReport` イベント
- **ocoorder**
- [Order Update](https://binance-docs.github.io/apidocs/spot/en/#payload-order-update) の `listStatus` イベント
- **listenkey**
- [LISTEN KEY (SPOT)](https://binance-docs.github.io/apidocs/spot/en/#listen-key-spot)

**USDⓈ-M**

- _class_ pybotters.BinanceUSDSMDataStore
- _coroutine_ **initialize**(_*aws_)
- [Order Book](https://binance-docs.github.io/apidocs/futures/en/#order-book)
- **orderbook**
- [Kline/Candlestick Data](https://binance-docs.github.io/apidocs/futures/en/#kline-candlestick-data)
- **kline**
- [Current All Open Orders](https://binance-docs.github.io/apidocs/futures/en/#current-all-open-orders-user_data)
- **order**
- [Futures Account Balance V2](https://binance-docs.github.io/apidocs/futures/en/#futures-account-balance-v2-user_data)
- **balance**
- [Position Information V2](https://binance-docs.github.io/apidocs/futures/en/#position-information-v2-user_data)
- **position**
- [Start User Data Stream](https://binance-docs.github.io/apidocs/futures/en/#start-user-data-stream-user_stream)
- **listenkey**
- 自動で定期的に listenkey を延長する
- **trade**
- [Aggregate Trade Streams](https://binance-docs.github.io/apidocs/futures/en/#aggregate-trade-streams)
- **markprice**
- [Mark Price Stream](https://binance-docs.github.io/apidocs/futures/en/#mark-price-stream)
- **kline**
- [Kline/Candlestick Streams](https://binance-docs.github.io/apidocs/futures/en/#kline-candlestick-streams)
- **continuouskline**
- [Continuous Contract Kline/Candlestick Streams](https://binance-docs.github.io/apidocs/futures/en/#continuous-contract-kline-candlestick-streams)
- **ticker**
- [Mini Ticker Stream](https://binance-docs.github.io/apidocs/futures/en/#individual-symbol-mini-ticker-stream)
- [Ticker Streams](https://binance-docs.github.io/apidocs/futures/en/#individual-symbol-ticker-streams)
- **bookticker**
- [Book Ticker Streams](https://binance-docs.github.io/apidocs/futures/en/#individual-symbol-book-ticker-streams)
- **liquidation**
- [Liquidation Order Streams](https://binance-docs.github.io/apidocs/futures/en/#liquidation-order-streams)
- **orderbook**
- [Diff. Depth Stream](https://binance-docs.github.io/apidocs/futures/en/#diff-book-depth-streams)
- **compositeindex**
- [Composite Index Symbol Information Streams](https://binance-docs.github.io/apidocs/futures/en/#composite-index-symbol-information-streams)
- **balance**
- [Balance and Position Update](https://binance-docs.github.io/apidocs/futures/en/#event-balance-and-position-update) の `"B"` キー
- **position**
- [Balance and Position Update](https://binance-docs.github.io/apidocs/futures/en/#event-balance-and-position-update) の `"P"` キー
- **order**
- [Order Update](https://binance-docs.github.io/apidocs/futures/en/#event-order-update)
- **listenkey**
- [Start User Data Stream](https://binance-docs.github.io/apidocs/futures/en/#start-user-data-stream-user_stream)

**COIN-M**

- _class_ pybotters.BinanceCOINMDataStore
- _coroutine_ **initialize**(_*aws_)
- [Order Book](https://binance-docs.github.io/apidocs/delivery/en/#order-book)
- **orderbook**
- [Kline/Candlestick Data](https://binance-docs.github.io/apidocs/delivery/en/#kline-candlestick-data)
- **kline**
- [Index Price Kline/Candlestick Data](https://binance-docs.github.io/apidocs/delivery/en/#index-price-kline-candlestick-data)
- **indexpricekline**
- [Mark Price Kline/Candlestick Data](https://binance-docs.github.io/apidocs/delivery/en/#mark-price-kline-candlestick-data)
- **markpricekline**
- [Current All Open Orders](https://binance-docs.github.io/apidocs/delivery/en/#current-all-open-orders-user_data)
- **order**
- [Futures Account Balance](https://binance-docs.github.io/apidocs/delivery/en/#futures-account-balance-user_data)
- **balance**
- [Position Information](https://binance-docs.github.io/apidocs/delivery/en/#position-information-user_data)
- **position**
- [Start User Data Stream](hthttps://binance-docs.github.io/apidocs/delivery/en/#start-user-data-stream-user_streamream)
- **listenkey**
- 自動で定期的に listenkey を延長する
- **trade**
- [Aggregate Trade Streams](https://binance-docs.github.io/apidocs/delivery/en/#aggregate-trade-streams)
- **indexprice**
- [Index Price Stream](https://binance-docs.github.io/apidocs/delivery/en/#index-price-stream)
- **markprice**
- [Mark Price Stream](https://binance-docs.github.io/apidocs/delivery/en/#mark-price-stream)
- [Mark Price of All Symbols of a Pair](https://binance-docs.github.io/apidocs/delivery/en/#mark-price-of-all-symbols-of-a-pair)
- **kline**
- [Kline/Candlestick Streams](https://binance-docs.github.io/apidocs/delivery/en/#kline-candlestick-streams)
- **continuouskline**
- [Continuous Contract Kline/Candlestick Streams](https://binance-docs.github.io/apidocs/delivery/en/#continuous-contract-kline-candlestick-streams)
- **indexpricekline**
- [Index Kline/Candlestick Streams](https://binance-docs.github.io/apidocs/delivery/en/#index-kline-candlestick-streams)
- **markpricekline**
- [Mark Price Kline/Candlestick Streams](https://binance-docs.github.io/apidocs/delivery/en/#mark-price-kline-candlestick-streams)
- **ticker**
- [Mini Ticker Stream](https://binance-docs.github.io/apidocs/delivery/en/#individual-symbol-mini-ticker-stream)
- [Ticker Streams](https://binance-docs.github.io/apidocs/delivery/en/#individual-symbol-ticker-streams)
- **bookticker**
- [Book Ticker Streams](https://binance-docs.github.io/apidocs/delivery/en/#individual-symbol-book-ticker-streams)
- **liquidation**
- [Liquidation Order Streams](https://binance-docs.github.io/apidocs/delivery/en/#liquidation-order-streams)
- **orderbook**
- [Diff. Depth Stream](https://binance-docs.github.io/apidocs/delivery/en/#diff-book-depth-streams)
- **balance**
- [Balance and Position Update](https://binance-docs.github.io/apidocs/delivery/en/#event-balance-and-position-update) の `"B"` キー
- **position**
- [Balance and Position Update](https://binance-docs.github.io/apidocs/delivery/en/#event-balance-and-position-update) の `"P"` キー
- **order**
- [Order Update](https://binance-docs.github.io/apidocs/delivery/en/#event-order-update)
- **listenkey**
- [Start User Data Stream](https://binance-docs.github.io/apidocs/delivery/en/#start-user-data-stream-user_stream)

3. サンプルコード

Spot, USDⓈ-M, COIN-M の User Data (残高、オーダー、ポジション) を watch 機能で監視するサンプルコードです。
このコードを実行中に Web 画面でオーダーを送信するなどすると、その情報が画面に表示されます。

py
import pybotters
import asyncio
from rich.pretty import pprint

apis = {"binance": ["KEY", "SECRET"]}


async def watcher(_stream):
with _stream as stream:
async for change in stream:
pprint(change)


async def main():
async with pybotters.Client(apis=apis) as client:
pybotters.BinanceDataStore()
sstore = pybotters.BinanceSpotDataStore()
fstore = pybotters.BinanceUSDSMDataStore()
dstore = pybotters.BinanceCOINMDataStore()

await asyncio.gather(
sstore.initialize(
client.get("https://api.binance.com/api/v3/openOrders"),
client.get("https://api.binance.com/api/v3/openOrderList"),
client.get("https://api.binance.com/api/v3/account"),
client.post("https://api.binance.com/api/v3/userDataStream"),
),
fstore.initialize(
client.get("https://fapi.binance.com/fapi/v1/openOrders"),
client.get("https://fapi.binance.com/fapi/v2/balance"),
client.get("https://fapi.binance.com/fapi/v2/positionRisk"),
client.post("https://fapi.binance.com/fapi/v1/listenKey"),
),
dstore.initialize(
client.get("https://dapi.binance.com/dapi/v1/openOrders"),
client.get("https://dapi.binance.com/dapi/v1/balance"),
client.get("https://dapi.binance.com/dapi/v1/positionRisk"),
client.post("https://dapi.binance.com/dapi/v1/listenKey"),
),
)

await asyncio.gather(
client.ws_connect(
f"wss://stream.binance.com:9443/stream?streams={sstore.listenkey}",
hdlr_json=sstore.onmessage,
),
client.ws_connect(
f"wss://fstream.binance.com/stream?streams={fstore.listenkey}",
hdlr_json=fstore.onmessage,
),
client.ws_connect(
f"wss://dstream.binance.com/stream?streams={dstore.listenkey}",
hdlr_json=dstore.onmessage,
),
)

await asyncio.gather(
Spot
watcher(sstore.account.watch()),
watcher(sstore.ocoorder.watch()),
watcher(sstore.order.watch()),
USDⓈ-M
watcher(fstore.balance.watch()),
watcher(fstore.position.watch()),
watcher(fstore.order.watch()),
COIN-M
watcher(dstore.balance.watch()),
watcher(dstore.position.watch()),
watcher(dstore.order.watch()),
)


if __name__ == "__main__":
try:
asyncio.run(main())
except KeyboardInterrupt:
pass


✨ KuCoin の API 認証 / DataStore をサポートしました

700 種類以上のコインが上場し、CoinMarketCap の取引高 5 位の KuCoin をサポートしました!
Spot / Futures 両方対応しており、API 認証及び DataStore を利用できます。

1. リファレンス

- _class_ pybotters.KuCoinDataStore
- _coroutine_ **initialize**(_*aws_)
- **kline**
- **positions**
- **endpoint**
- `/api/v1/bullet-public`, `/api/v1/bullet-private` で取得された動的 WebSocket エンドポイントを格納する
- **ticker**
- **kline**
- **symbolsnapshot**
- **orderbook5**
- **orderbook50**
- **execution**
- **indexprice**
- **markprice**
- **orderevents**
- **orders**
- **balance**
- **marginfundingbook**
- **marginpositions**
- **marginpositionevents**
- **marginorderevents**
- **marginorders**
- **instrument**
- **announcements**
- **transactionstats**
- **balanceevents**
- **positions**
- **endpoint**
- WebSocket の動的エンドポイント

※詳細な情報 (対応するエンドポイント及び WebSocket イベント) は docstrings に記載されています。

2. サンプルコード

Kline の取得、約定監視、板監視、オーダー のサンプルコードです。

py
import asyncio
import pybotters
import uuid
import rich


async def sample1():
kline取得
async with pybotters.Client(base_url="https://api.kucoin.com") as client:
store = pybotters.KucoinDataStore()

await store.initialize(
client.get("/api/v1/market/candles?type=1min&symbol=BTC-USDT"),
client.post("/api/v1/bullet-public"),
)
await client.ws_connect(
store.endpoint,
send_json=[
{
"id": str(uuid.uuid4()),
"type": "subscribe",
"topic": "/market/candles:BTC-USDT_1min",
"response": True,
},
{
"id": str(uuid.uuid4()),
"type": "subscribe",
"topic": "/market/candles:BTC-USDT_3min",
"response": True,
},
],
hdlr_json=store.onmessage,
)

while True:
rich.print(
[
未確定足
store.kline.latest("BTC-USDT", "1min"),
store.kline.latest("BTC-USDT", "3min"),
確定足
store.kline.find({"symbol": "BTC-USDT", "interval": "1min"})[-2:],
store.kline.find({"symbol": "BTC-USDT", "interval": "3min"})[-2:],
]
)
await asyncio.sleep(1)


async def sample2():
約定監視
async with pybotters.Client(base_url="https://api-futures.kucoin.com") as client:
store = pybotters.KucoinDataStore()
await store.initialize(client.post("/api/v1/bullet-public"))
await client.ws_connect(
store.endpoint,
send_json=[
{
"id": str(uuid.uuid4()),
"type": "subscribe",
"topic": "/contractMarket/execution:XBTUSDTM",
"response": True,
}
],
hdlr_json=store.onmessage,
)

with store.execution.watch() as stream:
async for msg in stream:
rich.print(msg)


async def sample3():
板監視
async with pybotters.Client(base_url="https://api-futures.kucoin.com") as client:
store = pybotters.KucoinDataStore()
await store.initialize(client.post("/api/v1/bullet-public"))
await client.ws_connect(
store.endpoint,
send_json=[
{
"id": str(uuid.uuid4()),
"type": "subscribe",
"topic": "/contractMarket/level2Depth5:XBTUSDTM",
"response": True,
}
],
hdlr_json=store.onmessage,
)

while True:
await store.orderbook5.wait()
rich.print(store.orderbook5.sorted())


async def sample4():
注文
async with pybotters.Client(
base_url="https://api-futures.kucoin.com",
apis={
"kucoinfuture": [
"YOUR_API_KEY",
"YOUR_SECRET_KEY",
"YOUR_PASSPHRASE",
]
},
) as client:
store = pybotters.KucoinDataStore()
await store.initialize(client.post("/api/v1/bullet-private"))
await client.ws_connect(
store.endpoint,
send_json=[
{
"id": str(uuid.uuid4()),
"type": "subscribe",
"topic": "/contractMarket/tradeOrders",
"privateChannel": True,
"response": True,
},
],
hdlr_json=store.onmessage,
)

await client.post(
"/api/v1/orders",
data=dict(
clientOid=str(uuid.uuid4()),
side="buy",
symbol="XBTUSDTM",
type="limit",
price="18000",
leverage=1,
size=1,
),
)

await asyncio.sleep(1)

rich.print(store.orders.find())

await client.delete("/api/v1/orders")

await asyncio.sleep(1)

rich.print(store.orders.find())


💊 Bugfix

- BitgetDataStore.trade の "side" フィールドに "price" の値が入っていたバグを修正しました
- DataStore において _remove メソッドが watch にデータをキューイングしていないバグを修正しました

New Contributors
* ko0hi made their first contribution in https://github.com/MtkN1/pybotters/pull/182

**Full Changelog**: https://github.com/MtkN1/pybotters/compare/v0.13.1...v0.14.0

0.13.1

⏫ Improvements

- FTXDataStore.orderbook に time プロパティを追加しました (Contributed by sunbluesome 💖)

FTXDataStore では WebSocket から受信する Orderbooks データの "time" を利用していませんでしたが、プロパティ変数として格納するようになりました。

FTX - WebSocket- Orderbooks のデータ形式

json
{
"channel": "orderbook",
"market": "BTC-PERP",
"type": "update",
"data": {
"time": 1657555432.5312576,
"checksum": 804021281,
"bids": [...],
"asks": [...],
"action": "update"
}
}


参照方法

py
>>> store = pybotters.FTXDataStore()
...
>>> store.orderbook.time

0.13.0

🚀 New Features

✨ DataStore の変更を監視する watch 機能を追加しました

`store.xxx.wait` メソッドの置き換えとなる `store.xxx.watch` メソッドを追加しました!
このメソッドを利用することで、より手軽に WebSocket からのデータ監視を行う事ができます。
2つのユースケースを用いて、 `store.xxx.watch` の機能と `store.xxx.wait` との違いを説明します。

ユースケース: bitFlyer でパブリックの約定履歴を監視する

py
async def main():
async with pybotters.Client() as client:
store = pybotters.bitFlyerDataStore()
await client.ws_connect(
"wss://ws.lightstream.bitflyer.com/json-rpc",
send_json={"method": "subscribe", "params": {"channel": "lightning_executions_FX_BTC_JPY"}},
hdlr_json=store.onmessage,
)

with store.executions.watch() as stream:
async for change in stream:
print(f"operation: {change.operation}")
print(f"data: {change.data}")
operation: insert
data: {'product_code': 'FX_BTC_JPY', 'id': 2343846871, ...}


`store.executions.watch` メソッドを with 構文でコンテキストマネージャーを開くことで変更ストリームクラス `StoreStream` の `stream` 変数を得ます。
`stream` を async for 構文で非同期イテレーションをすることで、約定履歴ストアに変更があるまで待機し変更データクラス `StoreChange` の `change` 変数を得ます。
`change` には 2 つのプロパティがあります。
`change.operation` はその変更がどの性質( `{insert,update,delete}` )であるかを表す文字列が格納されます。
`change.data` は変更されたレコード(辞書)が格納されます。

async for のイテレートは break などで抜けない限り永久繰り返されます。
ループが必要なく任意回数の待機を行いたい場合は、 async for 構文で実行される同等のメソッド `stream.get` を await 文で呼び出してください。

`store.xxx.wait` と `store.xxx.watch` の大きな違いは以下の通りです。

- `store.xxx.wait`
- 結果を辞書のリスト( `[item1, item2, ...]` )で受け取る
- 変更の性質を受け取れない
- 内部実装が試験的であり( https://github.com/MtkN1/pybotters/pull/77 )、メソッド名が体を表していない
- `store.xxx.watch`
- 結果を辞書で受け取る
- 変更の性質を受け取れる
- 非同期キューで実装されており、メソッド名が体を表している

`store.xxx.wait` は将来的に値を返さない変更を検討しています。
`store.xxx.wait` の戻り値を利用しているユーザーは `store.xxx.watch` にマイグレーションをお願いします。

ユースケース: bitFlyer オーダーキャンセルの反映を待つ

py
async def main():
async with pybotters.Client(base_url="https://api.bitflyer.com") as client:
store = pybotters.bitFlyerDataStore()
await store.initialize(
client.get(
"/v1/me/getchildorders?product_code=FX_BTC_JPY&child_order_state=ACTIVE"
),
)
await client.ws_connect(
"wss://ws.lightstream.bitflyer.com/json-rpc",
send_json={
"method": "subscribe",
"params": {"channel": "child_order_events"},
"id": 1,
},
hdlr_json=store.onmessage,
)
await store.wait()

child_order_id = next(iter(store.childorders), {}).get("child_order_id", None)
if not child_order_id:
return
with store.childorders.watch() as stream:
data = {"product_code": "FX_BTC_JPY", "child_order_id": child_order_id}
print(f"Request cancelchildorder for {child_order_id}")
async with client.post("/v1/me/cancelchildorder", data=data):
pass cancelchildorder dose not return value
print("Waiting for cancel ...")
async for change in stream:
if change.data["child_order_id"] == child_order_id:
print("Cancel event received")
break


bitFlyer FX_BTC_JPY に1つ以上の childorder がある時に上記コードを実行すると、REST API で1つの childorder をキャンセルし、 WebSocket からキャンセル完了イベントによって DataStore からレコードが削除されるまで待機します。

このようなイベントを待つユースケースで発生する問題の1つとして「REST API の応答より WebSocket の応答の方が速い」という事象があります。
これは取引所側サーバーの仕様に起因するもので、`store.xxx.wait` を利用するとこの対処が難しくなっていました。
つまり REST API を叩き終わった後には DataStore に変更が適用されており、その後 wait すると所謂無限待機になってしまいます。

今回実装した `store.xxx.watch` は with 構文でコンテキストマネージャーを開いた際に内部でキューを生成しています。
コンテキストマネージャーの中では REST API を叩いても(または他の非同期処理を行っても)、 WebSocket による DataStore の変更はキューイングされるので確実にデータを取得できます。
結果としてそのようなユースケースを、上記サンプルコードのよう簡単かつ安全に実装できます。


🐛 Bugfix

- bitFlyerDataStore のポジションがずれる問題を修正しました (Contributed by shinji19 💖)
- bitFlyerDataStore のポジションが初期化するたびに増える問題を修正しました (Contributed by shinji19 💖)
- BinanceDataStore の listen key の keep alive を testnet でも動作するように修正しました (Contributed by LopeRope 💖)
- BinanceDataStore のポジションの初期化時に "up" (Unrealized Profit) のキーを追加しました (Contributed by WannabeBotter 💖)

🌈 Experimental

イベントリスナー機能の追加や設計刷新に関する大幅改修のブランチをリポジトリに Push しました。
様々な課題の解決の為の刷新で、将来的な正式バージョンのベースになります。

これを試したい先進的なユーザーはリポジトリをクローンしブランチ `experimental` を pip または poetry でインストールしてください。
簡単な説明とマイグレーションの為に experimental ブランチの pybotters/experimental ディレクトリに README.md があります。

https://github.com/MtkN1/pybotters/tree/experimental/pybotters/experimental

Issues

✅ DataStoreにデータのwatch機能を追加する 155

Pull requests

✅ Fix Binance listenKey keepalive 158
✅ Store unRealizedProfit info from riskPosition REST API to datastore 160
✅ bitFlyerのポジションがずれる問題の対応 161
✅ bitFlyerのDataStoreでポジションを初期化するたびに増える問題の対応 162

Page 4 of 8

© 2024 Safety CLI Cybersecurity Inc. All Rights Reserved.