# π Tektii Strategy SDK
<div align="center">
[](https://www.python.org/downloads/)
[](LICENSE)
[](https://github.com/tektii/tektii-strategy-sdk-python/actions)
[](https://github.com/psf/black)
[](https://docs.tektii.com)
**Build, validate, and deploy containerized trading strategies with confidence**
[π Quick Start](#-quick-start) β’ [π Documentation](https://docs.tektii.com) β’ [π¬ Community](https://github.com/tektii/tektii-strategy-sdk/discussions) β’ [π Report Bug](https://github.com/tektii/tektii-strategy-sdk/issues)
</div>
---
## π Table of Contents
- [β¨ Features](#-features)
- [π§ Prerequisites](#-prerequisites)
- [π¦ Installation](#-installation)
- [π Quick Start](#-quick-start)
- [π How It Works](#-how-it-works)
- [β
Strategy Validation](#-strategy-validation)
- [π― Strategy Development](#-strategy-development)
- [π Simulated APIs](#-simulated-apis)
- [π‘ Best Practices](#-best-practices)
- [π οΈ Development Setup](#οΈ-development-setup)
- [π§ͺ Testing](#-testing)
- [π’ Deployment](#-deployment)
- [π§ Troubleshooting](#-troubleshooting)
- [π€ Contributing](#-contributing)
- [π Support](#-support)
- [πΊοΈ Roadmap](#οΈ-roadmap)
- [π License](#-license)
## β¨ Features
- **ποΈ Event-driven Architecture**: Synchronous event processing with guaranteed order execution
- **π Simulated Trading APIs**: Built-in support for popular trading APIs (IB, MetaTrader, Alpaca - coming soon)
- **π‘οΈ Type Safety**: Full type hints and Pydantic models for configuration
- **π§© Flexible Strategy Development**: Easy-to-use base classes for custom strategies
- **π Multi-asset Support**: Trade across multiple instruments within a single strategy
- **β
Built-in Validation**: Comprehensive validation system to ensure strategies are production-ready
- **π³ Docker Support**: Containerized deployment for consistent execution
- **π Performance Monitoring**: Track strategy performance and metrics
## π§ Prerequisites
Before you begin, ensure you have:
- **Python 3.8+** π
- **pip** package manager π¦
- **make** (optional, but recommended) π οΈ
- **Docker** ((or similar) for containerized deployment) π³
## π¦ Installation
### Quick Install
```bash
pip install tektii-strategy-sdk
```
### Development Install
For contributing or modifying the SDK:
```bash
git clone https://github.com/tektii/tektii-strategy-sdk-python.git
cd tektii-strategy-sdk
make setup
```
## π Quick Start
### Step 1: Create Your First Strategy
```python
from tektii_sdk import Strategy, StrategyConfig
from tektii_sdk.strategy import MarketData
class MyFirstStrategy(Strategy):
"""A simple moving average crossover strategy"""
def on_start(self):
"""Initialize your strategy"""
self.log("π Strategy started!")
self.prices = []
self.ma_period = self.config.parameters.get("ma_period", 20)
def on_market_data(self, data: MarketData):
"""Process incoming market data"""
self.prices.append(data.last)
if len(self.prices) > self.ma_period:
self.prices.pop(0)
ma = sum(self.prices) / len(self.prices)
if data.last > ma * 1.02: # 2% above MA
self.buy(data.symbol, 10)
elif data.last < ma * 0.98: # 2% below MA
self.sell(data.symbol, 10)
```
### Step 2: Validate Your Strategy β
**Always validate before deployment!**
```bash
# Basic validation
tektii validate my_strategy.py MyFirstStrategy
# Validate with custom configuration
tektii validate my_strategy.py MyFirstStrategy --config config.json
# Get detailed validation report
tektii validate my_strategy.py MyFirstStrategy --verbose
```
### Step 3: Deploy to Tektii Platform π
```bash
# Set up credentials
export TEKTII_API_KEY="your-api-key"
export TEKTII_STRATEGY_ID="your-strategy-id"
# Push your strategy
tektii push my_strategy.py MyFirstStrategy
# Or save credentials for future use
tektii push my_strategy.py MyFirstStrategy --save-config
```
## π How It Works
<div align="center">
```mermaid
graph LR
A[π Write Strategy] --> B[β
Validate]
B --> C[π§ͺ Test Locally]
C --> D[π³ Containerize]
D --> E[π Deploy to Tektii]
E --> F[π Monitor Performance]
style B fill:#90EE90
```
</div>
1. **Write** your strategy extending the base `Strategy` class
2. **Validate** using the built-in validator to ensure compatibility
3. **Deploy** to the Tektii platform for backtesting
4. **Monitor** performance and adjust parameters
## β
Strategy Validation
The SDK includes a **comprehensive validation system** that checks your strategy before deployment:
### What Gets Validated?
#### ποΈ Structure Checks
- β Correct inheritance from `Strategy` base class
- β Implementation of required methods (`on_start`, `on_market_data`)
- β Proper method signatures
#### β‘ Runtime Checks
- β Strategy instantiation
- β Initialization without errors
- β Market data processing
- β Order placement functionality
#### π Quality Checks
- β Error handling capabilities
- β Performance characteristics (events/second)
- β Memory usage patterns
- β Input data validation
### Validation Output Example
```
β
Strategy validation PASSED
Performance Metrics:
β’ Events per second: 125
β’ Memory usage: 12.3 MB
β’ Initialization time: 0.03s
Warnings:
β οΈ Consider adding error handling for network failures
Strategy Details:
β’ Name: MyFirstStrategy
β’ Version: 1.0.0
β’ Compatible: β
```
### Common Validation Errors and Solutions
<details>
<summary>β "Does not inherit from Strategy"</summary>
```python
# Wrong
class MyStrategy:
pass
# Correct β
from tektii_sdk import Strategy
class MyStrategy(Strategy):
pass
```
</details>
<details>
<summary>β "on_market_data is not implemented"</summary>
```python
# Wrong
class MyStrategy(Strategy):
def on_start(self):
pass
# Correct β
class MyStrategy(Strategy):
def on_start(self):
pass
def on_market_data(self, data):
# Process market data
pass
```
</details>
<details>
<summary>β "Failed to initialize strategy"</summary>
```python
# Wrong - KeyError if parameter missing
def __init__(self, config):
super().__init__(config)
self.threshold = config.parameters["threshold"]
# Correct β - Handle missing parameters
def __init__(self, config):
super().__init__(config)
self.threshold = config.parameters.get("threshold", 100.0)
```
</details>
## π― Strategy Development
### Available Event Handlers
```python
class AdvancedStrategy(Strategy):
def on_start(self):
"""Called once when strategy starts"""
self.initialize_indicators()
def on_market_data(self, data: MarketData):
"""Called for each market data update"""
self.update_indicators(data)
self.check_signals(data)
def on_order_update(self, order):
"""Called when order status changes"""
self.log(f"Order {order.id}: {order.status}")
def on_position_update(self, position):
"""Called when position changes"""
self.track_pnl(position)
def on_stop(self):
"""Called when strategy stops"""
self.cleanup()
```
### State Management
```python
class StatefulStrategy(Strategy):
def on_start(self):
# Initialize state
self.positions = {}
self.pending_orders = set()
self.indicators = {
'rsi': deque(maxlen=14),
'ma_fast': deque(maxlen=10),
'ma_slow': deque(maxlen=30)
}
self.daily_pnl = 0.0
```
## π Simulated APIs
### Interactive Brokers (IB) Style API
```python
from tektii_sdk.apis import SimulatedIB
from tektii_sdk.apis.ib import Contract, IBOrder
class IBStrategy(Strategy):
def __init__(self, config, ib_api):
super().__init__(config)
self.ib = ib_api
# Register IB-style callbacks
self.ib.pendingTickersEvent(self.on_tickers)
self.ib.orderStatusEvent(self.on_order_status)
def on_start(self):
self.ib.connect()
# Subscribe to market data
for symbol in self.config.symbols:
contract = Contract(symbol=symbol)
self.ib.reqMktData(contract)
def on_tickers(self, tickers):
for ticker in tickers:
if self.should_buy(ticker):
contract = ticker['contract']
order = IBOrder.marketOrder("BUY", 10)
self.ib.placeOrder(contract, order)
```
### Coming Soon π§
- MetaTrader API
- Alpaca API
- Custom API adapters
## π‘ Best Practices
### 1. Robust Error Handling
```python
def on_market_data(self, data: MarketData):
try:
self.process_tick(data)
except Exception as e:
self.log(f"Error processing tick: {e}", level="error")
# Don't let errors crash the strategy
self.handle_error(e)
```
### 2. Parameter Validation
```python
def on_start(self):
# Validate parameters with defaults
self.lookback = self.config.parameters.get("lookback", 20)
if self.lookback < 2:
raise ValueError("Lookback period must be at least 2")
self.position_size = self.config.parameters.get("position_size", 100)
if self.position_size <= 0:
raise ValueError("Position size must be positive")
```
### 3. Efficient Data Structures
```python
from collections import deque
def on_start(self):
# Use deque for sliding windows
self.price_window = deque(maxlen=self.lookback)
self.volume_window = deque(maxlen=self.lookback)
# Pre-allocate arrays for performance
self.signals = np.zeros(1000)
```
### 4. Logging and Monitoring
```python
def on_market_data(self, data: MarketData):
# Log important events
if self.should_trade(data):
self.log(f"Signal detected for {data.symbol} at {data.last}")
# Track metrics
self.metrics['ticks_processed'] += 1
if self.metrics['ticks_processed'] % 1000 == 0:
self.log(f"Processed {self.metrics['ticks_processed']} ticks")
```
## π οΈ Development Setup
### Option 1: Automated Setup (Recommended) π
```bash
git clone https://github.com/tektii/tektii-strategy-sdk.git
cd tektii-strategy-sdk
make setup # Complete setup for first-time users
# OR
make setup-dev # Setup with development dependencies
```
### Option 2: Manual Setup π
<details>
<summary>Click to expand manual setup instructions</summary>
```bash
# Create virtual environment
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
# Install dependencies
pip install -r requirements.txt
pip install grpcio-tools
# Pull and generate proto files
python proto/pull_proto.py
python -m grpc_tools.protoc -Iproto --python_out=tektii_sdk/proto --grpc_python_out=tektii_sdk/proto proto/strategy.proto
# Fix imports
sed -i 's/import strategy_pb2/from . import strategy_pb2/' tektii_sdk/proto/*_grpc.py
# Install package in development mode
pip install -e .
```
</details>
### Verify Installation β
```bash
# Run tests
pytest tests/
# Check CLI
tektii --help
# Validate example strategy
tektii validate examples/simple_ma_strategy.py SimpleMAStrategy
# Push example strategy (requires API credentials)
tektii push examples/simple_ma_strategy.py SimpleMAStrategy
```
## π§ͺ Testing
### Unit Testing Your Strategy
```python
# tests/test_my_strategy.py
import pytest
from my_strategy import MyStrategy
from tektii_sdk import StrategyConfig
from tektii_sdk.testing import StrategyTester
def test_strategy_initialization():
config = StrategyConfig(
name="TestStrategy",
symbols=["TEST-USD"],
initial_capital=10000
)
strategy = MyStrategy(config)
assert strategy.config.initial_capital == 10000
def test_strategy_signals():
tester = StrategyTester(MyStrategy)
tester.feed_data([
{"symbol": "TEST-USD", "last": 100},
{"symbol": "TEST-USD", "last": 110},
])
assert len(tester.get_orders()) > 0
```
### Running Tests
```bash
# Run all tests
make test
# Run with coverage
make test-coverage
# Run specific test
pytest tests/test_my_strategy.py::test_strategy_signals -v
```
## π’ Deployment
Deploy your strategies to the Tektii platform with the `tektii push` command.
### Prerequisites
- Docker installed and running
- Tektii account with API key
- Strategy ID from the Tektii web console
### Configuration
Set up your credentials using environment variables or a config file:
```bash
# Option 1: Environment variables
export TEKTII_API_KEY="your-api-key"
export TEKTII_STRATEGY_ID="your-strategy-id"
# Option 2: Config file (~/.tektii/config.json)
{
"api_key": "your-api-key",
"strategy_id": "your-strategy-id"
}
```
### Pushing Your Strategy
```bash
# Basic push
tektii push my_strategy.py MyStrategy
# Push and save configuration
tektii push my_strategy.py MyStrategy --save-config
### What Happens During Push
1. **Validation** - Strategy is validated locally
2. **Git SHA** - Current commit SHA is captured (if in Git repo)
3. **Version Creation** - New version created via API
4. **Docker Build** - Container image built (creates Dockerfile if needed)
5. **Registry Push** - Image pushed to private registry
6. **Ready** - Strategy available for backtesting
### Docker Support
If no Dockerfile exists, a default one is created with:
- Python 3.11 slim base image
- Non-root user for security
- Automatic dependency installation
- Platform optimization (linux/amd64)
## π§ Troubleshooting
### Common Issues and Solutions
<details>
<summary>π ModuleNotFoundError: No module named 'grpc_tools'</summary>
```bash
pip install grpcio-tools
```
</details>
<details>
<summary>π Import errors with proto files</summary>
```bash
make clean
make proto
# OR manually:
python -m grpc_tools.protoc -Iproto --python_out=tektii_sdk/proto --grpc_python_out=tektii_sdk/proto proto/strategy.proto
```
</details>
<details>
<summary>π Strategy validation fails</summary>
1. Check inheritance: `class MyStrategy(Strategy)`
2. Implement required methods: `on_start()` and `on_market_data()`
3. Handle missing parameters with defaults
4. Run with `--verbose` for detailed error messages
</details>
<details>
<summary>π Permission errors on Unix/Linux</summary>
```bash
chmod +x setup.sh
sudo make install # If installing globally
```
</details>
<details>
<summary>π Docker not found during push</summary>
```bash
# Install Docker: https://docs.docker.com/get-docker/
# Ensure Docker daemon is running
docker --version
```
</details>
<details>
<summary>π Authentication failed during push</summary>
1. Verify API key is correct
2. Check if key has expired
3. Ensure strategy ID matches one in web console
</details>
## π€ Contributing
We love contributions! π Please see our [Contributing Guide](CONTRIBUTING.md) for details.
1. Fork the repository
2. Create a feature branch (`git checkout -b feature/amazing-feature`)
3. Commit your changes (`git commit -m 'β¨ Add amazing feature'`)
4. Push to the branch (`git push origin feature/amazing-feature`)
5. Open a Pull Request
### Development Commands
```bash
make format # Format code with black
make lint # Run linting checks
make test # Run test suite
```
## π Support
Need help? We're here for you!
- π **Documentation**: [docs.tektii.com](https://docs.tektii.com)
- π¬ **Discussions**: [GitHub Discussions](https://github.com/tektii/tektii-strategy-sdk/discussions)
- π **Issues**: [GitHub Issues](https://github.com/tektii/tektii-strategy-sdk/issues)
- π§ **Email**: support@tektii.com
- π° **Trading Community**: [Discord](https://discord.gg/tektii)
## π License
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
---
<div align="center">
**Built with β€οΈ by the Tektii Team**
[π Star us on GitHub](https://github.com/tektii/tektii-strategy-sdk) β’ [π¦ Follow on Twitter](https://twitter.com/tektii) β’ [π’ Visit tektii.com](https://tektii.com)
</div>
Raw data
{
"_id": null,
"home_page": null,
"name": "tektii-strategy-sdk",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": "Tektii Team <support@tektii.com>",
"keywords": "trading, backtesting, strategy, quantitative-finance, algorithmic-trading, grpc, simulation",
"author": null,
"author_email": "Tektii Team <support@tektii.com>",
"download_url": "https://files.pythonhosted.org/packages/87/83/ac0701fd2eb0eff972eff25dadefb2ef476d3dacee815cb2663104cdaad2/tektii_strategy_sdk-0.4.2.tar.gz",
"platform": null,
"description": "# \ud83d\ude80 Tektii Strategy SDK\n\n<div align=\"center\">\n\n[](https://www.python.org/downloads/)\n[](LICENSE)\n[](https://github.com/tektii/tektii-strategy-sdk-python/actions)\n[](https://github.com/psf/black)\n[](https://docs.tektii.com)\n\n**Build, validate, and deploy containerized trading strategies with confidence**\n\n[\ud83c\udfc1 Quick Start](#-quick-start) \u2022 [\ud83d\udcd6 Documentation](https://docs.tektii.com) \u2022 [\ud83d\udcac Community](https://github.com/tektii/tektii-strategy-sdk/discussions) \u2022 [\ud83d\udc1b Report Bug](https://github.com/tektii/tektii-strategy-sdk/issues)\n\n</div>\n\n---\n\n## \ud83d\udccb Table of Contents\n\n- [\u2728 Features](#-features)\n- [\ud83d\udd27 Prerequisites](#-prerequisites)\n- [\ud83d\udce6 Installation](#-installation)\n- [\ud83c\udfc1 Quick Start](#-quick-start)\n- [\ud83d\udd0d How It Works](#-how-it-works)\n- [\u2705 Strategy Validation](#-strategy-validation)\n- [\ud83c\udfaf Strategy Development](#-strategy-development)\n- [\ud83d\udd0c Simulated APIs](#-simulated-apis)\n- [\ud83d\udca1 Best Practices](#-best-practices)\n- [\ud83d\udee0\ufe0f Development Setup](#\ufe0f-development-setup)\n- [\ud83e\uddea Testing](#-testing)\n- [\ud83d\udea2 Deployment](#-deployment)\n- [\ud83d\udd27 Troubleshooting](#-troubleshooting)\n- [\ud83e\udd1d Contributing](#-contributing)\n- [\ud83d\udcde Support](#-support)\n- [\ud83d\uddfa\ufe0f Roadmap](#\ufe0f-roadmap)\n- [\ud83d\udcc4 License](#-license)\n\n## \u2728 Features\n\n- **\ud83c\udfd7\ufe0f Event-driven Architecture**: Synchronous event processing with guaranteed order execution\n- **\ud83d\udd04 Simulated Trading APIs**: Built-in support for popular trading APIs (IB, MetaTrader, Alpaca - coming soon)\n- **\ud83d\udee1\ufe0f Type Safety**: Full type hints and Pydantic models for configuration\n- **\ud83e\udde9 Flexible Strategy Development**: Easy-to-use base classes for custom strategies\n- **\ud83d\udcca Multi-asset Support**: Trade across multiple instruments within a single strategy\n- **\u2705 Built-in Validation**: Comprehensive validation system to ensure strategies are production-ready\n- **\ud83d\udc33 Docker Support**: Containerized deployment for consistent execution\n- **\ud83d\udcc8 Performance Monitoring**: Track strategy performance and metrics\n\n## \ud83d\udd27 Prerequisites\n\nBefore you begin, ensure you have:\n\n- **Python 3.8+** \ud83d\udc0d\n- **pip** package manager \ud83d\udce6\n- **make** (optional, but recommended) \ud83d\udee0\ufe0f\n- **Docker** ((or similar) for containerized deployment) \ud83d\udc33\n\n## \ud83d\udce6 Installation\n\n### Quick Install\n\n```bash\npip install tektii-strategy-sdk\n```\n\n### Development Install\n\nFor contributing or modifying the SDK:\n\n```bash\ngit clone https://github.com/tektii/tektii-strategy-sdk-python.git\ncd tektii-strategy-sdk\nmake setup\n```\n\n## \ud83c\udfc1 Quick Start\n\n### Step 1: Create Your First Strategy\n\n```python\nfrom tektii_sdk import Strategy, StrategyConfig\nfrom tektii_sdk.strategy import MarketData\n\nclass MyFirstStrategy(Strategy):\n \"\"\"A simple moving average crossover strategy\"\"\"\n\n def on_start(self):\n \"\"\"Initialize your strategy\"\"\"\n self.log(\"\ud83d\ude80 Strategy started!\")\n self.prices = []\n self.ma_period = self.config.parameters.get(\"ma_period\", 20)\n\n def on_market_data(self, data: MarketData):\n \"\"\"Process incoming market data\"\"\"\n self.prices.append(data.last)\n\n if len(self.prices) > self.ma_period:\n self.prices.pop(0)\n ma = sum(self.prices) / len(self.prices)\n\n if data.last > ma * 1.02: # 2% above MA\n self.buy(data.symbol, 10)\n elif data.last < ma * 0.98: # 2% below MA\n self.sell(data.symbol, 10)\n```\n\n### Step 2: Validate Your Strategy \u2705\n\n**Always validate before deployment!**\n\n```bash\n# Basic validation\ntektii validate my_strategy.py MyFirstStrategy\n\n# Validate with custom configuration\ntektii validate my_strategy.py MyFirstStrategy --config config.json\n\n# Get detailed validation report\ntektii validate my_strategy.py MyFirstStrategy --verbose\n```\n\n### Step 3: Deploy to Tektii Platform \ud83d\ude80\n\n```bash\n# Set up credentials\nexport TEKTII_API_KEY=\"your-api-key\"\nexport TEKTII_STRATEGY_ID=\"your-strategy-id\"\n\n# Push your strategy\ntektii push my_strategy.py MyFirstStrategy\n\n# Or save credentials for future use\ntektii push my_strategy.py MyFirstStrategy --save-config\n```\n\n## \ud83d\udd0d How It Works\n\n<div align=\"center\">\n\n```mermaid\ngraph LR\n A[\ud83d\udcdd Write Strategy] --> B[\u2705 Validate]\n B --> C[\ud83e\uddea Test Locally]\n C --> D[\ud83d\udc33 Containerize]\n D --> E[\ud83d\ude80 Deploy to Tektii]\n E --> F[\ud83d\udcca Monitor Performance]\n\n style B fill:#90EE90\n```\n\n</div>\n\n1. **Write** your strategy extending the base `Strategy` class\n2. **Validate** using the built-in validator to ensure compatibility\n3. **Deploy** to the Tektii platform for backtesting\n4. **Monitor** performance and adjust parameters\n\n## \u2705 Strategy Validation\n\nThe SDK includes a **comprehensive validation system** that checks your strategy before deployment:\n\n### What Gets Validated?\n\n#### \ud83c\udfd7\ufe0f Structure Checks\n- \u2713 Correct inheritance from `Strategy` base class\n- \u2713 Implementation of required methods (`on_start`, `on_market_data`)\n- \u2713 Proper method signatures\n\n#### \u26a1 Runtime Checks\n- \u2713 Strategy instantiation\n- \u2713 Initialization without errors\n- \u2713 Market data processing\n- \u2713 Order placement functionality\n\n#### \ud83d\udcca Quality Checks\n- \u2713 Error handling capabilities\n- \u2713 Performance characteristics (events/second)\n- \u2713 Memory usage patterns\n- \u2713 Input data validation\n\n### Validation Output Example\n\n```\n\u2705 Strategy validation PASSED\n\nPerformance Metrics:\n \u2022 Events per second: 125\n \u2022 Memory usage: 12.3 MB\n \u2022 Initialization time: 0.03s\n\nWarnings:\n \u26a0\ufe0f Consider adding error handling for network failures\n\nStrategy Details:\n \u2022 Name: MyFirstStrategy\n \u2022 Version: 1.0.0\n \u2022 Compatible: \u2713\n```\n\n### Common Validation Errors and Solutions\n\n<details>\n<summary>\u274c \"Does not inherit from Strategy\"</summary>\n\n```python\n# Wrong\nclass MyStrategy:\n pass\n\n# Correct \u2713\nfrom tektii_sdk import Strategy\n\nclass MyStrategy(Strategy):\n pass\n```\n</details>\n\n<details>\n<summary>\u274c \"on_market_data is not implemented\"</summary>\n\n```python\n# Wrong\nclass MyStrategy(Strategy):\n def on_start(self):\n pass\n\n# Correct \u2713\nclass MyStrategy(Strategy):\n def on_start(self):\n pass\n\n def on_market_data(self, data):\n # Process market data\n pass\n```\n</details>\n\n<details>\n<summary>\u274c \"Failed to initialize strategy\"</summary>\n\n```python\n# Wrong - KeyError if parameter missing\ndef __init__(self, config):\n super().__init__(config)\n self.threshold = config.parameters[\"threshold\"]\n\n# Correct \u2713 - Handle missing parameters\ndef __init__(self, config):\n super().__init__(config)\n self.threshold = config.parameters.get(\"threshold\", 100.0)\n```\n</details>\n\n## \ud83c\udfaf Strategy Development\n\n### Available Event Handlers\n\n```python\nclass AdvancedStrategy(Strategy):\n def on_start(self):\n \"\"\"Called once when strategy starts\"\"\"\n self.initialize_indicators()\n\n def on_market_data(self, data: MarketData):\n \"\"\"Called for each market data update\"\"\"\n self.update_indicators(data)\n self.check_signals(data)\n\n def on_order_update(self, order):\n \"\"\"Called when order status changes\"\"\"\n self.log(f\"Order {order.id}: {order.status}\")\n\n def on_position_update(self, position):\n \"\"\"Called when position changes\"\"\"\n self.track_pnl(position)\n\n def on_stop(self):\n \"\"\"Called when strategy stops\"\"\"\n self.cleanup()\n```\n\n### State Management\n\n```python\nclass StatefulStrategy(Strategy):\n def on_start(self):\n # Initialize state\n self.positions = {}\n self.pending_orders = set()\n self.indicators = {\n 'rsi': deque(maxlen=14),\n 'ma_fast': deque(maxlen=10),\n 'ma_slow': deque(maxlen=30)\n }\n self.daily_pnl = 0.0\n```\n\n## \ud83d\udd0c Simulated APIs\n\n### Interactive Brokers (IB) Style API\n\n```python\nfrom tektii_sdk.apis import SimulatedIB\nfrom tektii_sdk.apis.ib import Contract, IBOrder\n\nclass IBStrategy(Strategy):\n def __init__(self, config, ib_api):\n super().__init__(config)\n self.ib = ib_api\n\n # Register IB-style callbacks\n self.ib.pendingTickersEvent(self.on_tickers)\n self.ib.orderStatusEvent(self.on_order_status)\n\n def on_start(self):\n self.ib.connect()\n\n # Subscribe to market data\n for symbol in self.config.symbols:\n contract = Contract(symbol=symbol)\n self.ib.reqMktData(contract)\n\n def on_tickers(self, tickers):\n for ticker in tickers:\n if self.should_buy(ticker):\n contract = ticker['contract']\n order = IBOrder.marketOrder(\"BUY\", 10)\n self.ib.placeOrder(contract, order)\n```\n\n### Coming Soon \ud83d\udea7\n- MetaTrader API\n- Alpaca API\n- Custom API adapters\n\n## \ud83d\udca1 Best Practices\n\n### 1. Robust Error Handling\n\n```python\ndef on_market_data(self, data: MarketData):\n try:\n self.process_tick(data)\n except Exception as e:\n self.log(f\"Error processing tick: {e}\", level=\"error\")\n # Don't let errors crash the strategy\n self.handle_error(e)\n```\n\n### 2. Parameter Validation\n\n```python\ndef on_start(self):\n # Validate parameters with defaults\n self.lookback = self.config.parameters.get(\"lookback\", 20)\n if self.lookback < 2:\n raise ValueError(\"Lookback period must be at least 2\")\n\n self.position_size = self.config.parameters.get(\"position_size\", 100)\n if self.position_size <= 0:\n raise ValueError(\"Position size must be positive\")\n```\n\n### 3. Efficient Data Structures\n\n```python\nfrom collections import deque\n\ndef on_start(self):\n # Use deque for sliding windows\n self.price_window = deque(maxlen=self.lookback)\n self.volume_window = deque(maxlen=self.lookback)\n\n # Pre-allocate arrays for performance\n self.signals = np.zeros(1000)\n```\n\n### 4. Logging and Monitoring\n\n```python\ndef on_market_data(self, data: MarketData):\n # Log important events\n if self.should_trade(data):\n self.log(f\"Signal detected for {data.symbol} at {data.last}\")\n\n # Track metrics\n self.metrics['ticks_processed'] += 1\n if self.metrics['ticks_processed'] % 1000 == 0:\n self.log(f\"Processed {self.metrics['ticks_processed']} ticks\")\n```\n\n## \ud83d\udee0\ufe0f Development Setup\n\n### Option 1: Automated Setup (Recommended) \ud83d\ude80\n\n```bash\ngit clone https://github.com/tektii/tektii-strategy-sdk.git\ncd tektii-strategy-sdk\nmake setup # Complete setup for first-time users\n# OR\nmake setup-dev # Setup with development dependencies\n```\n\n### Option 2: Manual Setup \ud83d\udcdd\n\n<details>\n<summary>Click to expand manual setup instructions</summary>\n\n```bash\n# Create virtual environment\npython -m venv venv\nsource venv/bin/activate # On Windows: venv\\Scripts\\activate\n\n# Install dependencies\npip install -r requirements.txt\npip install grpcio-tools\n\n# Pull and generate proto files\npython proto/pull_proto.py\npython -m grpc_tools.protoc -Iproto --python_out=tektii_sdk/proto --grpc_python_out=tektii_sdk/proto proto/strategy.proto\n\n# Fix imports\nsed -i 's/import strategy_pb2/from . import strategy_pb2/' tektii_sdk/proto/*_grpc.py\n\n# Install package in development mode\npip install -e .\n```\n</details>\n\n### Verify Installation \u2705\n\n```bash\n# Run tests\npytest tests/\n\n# Check CLI\ntektii --help\n\n# Validate example strategy\ntektii validate examples/simple_ma_strategy.py SimpleMAStrategy\n\n# Push example strategy (requires API credentials)\ntektii push examples/simple_ma_strategy.py SimpleMAStrategy\n```\n\n## \ud83e\uddea Testing\n\n### Unit Testing Your Strategy\n\n```python\n# tests/test_my_strategy.py\nimport pytest\nfrom my_strategy import MyStrategy\nfrom tektii_sdk import StrategyConfig\nfrom tektii_sdk.testing import StrategyTester\n\ndef test_strategy_initialization():\n config = StrategyConfig(\n name=\"TestStrategy\",\n symbols=[\"TEST-USD\"],\n initial_capital=10000\n )\n strategy = MyStrategy(config)\n assert strategy.config.initial_capital == 10000\n\ndef test_strategy_signals():\n tester = StrategyTester(MyStrategy)\n tester.feed_data([\n {\"symbol\": \"TEST-USD\", \"last\": 100},\n {\"symbol\": \"TEST-USD\", \"last\": 110},\n ])\n assert len(tester.get_orders()) > 0\n```\n\n### Running Tests\n\n```bash\n# Run all tests\nmake test\n\n# Run with coverage\nmake test-coverage\n\n# Run specific test\npytest tests/test_my_strategy.py::test_strategy_signals -v\n```\n\n## \ud83d\udea2 Deployment\n\nDeploy your strategies to the Tektii platform with the `tektii push` command.\n\n### Prerequisites\n\n- Docker installed and running\n- Tektii account with API key\n- Strategy ID from the Tektii web console\n\n### Configuration\n\nSet up your credentials using environment variables or a config file:\n\n```bash\n# Option 1: Environment variables\nexport TEKTII_API_KEY=\"your-api-key\"\nexport TEKTII_STRATEGY_ID=\"your-strategy-id\"\n\n# Option 2: Config file (~/.tektii/config.json)\n{\n \"api_key\": \"your-api-key\",\n \"strategy_id\": \"your-strategy-id\"\n}\n```\n\n### Pushing Your Strategy\n\n```bash\n# Basic push\ntektii push my_strategy.py MyStrategy\n\n# Push and save configuration\ntektii push my_strategy.py MyStrategy --save-config\n\n### What Happens During Push\n\n1. **Validation** - Strategy is validated locally\n2. **Git SHA** - Current commit SHA is captured (if in Git repo)\n3. **Version Creation** - New version created via API\n4. **Docker Build** - Container image built (creates Dockerfile if needed)\n5. **Registry Push** - Image pushed to private registry\n6. **Ready** - Strategy available for backtesting\n\n### Docker Support\n\nIf no Dockerfile exists, a default one is created with:\n- Python 3.11 slim base image\n- Non-root user for security\n- Automatic dependency installation\n- Platform optimization (linux/amd64)\n\n## \ud83d\udd27 Troubleshooting\n\n### Common Issues and Solutions\n\n<details>\n<summary>\ud83d\udcdb ModuleNotFoundError: No module named 'grpc_tools'</summary>\n\n```bash\npip install grpcio-tools\n```\n</details>\n\n<details>\n<summary>\ud83d\udcdb Import errors with proto files</summary>\n\n```bash\nmake clean\nmake proto\n# OR manually:\npython -m grpc_tools.protoc -Iproto --python_out=tektii_sdk/proto --grpc_python_out=tektii_sdk/proto proto/strategy.proto\n```\n</details>\n\n<details>\n<summary>\ud83d\udcdb Strategy validation fails</summary>\n\n1. Check inheritance: `class MyStrategy(Strategy)`\n2. Implement required methods: `on_start()` and `on_market_data()`\n3. Handle missing parameters with defaults\n4. Run with `--verbose` for detailed error messages\n</details>\n\n<details>\n<summary>\ud83d\udcdb Permission errors on Unix/Linux</summary>\n\n```bash\nchmod +x setup.sh\nsudo make install # If installing globally\n```\n</details>\n\n<details>\n<summary>\ud83d\udcdb Docker not found during push</summary>\n\n```bash\n# Install Docker: https://docs.docker.com/get-docker/\n# Ensure Docker daemon is running\ndocker --version\n```\n</details>\n\n<details>\n<summary>\ud83d\udcdb Authentication failed during push</summary>\n\n1. Verify API key is correct\n2. Check if key has expired\n3. Ensure strategy ID matches one in web console\n</details>\n\n## \ud83e\udd1d Contributing\n\nWe love contributions! \ud83d\udc96 Please see our [Contributing Guide](CONTRIBUTING.md) for details.\n\n1. Fork the repository\n2. Create a feature branch (`git checkout -b feature/amazing-feature`)\n3. Commit your changes (`git commit -m '\u2728 Add amazing feature'`)\n4. Push to the branch (`git push origin feature/amazing-feature`)\n5. Open a Pull Request\n\n### Development Commands\n\n```bash\nmake format # Format code with black\nmake lint # Run linting checks\nmake test # Run test suite\n```\n\n## \ud83d\udcde Support\n\nNeed help? We're here for you!\n\n- \ud83d\udcd6 **Documentation**: [docs.tektii.com](https://docs.tektii.com)\n- \ud83d\udcac **Discussions**: [GitHub Discussions](https://github.com/tektii/tektii-strategy-sdk/discussions)\n- \ud83d\udc1b **Issues**: [GitHub Issues](https://github.com/tektii/tektii-strategy-sdk/issues)\n- \ud83d\udce7 **Email**: support@tektii.com\n- \ud83d\udcb0 **Trading Community**: [Discord](https://discord.gg/tektii)\n\n\n## \ud83d\udcc4 License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n---\n\n<div align=\"center\">\n\n**Built with \u2764\ufe0f by the Tektii Team**\n\n[\ud83c\udf1f Star us on GitHub](https://github.com/tektii/tektii-strategy-sdk) \u2022 [\ud83d\udc26 Follow on Twitter](https://twitter.com/tektii) \u2022 [\ud83c\udfe2 Visit tektii.com](https://tektii.com)\n\n</div>\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "SDK for building and running backtest strategies on the Tektii platform.",
"version": "0.4.2",
"project_urls": {
"Changelog": "https://github.com/tektii/tektii-strategy-sdk-python/blob/main/CHANGELOG.md",
"Documentation": "https://docs.tektii.com",
"Homepage": "https://github.com/tektii/tektii-strategy-sdk-python",
"Issues": "https://github.com/tektii/tektii-strategy-sdk-python/issues",
"Repository": "https://github.com/tektii/tektii-strategy-sdk-python"
},
"split_keywords": [
"trading",
" backtesting",
" strategy",
" quantitative-finance",
" algorithmic-trading",
" grpc",
" simulation"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "88117d0d091b1503bfc46a0832588addbad7ebe671700151141043358df86854",
"md5": "fad73a1302a4b1b868244df0c57ed36d",
"sha256": "eb85a1bbebdbabee70277c32e530a369af3df103eb275dc2aefc5a7baf9d7a07"
},
"downloads": -1,
"filename": "tektii_strategy_sdk-0.4.2-py3-none-any.whl",
"has_sig": false,
"md5_digest": "fad73a1302a4b1b868244df0c57ed36d",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 46312,
"upload_time": "2025-07-25T06:03:14",
"upload_time_iso_8601": "2025-07-25T06:03:14.770741Z",
"url": "https://files.pythonhosted.org/packages/88/11/7d0d091b1503bfc46a0832588addbad7ebe671700151141043358df86854/tektii_strategy_sdk-0.4.2-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "8783ac0701fd2eb0eff972eff25dadefb2ef476d3dacee815cb2663104cdaad2",
"md5": "a391d5f98a573b1c6a7076bae8504a22",
"sha256": "f41416dc294e087c66fb79476f1f83aa544e990d362eeff59ce9a677716e89b1"
},
"downloads": -1,
"filename": "tektii_strategy_sdk-0.4.2.tar.gz",
"has_sig": false,
"md5_digest": "a391d5f98a573b1c6a7076bae8504a22",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 76087,
"upload_time": "2025-07-25T06:03:16",
"upload_time_iso_8601": "2025-07-25T06:03:16.368450Z",
"url": "https://files.pythonhosted.org/packages/87/83/ac0701fd2eb0eff972eff25dadefb2ef476d3dacee815cb2663104cdaad2/tektii_strategy_sdk-0.4.2.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-07-25 06:03:16",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "tektii",
"github_project": "tektii-strategy-sdk-python",
"github_not_found": true,
"lcname": "tektii-strategy-sdk"
}