Trading Bot SDK for StockAPIs - Build custom trading bots with ease
Project description
stockapis-bot
Python SDK for building trading bots with StockAPIs platform.
Features
- Pydantic v2 typed settings with JSON Schema (auto-sent to Django)
- Deterministic bot_id from name (UUID5 - same name = same ID everywhere)
- Built-in environment configs (DEV/PROD) - no infrastructure setup needed
- gRPC streaming for real-time signals from Django
- Binance Futures testnet/live trading
- Redis pub/sub for event handling
- Telegram channel signal extraction
Install
pip install stockapis-bot
Environment
Only credentials needed - infrastructure config (hosts, ports) is built into the package:
# Binance TESTNET
BINANCE__API_KEY=your_testnet_api_key
BINANCE__API_SECRET=your_testnet_api_secret
BINANCE__TESTNET=true
# gRPC API Key (host/port built-in per environment)
GRPC__API_KEY=your-api-key
# Redis (host/port built-in per environment)
REDIS__PASSWORD=
REDIS__CHANNEL=trading_signals
# Telegram Spy (optional)
TELEGRAM__API_ID=123456
TELEGRAM__API_HASH=your_api_hash
TELEGRAM__SESSION=1BQA... # from `telegram-spy auth`
TELEGRAM__CHANNELS=channel1,channel2
Quick Start
from decimal import Decimal
from pydantic import Field
from stockapis_bot import (
BotClient, BotSettings, ClientConfig, Environment,
TradingBot, TradingSignal, SignalDecision,
)
# 1. Define settings schema (sent to Django for dynamic form generation)
class ScalperSettings(BotSettings):
min_confidence: float = Field(default=0.7, ge=0, le=1, description="Min confidence")
position_size: Decimal = Field(default=Decimal("100"), description="Position USDT")
# 2. Create bot with settings schema
class MyBot(TradingBot):
settings_schema = ScalperSettings # Schema sent to Django on registration
async def on_signal(self, signal: TradingSignal) -> SignalDecision:
# Access typed settings (updated from Django)
if signal.confidence < self.settings.min_confidence:
return SignalDecision.skip("Low confidence")
qty = str(self.settings.position_size)
if signal.is_buy_signal:
return SignalDecision.buy(qty, "High confidence buy")
elif signal.is_sell_signal:
return SignalDecision.sell(qty, "High confidence sell")
return SignalDecision.skip("Unknown signal")
async def on_start(self) -> None:
print(f"Bot {self.name} ({self.bot_id}) started")
print(f"Settings: {self.settings}")
async def on_stop(self, reason: str) -> None:
print(f"Bot stopped: {reason}")
# 3. Run - bot_id auto-generated from name (deterministic UUID5)
async def main():
bot = MyBot(name="my-scalper")
config = ClientConfig.from_settings(
bot_id=bot.bot_id,
bot_name=bot.name,
env=Environment.DEV, # or Environment.PROD
include_exchange=True, # Binance from .env
include_redis=True, # Redis listener
)
client = BotClient.create(bot, config) # Schema sent to Django here
await client.run()
if __name__ == "__main__":
import asyncio
asyncio.run(main())
Environments
Built-in infrastructure configs - just select DEV or PROD:
# Development (localhost)
config = ClientConfig.from_settings(bot_id, bot_name, env=Environment.DEV)
# Production (StockAPIs cloud)
config = ClientConfig.from_settings(bot_id, bot_name, env=Environment.PROD)
Bot Methods
# Trading
await self.buy(symbol, quantity)
await self.sell(symbol, quantity, reduce_only=True)
# Market data
ticker = await self.get_ticker("BTCUSDT") # ticker.price
balance = await self.get_balance() # balance.available_usdt
# Utils
qty = await self.calculate_quantity(symbol, usdt_amount=100, leverage=10)
await self.set_leverage(symbol, leverage=20)
# State
self.is_running # bool
self.is_active # bool (running + config.active)
self.config # BotConfig from Django (enabled, active, etc.)
self.settings # Typed settings (ScalperSettings) - updated from Django
CLI
| Command | Description | Args |
|---|---|---|
telegram-spy auth |
Generate session string | -i API_ID -h API_HASH |
telegram-spy test |
Test session validity | -i API_ID -h API_HASH -s SESSION |
telegram-spy channels |
List your channels | -i API_ID -h API_HASH -s SESSION |
telegram-spy run |
Run spy → Redis | reads from env |
telegram-spy send |
Send test signal | BOT__TOKEN env |
License
MIT
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
stockapis_bot-0.3.2.tar.gz
(101.5 kB
view details)
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
stockapis_bot-0.3.2-py3-none-any.whl
(101.9 kB
view details)
File details
Details for the file stockapis_bot-0.3.2.tar.gz.
File metadata
- Download URL: stockapis_bot-0.3.2.tar.gz
- Upload date:
- Size: 101.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ce98f0f5bb93c240179d37c880a0da3c43c203fbed690f0d7b787b3388b46b5d
|
|
| MD5 |
33d58f84f3b5f3bf54afe91001c86639
|
|
| BLAKE2b-256 |
a7852455936b976d8a97da5d8f0ba4d0ee571b4b8fa1217dfc3f7e9c4370fd1c
|
File details
Details for the file stockapis_bot-0.3.2-py3-none-any.whl.
File metadata
- Download URL: stockapis_bot-0.3.2-py3-none-any.whl
- Upload date:
- Size: 101.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d757d2a17cf87c77a91267f113605cc5726a5a9aa96c3505d92096bba1341b00
|
|
| MD5 |
9ab720af44f09d8290a7997e0f8aff75
|
|
| BLAKE2b-256 |
41bb8140498d9fcded8437ac36f64fd4ded23fd48574bde4e5a8fc7c174c0c97
|