پرش به محتویات

وب‌سوکت

استریم‌ها از سرور Centrifugo بیت‌پین استفاده می‌کنند و بستهٔ اضافه لازم دارند: pip install "bitpin-sdk[ws]". هر دو کلاینت آن را دارند: AsyncBitpin روی event loop شما اجرا می‌کند و Bitpin همگام روی یک thread پس‌زمینه؛ در Bitpin هر فراخوانی watch_* تا به‌روزرسانی بعدی منتظر می‌ماند و close() آن thread را متوقف می‌کند.

هر فراخوانی watch_* بار اول مشترک (subscribe) می‌شود و سپس به‌روزرسانی بعدی را برمی‌گرداند. هر watch متمایز (متد، نماد و بازهٔ زمانی) صف خودش را برای به‌روزرسانی‌هایی که بین دو فراخوانی می‌رسند دارد؛ پس حلقه چیزی را از دست نمی‌دهد و یک تسک برای هر بازار درست کار می‌کند. دو تسک که منتظر یک watch یکسان باشند به‌روزرسانی‌ها را بین خود تقسیم می‌کنند؛ برای هر watch یک مصرف‌کننده داشته باشید:

async with AsyncBitpin(Config.from_env()) as client:
    while True:
        book = await client.watch_order_book("BTC/IRT")
        print(book["bids"][0], book["asks"][0])
متد کانال خروجی
watch_ticker(symbol) market:<symbol> Ticker (آمار ۲۴ ساعته) با هر معامله
watch_ohlcv(symbol, timeframe="1m") market:<symbol> آخرین کندل‌های آن بازه (هر ۱۰ ثانیه و با هر معامله)
watch_order_book(symbol) orderbook:<symbol> OrderBook هنگام تغییر دفتر سفارش
watch_trades(symbol) matches:<symbol> [Trade]، معاملات جدید عمومی
watch_orders(symbol=None) کانال خصوصی شما Order وقتی یکی از سفارش‌هایتان ثبت، پر یا لغو شود
watch_my_trades(symbol=None) کانال خصوصی شما Trade، هر معاملهٔ شما

کانال‌های خصوصی کلید لازم دارند. کلاینت توکن اتصال و نام کانال شما را از POST /api/v1/usr/ws-info/ (۱۰ بار در دقیقه) می‌گیرد و هنگام اتصال دوباره توکن را تازه می‌کند.

الگوی پیشنهادی: وضعیت اولیه را با REST بخوانید (fetch_order_book، fetch_open_orders) و سپس به‌روزرسانی‌های وب‌سوکت را اعمال کنید. بیت‌پین فقط هنگام تغییر پیام می‌فرستد.

هر watch_* پارامتر timeout (ثانیه) می‌گیرد؛ اگر در این مدت به‌روزرسانی نرسد، خطای RequestTimeout می‌دهد:

with Bitpin(Config.from_env()) as client:          # همگام هم کار می‌کند
    book = client.watch_order_book("BTC/IRT", timeout=30)

یک اتصال همهٔ کانال‌ها را حمل می‌کند. await client.close() آن را می‌بندد. برای کنترل بیشتر مستقیم از bitpin_sdk.ws.BitpinWS(client, queue_size=1000) استفاده کنید.