StrateQueue Python API Documentation
StrateQueue provides a comprehensive Python API for algorithmic trading that supports backtesting, paper trading, and live trading.
Table of Contents
- Quick Start
- Core Components
- Data Providers
- Trading Engines
- Brokers
- Strategy Development
- Live Trading System
- Multi-Strategy Trading
- Signal Processing
- Configuration
- Examples
Quick Start
Installation
pip install stratequeue
# Or with optional dependencies
pip install stratequeue[full]
Basic Usage
from StrateQueue import LiveTradingSystem, StrategyLoader
# Single strategy live trading
system = LiveTradingSystem(
strategy_path="my_strategy.py",
symbols=["AAPL", "MSFT"],
data_source="demo",
granularity="1m",
enable_trading=False, # Paper trading
paper_trading=True
)
# Run the system
await system.run_live_system()
Core Components
Main Classes
from StrateQueue import (
LiveTradingSystem, # Main orchestrator
MultiStrategyRunner, # Multi-strategy coordinator
StrategyLoader, # Strategy loading utilities
SimplePortfolioManager # Portfolio management
)
Data Providers
StrateQueue uses a factory pattern for data providers, supporting multiple data sources.
Available Data Providers
from StrateQueue.data import (
DataProviderFactory,
get_supported_providers,
auto_create_provider
)
# List available providers
providers = get_supported_providers()
print(providers) # ['demo', 'polygon', 'coinmarketcap', 'alpaca', 'ibkr', 'ccxt', 'yfinance']
# Auto-create provider (detects from environment)
provider = auto_create_provider(granularity="1m")
Manual Provider Creation
from StrateQueue.data import DataProviderConfig, DataProviderFactory
# Create demo data provider
config = DataProviderConfig(
provider_type="demo",
granularity="1m"
)
provider = DataProviderFactory.create_provider("demo", config)
# Create Polygon provider (requires API key)
config = DataProviderConfig(
provider_type="polygon",
granularity="1m",
api_key="your_polygon_api_key"
)
provider = DataProviderFactory.create_provider("polygon", config)
Using Data Providers
import asyncio
async def fetch_data_example():
provider = auto_create_provider(granularity="1m")
# Subscribe to symbols (available for some providers)
if hasattr(provider, 'subscribe_to_symbol'):
await provider.subscribe_to_symbol("AAPL")
await provider.subscribe_to_symbol("MSFT")
# Fetch historical data
data = await provider.fetch_historical_data(
symbol="AAPL",
days_back=30,
granularity="1m"
)
print(f"Fetched {len(data)} bars")
print(data.head())
# Run the example
asyncio.run(fetch_data_example())
Trading Engines
StrateQueue supports multiple backtesting engines through a unified interface.
Available Engines
from StrateQueue.engines import (
EngineFactory,
get_supported_engines,
auto_create_engine
)
# List available engines
engines = get_supported_engines()
print(engines) # ['backtesting', 'vectorbt', 'zipline', 'backtrader', 'bt']
# Auto-create engine (requires strategy path for detection)
engine = auto_create_engine("path/to/strategy.py")
Manual Engine Creation
from StrateQueue.engines import EngineFactory
# Create backtesting.py engine
engine = EngineFactory.create_engine("backtesting")
# Create VectorBT engine (if installed)
try:
engine = EngineFactory.create_engine("vectorbt")
except ImportError:
print("VectorBT not installed")
Brokers
StrateQueue provides a unified broker interface for different trading platforms.
Available Brokers
from StrateQueue.brokers import (
BrokerFactory,
get_supported_brokers,
auto_create_broker
)
# List available brokers
brokers = get_supported_brokers()
print(brokers) # ['alpaca', 'ccxt', 'ibkr']
# Auto-create broker (detects from environment)
broker = auto_create_broker()
Manual Broker Creation
from StrateQueue.brokers import BrokerConfig, BrokerFactory
# Create Alpaca broker
config = BrokerConfig(
broker_type="alpaca",
paper_trading=True,
credentials={
"api_key": "your_alpaca_api_key",
"secret_key": "your_alpaca_secret_key"
}
)
broker = BrokerFactory.create_broker("alpaca", config)
# Create CCXT broker for Binance
config = BrokerConfig(
broker_type="ccxt",
paper_trading=True,
credentials={
"api_key": "your_binance_api_key",
"secret": "your_binance_secret"
},
additional_params={"exchange": "binance"}
)
broker = BrokerFactory.create_broker("ccxt", config)
# Or use the convenient ccxt.exchange syntax
broker = BrokerFactory.create_broker("ccxt.binance", config)
# Connect to broker
if broker.connect():
print("Connected to broker")
# Get account info
account = broker.get_account_info()
print(f"Account equity: ${account.equity}")
Strategy Development
Basic Strategy Structure
StrateQueue strategies are based on the backtesting.py framework:
from backtesting import Strategy
from backtesting.lib import crossover
from backtesting.test import SMA
class MyStrategy(Strategy):
# Strategy parameters
fast_period = 10
slow_period = 20
def init(self):
"""Initialize indicators"""
close = self.data.Close
self.fast_sma = self.I(SMA, close, self.fast_period)
self.slow_sma = self.I(SMA, close, self.slow_period)
def next(self):
"""Execute on each bar"""
# Buy signal: fast SMA crosses above slow SMA
if crossover(self.fast_sma, self.slow_sma):
if not self.position:
self.buy(size=0.5) # Buy with 50% of equity
# Sell signal: fast SMA crosses below slow SMA
elif crossover(self.slow_sma, self.fast_sma):
if self.position:
self.position.close()
Loading Strategies
from StrateQueue import StrategyLoader
# Load strategy from file
strategy_class = StrategyLoader.load_strategy_from_file("my_strategy.py")
# Convert to signal-generating strategy for live trading
signal_strategy = StrategyLoader.convert_to_signal_strategy(strategy_class)
Live Trading System
Basic Live Trading Setup
from StrateQueue import LiveTradingSystem
async def run_live_trading():
system = LiveTradingSystem(
strategy_path="strategies/sma_cross.py",
symbols=["AAPL", "MSFT", "GOOGL"],
data_source="polygon", # or "demo" for testing
granularity="5m",
enable_trading=True,
paper_trading=True, # Set to False for live trading
broker_type="alpaca"
)
# Run the trading system
await system.run_live_system()
# Run the system
import asyncio
asyncio.run(run_live_trading())
Advanced Configuration
from StrateQueue import LiveTradingSystem
from StrateQueue.core.position_sizer import FixedPercentSizer
system = LiveTradingSystem(
strategy_path="strategies/advanced_strategy.py",
symbols=["AAPL", "MSFT", "GOOGL", "TSLA"],
data_source="polygon",
granularity="1m",
lookback_override=100, # Override default lookback period
enable_trading=True,
paper_trading=False, # Live trading
broker_type="alpaca",
position_sizer=FixedPercentSizer(0.25) # 25% per position
)
Multi-Strategy Trading
Configuration File
Create a strategies.txt
file:
# Strategy configuration file
# Format: strategy_path,allocation_percentage,symbols
strategies/sma_cross.py,0.4,AAPL,MSFT
strategies/rsi_strategy.py,0.3,GOOGL,TSLA
strategies/momentum.py,0.3,SPY,QQQ
Multi-Strategy System
from StrateQueue import LiveTradingSystem
async def run_multi_strategy():
system = LiveTradingSystem(
multi_strategy_config="strategies.txt",
symbols=["AAPL", "MSFT", "GOOGL", "TSLA", "SPY", "QQQ"],
data_source="polygon",
granularity="5m",
enable_trading=True,
paper_trading=True
)
await system.run_live_system()
asyncio.run(run_multi_strategy())
Direct Multi-Strategy Runner
from StrateQueue.multi_strategy import MultiStrategyRunner
async def advanced_multi_strategy():
runner = MultiStrategyRunner(
config_file_path="strategies.txt",
symbols=["AAPL", "MSFT", "GOOGL"],
lookback_override=200
)
# Initialize strategies
runner.initialize_strategies()
# Generate signals for a symbol
signals = await runner.generate_signals("AAPL", historical_data)
for strategy_id, signal in signals.items():
print(f"Strategy {strategy_id}: {signal.signal}")
asyncio.run(advanced_multi_strategy())
Signal Processing
Signal Types
from StrateQueue.core.signal_extractor import SignalType, TradingSignal
import pandas as pd
# Create trading signals
signal = TradingSignal(
signal=SignalType.BUY,
price=150.0,
timestamp=pd.Timestamp.now(),
indicators={"sma_fast": 149.5, "sma_slow": 148.0},
size=0.5, # 50% of equity
time_in_force="day"
)
# Advanced order types
limit_signal = TradingSignal(
signal=SignalType.LIMIT_BUY,
price=150.0,
timestamp=pd.Timestamp.now(),
indicators={},
size=0.3,
limit_price=149.0,
time_in_force="gtc"
)
# Bracket orders (with stop-loss and take-profit)
bracket_signal = TradingSignal(
signal=SignalType.BUY,
price=150.0,
timestamp=pd.Timestamp.now(),
indicators={},
size=0.4,
metadata={
"sl": 145.0, # Stop-loss
"tp": 160.0 # Take-profit
}
)
Custom Signal Extractor
from StrateQueue.core.signal_extractor import SignalExtractorStrategy, SignalType
class CustomSignalStrategy(SignalExtractorStrategy):
def init(self):
# Initialize your indicators
pass
def next(self):
# Your trading logic
if some_condition:
self.set_signal(
SignalType.BUY,
size=0.5,
metadata={"confidence": 0.8}
)
else:
self.set_signal(SignalType.HOLD)
Configuration
System Configuration
from StrateQueue.utils.system_config import load_config, DataConfig, TradingConfig
# Load configuration from files
data_config, trading_config = load_config()
# Create custom configuration
data_config = DataConfig(
default_granularity="5m",
default_lookback=100,
polygon_api_key="your_key"
)
trading_config = TradingConfig(
default_position_size=0.25,
max_positions=4,
risk_per_trade=0.02
)
Environment Variables
# Data provider credentials
export POLYGON_API_KEY="your_polygon_api_key"
export CMC_API_KEY="your_cmc_api_key" # CoinMarketCap
export DATA_GRANULARITY="1m"
# Broker credentials
export ALPACA_API_KEY="your_alpaca_api_key"
export ALPACA_SECRET_KEY="your_alpaca_secret_key"
export ALPACA_BASE_URL="https://paper-api.alpaca.markets" # For paper trading
# IBKR credentials
export IBKR_HOST="127.0.0.1"
export IBKR_PORT="7497"
export IBKR_CLIENT_ID="1"
# CCXT credentials (example for Binance)
export CCXT_EXCHANGE="binance"
export CCXT_API_KEY="your_binance_api_key"
export CCXT_SECRET="your_binance_secret"
export CCXT_SANDBOX="true" # For paper trading
Examples
Complete Trading Bot
import asyncio
import logging
from StrateQueue import LiveTradingSystem
# Configure logging
logging.basicConfig(level=logging.INFO)
async def main():
# Create trading system
system = LiveTradingSystem(
strategy_path="strategies/my_strategy.py",
symbols=["AAPL", "MSFT", "GOOGL"],
data_source="demo", # Use "polygon" for real data
granularity="5m",
enable_trading=True,
paper_trading=True, # Safe for testing
broker_type="alpaca"
)
try:
# Run the trading system
await system.run_live_system()
except KeyboardInterrupt:
print("Shutting down trading system...")
except Exception as e:
print(f"Error: {e}")
if __name__ == "__main__":
asyncio.run(main())
Data Analysis Script
import asyncio
from StrateQueue.data import auto_create_provider
async def analyze_data():
# Create data provider
provider = auto_create_provider(granularity="1h")
# Fetch data for multiple symbols
symbols = ["AAPL", "MSFT", "GOOGL", "TSLA"]
for symbol in symbols:
data = await provider.fetch_historical_data(
symbol=symbol,
days_back=30,
granularity="1h"
)
# Calculate simple statistics
returns = data['Close'].pct_change().dropna()
volatility = returns.std() * (252 ** 0.5) # Annualized
print(f"{symbol}:")
print(f" Current Price: ${data['Close'].iloc[-1]:.2f}")
print(f" 30-day Volatility: {volatility:.2%}")
print(f" 30-day Return: {(data['Close'].iloc[-1] / data['Close'].iloc[0] - 1):.2%}")
print()
asyncio.run(analyze_data())
Strategy Backtesting
from StrateQueue.engines import EngineFactory
from StrateQueue import StrategyLoader
import pandas as pd
# Load strategy
strategy_class = StrategyLoader.load_strategy_from_file("strategies/sma_cross.py")
# Create engine
engine = EngineFactory.create_engine("backtesting")
# Load data (you can use your own CSV or fetch from provider)
data = pd.read_csv("data/AAPL.csv", index_col=0, parse_dates=True)
# Run backtest
results = engine.run_backtest(
strategy_class=strategy_class,
data=data,
cash=100000,
commission=0.002
)
print(f"Final Portfolio Value: ${results['End']:.2f}")
print(f"Total Return: {results['Return [%]']:.2f}%")
print(f"Sharpe Ratio: {results['Sharpe Ratio']:.2f}")
Custom Broker Integration
from StrateQueue.brokers import BaseBroker, BrokerConfig, OrderResult
from StrateQueue.core.signal_extractor import TradingSignal
class MyCustomBroker(BaseBroker):
def __init__(self, config: BrokerConfig):
super().__init__(config)
# Initialize your broker connection
def connect(self) -> bool:
# Implement connection logic
return True
def execute_signal(self, symbol: str, signal: TradingSignal) -> OrderResult:
# Implement order execution
return OrderResult(
success=True,
order_id="12345",
message="Order placed successfully"
)
def get_account_info(self):
# Return account information
pass
# Note: Direct registration is not available in current version
# Custom brokers need to be integrated through the factory pattern
# Contact maintainers for adding new broker integrations
Error Handling
import asyncio
import logging
from StrateQueue import LiveTradingSystem
from StrateQueue.brokers import BrokerConnectionError
from StrateQueue.data import DataProviderError
async def robust_trading_system():
try:
system = LiveTradingSystem(
strategy_path="strategies/my_strategy.py",
symbols=["AAPL"],
data_source="polygon",
enable_trading=True,
paper_trading=True
)
await system.run_live_system()
except BrokerConnectionError as e:
logging.error(f"Broker connection failed: {e}")
except DataProviderError as e:
logging.error(f"Data provider error: {e}")
except FileNotFoundError as e:
logging.error(f"Strategy file not found: {e}")
except Exception as e:
logging.error(f"Unexpected error: {e}")
asyncio.run(robust_trading_system())
Best Practices
- Always test with paper trading first
- Use proper error handling and logging
- Validate your strategies with backtesting
- Monitor your system's performance
- Use appropriate position sizing
- Keep your API keys secure
- Test with demo data before using real market data
- Be aware that async context is required for most operations
Common Pitfalls
- Event Loop Required: Most StrateQueue operations require an async context (asyncio event loop)
- Method Names: Use
run_live_system()
notrun()
for LiveTradingSystem - Strategy Path Required:
auto_create_engine()
requires a strategy file path for detection - Credentials Structure: Use the
credentials
dict inBrokerConfig
, not direct parameters - Provider Availability: Not all data providers support real-time subscriptions
API Reference Summary
Main Classes
LiveTradingSystem
: Main orchestrator for live tradingMultiStrategyRunner
: Coordinates multiple strategiesStrategyLoader
: Loads and converts strategiesDataProviderFactory
: Creates data providersBrokerFactory
: Creates broker connectionsEngineFactory
: Creates backtesting engines
Key Methods
LiveTradingSystem.run_live_system()
: Start the trading systemMultiStrategyRunner.generate_signals()
: Generate signals from all strategiesStrategyLoader.load_strategy_from_file()
: Load strategy from Python fileDataProviderFactory.create_provider()
: Create data providerBrokerFactory.create_broker()
: Create broker connection
This API documentation provides a comprehensive guide to using StrateQueue programmatically. The system is designed to be modular and extensible, allowing you to customize every aspect of your trading system.