tektii-strategy-sdk


Nametektii-strategy-sdk JSON
Version 0.4.2 PyPI version JSON
download
home_pageNone
SummarySDK for building and running backtest strategies on the Tektii platform.
upload_time2025-07-25 06:03:16
maintainerNone
docs_urlNone
authorNone
requires_python>=3.8
licenseMIT
keywords trading backtesting strategy quantitative-finance algorithmic-trading grpc simulation
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # πŸš€ Tektii Strategy SDK

<div align="center">

[![Python Version](https://img.shields.io/badge/python-3.8%2B-blue.svg)](https://www.python.org/downloads/)
[![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)
[![Tests](https://img.shields.io/badge/tests-passing-brightgreen.svg)](https://github.com/tektii/tektii-strategy-sdk-python/actions)
[![Code Style](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
[![Documentation](https://img.shields.io/badge/docs-available-blue.svg)](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[![Python Version](https://img.shields.io/badge/python-3.8%2B-blue.svg)](https://www.python.org/downloads/)\n[![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)\n[![Tests](https://img.shields.io/badge/tests-passing-brightgreen.svg)](https://github.com/tektii/tektii-strategy-sdk-python/actions)\n[![Code Style](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)\n[![Documentation](https://img.shields.io/badge/docs-available-blue.svg)](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"
}
        
Elapsed time: 0.57026s