Strategy Management

The Strategy Module is a core component of the OpenAlgo platform that enables users to create, manage, and execute automated trading strategies through webhooks. This document provides a comprehensive overview of the strategy module's features, architecture, and usage.

Overview

The Strategy Module allows traders to:

  • Create and manage trading strategies

  • Configure multiple symbols per strategy

  • Set up intraday and positional trading modes

  • Control trading hours and auto square-off times

  • Integrate with trading platforms via webhooks

  • Execute trades based on external signals

Core Components

1. Strategy Blueprint (strategy.py)

The strategy blueprint handles all HTTP routes and business logic for strategy management:

  • Route Management: Handles all /strategy/* endpoints

  • Order Processing: Manages order queues with rate limiting

  • Time Management: Handles trading hours and square-off scheduling

  • Webhook Processing: Processes incoming trading signals

2. Database Models (strategy_db.py)

Two main database models manage strategy data:

Strategy Model

  • id: Unique identifier

  • name: Strategy name

  • webhook_id: Unique UUID for webhook identification

  • user_id: Associated user

  • platform: Trading platform (e.g., tradingview)

  • is_active: Strategy activation status

  • is_intraday: Intraday/Positional mode

  • trading_mode: LONG/SHORT/BOTH

  • start_time: Trading start time

  • end_time: Trading end time

  • squareoff_time: Auto square-off time

StrategySymbolMapping Model

  • Links symbols to strategies

  • Configures trading parameters per symbol

  • Manages exchange and product type settings

Features

1. Strategy Management

  • Create new strategies

  • Toggle strategy activation

  • Delete strategies

  • View strategy details

  • Configure trading times

2. Symbol Configuration

  • Add/remove symbols to strategies

  • Configure quantity per symbol

  • Set product type (MIS/CNC/NRML)

  • Choose exchange

3. Trading Controls

  • Intraday/Positional mode selection

  • Trading direction control (LONG/SHORT/BOTH)

  • Trading hours configuration

  • Automatic square-off scheduling

4. Webhook Integration

The module processes webhook signals from trading platforms with the following format:

[BASE_URL]/strategy/webhook/[WEBHOOK_ID]

Signal Keywords:

  • BUY: Long entry

  • SELL: Long exit

  • SHORT: Short entry

  • COVER: Short cover

Rate Limiting

The module implements sophisticated rate limiting:

  • Regular orders: Max 10 orders per second

  • Smart orders: 1 order per second

  • Separate queues for different order types

Security Features

  • Session validation for all routes

  • Unique webhook IDs per strategy

  • User-specific strategy isolation

  • API key management for trading platforms

Best Practices

  1. Strategy Naming:

    • Use descriptive names

    • Include relevant indicators/timeframes

    • Follow naming conventions

  2. Symbol Configuration:

    • Verify exchange and product type compatibility

    • Set appropriate position sizes

    • Test with small quantities first

  3. Trading Hours:

    • Set conservative trading hours

    • Allow buffer for square-off

    • Consider market timing restrictions

  4. Webhook Setup:

    • Use secure webhook URLs

    • Include proper signal keywords

    • Test signals before live trading

Error Handling

The module implements comprehensive error handling:

  • Database transaction management

  • Order placement retries

  • Invalid signal filtering

  • Rate limit compliance

Integration Points

  1. Trading Platforms:

    • TradingView

    • ChartInk

    • Custom platforms (via webhook API)

  2. Broker Integration:

    • Supports multiple Indian brokers

    • Product type validation per exchange

    • Order type compatibility checks

Performance Considerations

  • Efficient order queue processing

  • Rate limit compliance

  • Database connection pooling

  • Background task scheduling

TradingView Webhook Configuration

Setting Up TradingView Alerts

  1. Create Alert in TradingView:

    • Go to TradingView Chart

    • Click "Alerts" icon

    • Select "Create Alert"

  2. Alert Settings:

    • Name: Include signal keyword (BUY/SELL/SHORT/COVER)

    • Condition: Set your trading condition

    • Message: Configure webhook message (see format below)

    • Webhook URL: [BASE_URL]/strategy/webhook/[YOUR_WEBHOOK_ID]

Webhook Message Formats

The webhook message format varies based on the trading mode of your strategy:

1. Long Only Mode

{
    "symbol": "RELIANCE",
    "action": "BUY"  // or "SELL"
}

2. Short Only Mode

{
    "symbol": "NIFTY",
    "action": "SELL"  // or "BUY"
}

3. Both Modes (Long & Short)

{
    "symbol": "TATASTEEL",
    "action": "BUY",  // BUY/SELL
    "position_size": "1"  // Required for both modes
}

TradingView Alert Message Setup

  1. Alert Message Format for Long/Short Only Mode:

{
    "symbol": "openalgo_symbol",
    "action": "{{strategy.order.action}}"
}
  1. Alert Message Format for Both Modes:

{
    "symbol": "openalgo_symbol",
    "action": "{{strategy.order.action}}",
    "position_size": "{{strategy.position_size}}"
}

Signal Actions by Trading Mode

  1. Long Only Mode:

    • BUY: Opens a long position

    • SELL: Closes the long position

  2. Short Only Mode:

    • SELL: Opens a short position

    • BUY: Closes the short position

  3. Both Modes:

    • BUY with positive position_size: Opens/Increases long position

    • SELL with positive position_size: Opens/Increases short position

    • BUY with zero position_size: Closes short position

    • SELL with zero position_size: Closes long position

Important Notes:

  1. Symbol Format:

    • Use the exact symbol as configured in your strategy

    • Symbols are case-sensitive

    • Must match with the configured exchange

  2. Position Size:

    • Required only for "BOTH" trading mode

    • Must be included in every webhook message for "BOTH" mode

    • Represents the desired position size

  3. Action Values:

    • Must be uppercase: "BUY" or "SELL"

    • Action interpretation depends on trading mode

Sample Python Code

Here are examples of how to send webhook requests using Python:

1. Basic Long/Short Mode Example

import requests

# Inputs: host URL and webhook ID
host_url = "http://127.0.0.1:5000"
webhook_id = "ee12219c-3ce1-4a2c-a9b0-0c67c5fa7e32"

# Construct the full URL
webhook_url = f"{host_url}/strategy/webhook/{webhook_id}"

# Message to be sent
post_message = {
    "symbol": "SYMBOL",
    "action": "BUY"
}

# Send POST request
try:
    response = requests.post(webhook_url, json=post_message)
    print(f"Response Status Code: {response.status_code}")
    print(f"Response Body: {response.text}")
except requests.exceptions.RequestException as e:
    print(f"An error occurred: {e}")

2. Both Mode Example

import requests

def send_strategy_signal(host_url, webhook_id, symbol, action, position_size=None):
    """
    Send a strategy signal via webhook
    
    Args:
        host_url (str): Base URL of the OpenAlgo server
        webhook_id (str): Strategy's webhook ID
        symbol (str): Trading symbol
        action (str): "BUY" or "SELL"
        position_size (int, optional): Required for BOTH mode
    """
    # Construct webhook URL
    webhook_url = f"{host_url}/strategy/webhook/{webhook_id}"
    
    # Prepare message
    post_message = {
        "symbol": symbol,
        "action": action.upper()
    }
    
    # Add position_size for BOTH mode
    if position_size is not None:
        post_message["position_size"] = str(position_size)
    
    try:
        response = requests.post(webhook_url, json=post_message)
        if response.status_code == 200:
            print(f"Signal sent successfully: {post_message}")
        else:
            print(f"Error sending signal. Status: {response.status_code}")
            print(f"Response: {response.text}")
    except requests.exceptions.RequestException as e:
        print(f"Request failed: {e}")

# Example usage
host = "http://127.0.0.1:5000"
webhook_id = "ee12219c-3ce1-4a2c-a9b0-0c67c5fa7e32"

# Long entry example (BOTH mode)
send_strategy_signal(host, webhook_id, "RELIANCE", "BUY", 1)

# Short entry example (BOTH mode)
send_strategy_signal(host, webhook_id, "NIFTY", "SELL", 1)

# Close positions example (BOTH mode)
send_strategy_signal(host, webhook_id, "RELIANCE", "SELL", 0)  # Close long
send_strategy_signal(host, webhook_id, "NIFTY", "BUY", 0)     # Close short

3. Error Handling Example

import requests
import json
from typing import Dict, Optional
from datetime import datetime

class WebhookError(Exception):
    """Custom exception for webhook errors"""
    pass

class StrategyWebhook:
    def __init__(self, host_url: str, webhook_id: str):
        self.webhook_url = f"{host_url}/strategy/webhook/{webhook_id}"
    
    def send_signal(self, 
                   symbol: str, 
                   action: str, 
                   position_size: Optional[int] = None) -> Dict:
        """
        Send a trading signal with comprehensive error handling
        
        Args:
            symbol: Trading symbol
            action: "BUY" or "SELL"
            position_size: Required for BOTH mode
        
        Returns:
            Dict containing response data
        
        Raises:
            WebhookError: If the request fails or returns non-200 status
        """
        # Validate inputs
        if action.upper() not in ["BUY", "SELL"]:
            raise ValueError("Action must be either 'BUY' or 'SELL'")
        
        # Prepare message
        message = {
            "symbol": symbol,
            "action": action.upper(),
            "timestamp": datetime.now().isoformat()
        }
        
        if position_size is not None:
            message["position_size"] = str(position_size)
        
        try:
            response = requests.post(
                self.webhook_url, 
                json=message,
                timeout=5  # 5 seconds timeout
            )
            
            # Check response status
            if response.status_code != 200:
                raise WebhookError(
                    f"Request failed with status {response.status_code}: "
                    f"{response.text}"
                )
            
            return response.json()
            
        except requests.exceptions.Timeout:
            raise WebhookError("Request timed out")
        except requests.exceptions.ConnectionError:
            raise WebhookError("Connection failed")
        except json.JSONDecodeError:
            raise WebhookError("Invalid JSON response")
        except Exception as e:
            raise WebhookError(f"Unexpected error: {str(e)}")

# Usage example
try:
    webhook = StrategyWebhook(
        "http://127.0.0.1:5000",
        "ee12219c-3ce1-4a2c-a9b0-0c67c5fa7e32"
    )
    
    # Send a signal
    result = webhook.send_signal("RELIANCE", "BUY", 1)
    print(f"Signal sent successfully: {result}")
    
except WebhookError as e:
    print(f"Webhook error: {e}")
except ValueError as e:
    print(f"Invalid input: {e}")
except Exception as e:
    print(f"Unexpected error: {e}")

How Webhook Processing Works

  1. Signal Reception:

    • Webhook endpoint receives TradingView alert

    • Validates webhook ID and message format

    • Checks strategy status and trading hours

  2. Order Processing:

    • Matches symbol with strategy configuration

    • Validates trading mode compatibility

    • Applies position sizing rules

    • Routes to appropriate order queue

  3. Rate Limiting:

    • Regular orders: Max 10/second

    • Smart orders: 1/second

    • Queue management for order bursts

  4. Position Management:

    • Tracks open positions per symbol

    • Handles partial fills

    • Manages stop-loss and target orders

    • Implements square-off rules

Best Practices for Webhook Usage

  1. Alert Naming:

    • Use clear, consistent naming patterns

    • Include strategy identifier

    • Add signal type in name

  2. Message Formatting:

    • Use proper JSON syntax

    • Include all required fields

    • Add custom fields for strategy-specific data

  3. Error Handling:

    • Set up retry mechanism in TradingView

    • Monitor webhook delivery status

    • Implement fallback signals

  4. Testing:

    • Test with paper trading first

    • Verify webhook connectivity

    • Validate all signal types

    • Check position tracking

Future Enhancements

Planned improvements include:

  • Advanced order types

  • Strategy templates

  • Performance analytics

  • Risk management features

  • Multi-account support

Last updated