Skip to content

🚀 Version 0.16.0

Compare
Choose a tag to compare
@MtkN1 MtkN1 released this 08 Mar 17:59
· 43 commits to main since this release
4c8fd5f

🪧 What's Changed

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

🚀 New Features

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

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

  • 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 でも動作することは確認済みです。

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

💡 サンプルコード

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

🚧 このコードを実行するとテストネットに BTCUSDT 0.001 枚の買い成行注文が送信されます。

import asyncio

import pybotters
from rich.pretty import pprint

apis = {
    "bybit_testnet": ["BYBIT_TESTNET_API_KEY", "BYBIT_TESTNET_API_SECRET"],
}


async def main():
    async with pybotters.Client(
        base_url="https://api-testnet.bybit.com", apis=apis
    ) as client:
        async with client.post(
            "/v5/order/create",
            data={
                "category": "linear",
                "symbol": "BTCUSDT",
                "side": "Buy",
                "orderType": "Market",
                "qty": "0.001",
            },
        ) as resp:
            content = await resp.json()
        pprint(content)


asyncio.run(main())

Public WebSocket を購読して DataStore でウォッチする

BTCUSDT に関する全ての Public WebSocket トピックを指定している為大量データの print 出力が表示されます。
適宜 topics の内容をコメントアウトして絞ってください。

import asyncio

import pybotters
import pybotters.store
from rich.pretty import pprint


async def watcher(ctx: pybotters.store.StoreStream):
    try:
        with ctx as stream:
            async for change in stream:
                pprint(change)
    except KeyboardInterrupt:
        pass


async def main():
    topics = [
        "orderbook.50.BTCUSDT",
        "publicTrade.BTCUSDT",
        "tickers.BTCUSDT",
        "kline.5.BTCUSDT",
        "liquidation.BTCUSDT",
    ]

    async with pybotters.Client() as client:
        store = pybotters.BybitV5DataStore()

        ws = await client.ws_connect(
            "wss://stream.bybit.com/v5/public/linear",
            send_json={
                "op": "subscribe",
                "args": topics,
            },
            hdlr_json=store.onmessage,
        )

        for topic in topics:
            dsname, *_ = topic.split(".")
            asyncio.create_task(watcher(store[dsname].watch()))

        await ws


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

Private WebSocket を購読して DataStore でウォッチする

こちらのコードを実行後、テストネットにて注文などのアカウント操作をするとリアルタイムデータが DataStore のウォッチ機能で出力されます。
watcher 関数のコメントアウトを切り替えると、リアルタイムデータがハンドリングされた後の実際のストアの中身を確認することができます。

import asyncio

import pybotters
import pybotters.store
from rich.pretty import pprint

apis = {
    "bybit_testnet": ["BYBIT_TESTNET_API_KEY", "BYBIT_TESTNET_API_SECRET"],
}


async def watcher(ctx: pybotters.store.StoreStream):
    with ctx as stream:
        async for change in stream:
            pprint(change)
            # pprint(change.store.find())


async def main():
    topics = [
        "position",
        "execution",
        "order",
        "wallet",
        "greeks",
    ]

    async with pybotters.Client(apis=apis) as client:
        store = pybotters.BybitV5DataStore()

        await store.initialize(
            client.get(
                "https://api-testnet.bybit.com/v5/position/list?category=linear&symbol=BTCUSDT"  # noqa
            ),
            client.get(
                "https://api-testnet.bybit.com/v5/order/realtime?category=linear&symbol=BTCUSDT"  # noqa
            ),
            client.get(
                "https://api-testnet.bybit.com/v5/account/wallet-balance?accountType=UNIFIED"  # noqa
            ),
        )

        ws = await client.ws_connect(
            "wss://stream-testnet.bybit.com/v5/private",
            send_json={
                "op": "subscribe",
                "args": topics,
            },
            hdlr_json=store.onmessage,
        )

        for topic in topics:
            asyncio.create_task(watcher(store[topic].watch()))

        await ws


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

その他のサンプルや詳細仕様は、#223 #226 をご覧ください。

⬆️ Improves

✅ 依存関係を見直し、他のライブラリと併用しやすくなりました

pybotters の依存関係を整理しました。

具体的には typing-extensions のバージョン制約で、InfluxDB のクライアントライブラリ influxdb-client を pybottes に併せてインストールができない問題が発生していましたが、それを解消しました。

👷 CI / Misc

  • ✅ pybotters の PyPI アップロードを GitHub Actions で自動化しました
  • ✅ pybotters の GitHub README にバッジを追加したり PyPI の概要を更新しました

New Contributors

Full Changelog: v0.15.0...v0.16.0

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

  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