Get the FREE Ultimate OpenClaw Setup Guide →

options-trading

npx machina-cli add skill marketcalls/openalgo-claude-plugin/options-trading --openclaw
Files (1)
SKILL.md
11.8 KB

OpenAlgo Options Trading

Execute options trading strategies using OpenAlgo's unified Python SDK. Supports index options (NIFTY, BANKNIFTY, FINNIFTY), stock options, and complex multi-leg strategies.

Environment Setup

from openalgo import api

client = api(
    api_key='your_api_key_here',
    host='http://127.0.0.1:5000'
)

Quick Start Scripts

Single Leg Options Order

python scripts/options_order.py --underlying NIFTY --expiry 30JAN25 --offset ATM --option-type CE --action BUY --quantity 75

Iron Condor Strategy

python scripts/iron_condor.py --underlying NIFTY --expiry 30JAN25 --quantity 75

Straddle Strategy

python scripts/straddle.py --underlying BANKNIFTY --expiry 30JAN25 --action BUY --quantity 30

Options Symbol Format

OpenAlgo uses standardized symbol formats:

TypeFormatExample
Index Options[INDEX][DDMMMYY][STRIKE][CE/PE]NIFTY30JAN2526000CE
Stock Options[SYMBOL][DDMMMYY][STRIKE][CE/PE]RELIANCE30JAN251400CE
Index Futures[INDEX][DDMMMYY]FUTNIFTY30JAN25FUT

Offset System

OpenAlgo uses an intuitive offset system to select strikes relative to ATM:

OffsetMeaningExample (NIFTY ATM=26000)
ATMAt The Money26000
ITM11 strike In The MoneyCE: 25950, PE: 26050
ITM22 strikes In The MoneyCE: 25900, PE: 26100
OTM11 strike Out of The MoneyCE: 26050, PE: 25950
OTM22 strikes Out of The MoneyCE: 26100, PE: 25900
OTM55 strikes Out of The MoneyCE: 26250, PE: 25750

Core API Methods

1. Single Leg Options Order

Place ATM, ITM, or OTM options orders:

# ATM Call Option
response = client.optionsorder(
    strategy="OptionsBot",
    underlying="NIFTY",
    exchange="NSE_INDEX",
    expiry_date="30JAN25",
    offset="ATM",
    option_type="CE",
    action="BUY",
    quantity=75,
    pricetype="MARKET",
    product="NRML",
    splitsize=0  # 0 = no splitting
)

Response:

{
  "exchange": "NFO",
  "offset": "ATM",
  "option_type": "CE",
  "orderid": "25013000000001",
  "status": "success",
  "symbol": "NIFTY30JAN2526000CE",
  "underlying": "NIFTY30JAN25FUT",
  "underlying_ltp": 26015.50
}

ITM Put Option:

response = client.optionsorder(
    strategy="OptionsBot",
    underlying="NIFTY",
    exchange="NSE_INDEX",
    expiry_date="30JAN25",
    offset="ITM3",  # 3 strikes ITM
    option_type="PE",
    action="BUY",
    quantity=75,
    pricetype="MARKET",
    product="NRML"
)

OTM Call Option:

response = client.optionsorder(
    strategy="OptionsBot",
    underlying="NIFTY",
    exchange="NSE_INDEX",
    expiry_date="30JAN25",
    offset="OTM5",  # 5 strikes OTM
    option_type="CE",
    action="SELL",
    quantity=75,
    pricetype="MARKET",
    product="NRML"
)

2. Multi-Leg Options Order

Execute complex strategies with multiple legs in a single call:

Iron Condor (4 legs)

response = client.optionsmultiorder(
    strategy="Iron Condor",
    underlying="NIFTY",
    exchange="NSE_INDEX",
    expiry_date="30JAN25",
    legs=[
        {"offset": "OTM6", "option_type": "CE", "action": "BUY", "quantity": 75},
        {"offset": "OTM6", "option_type": "PE", "action": "BUY", "quantity": 75},
        {"offset": "OTM4", "option_type": "CE", "action": "SELL", "quantity": 75},
        {"offset": "OTM4", "option_type": "PE", "action": "SELL", "quantity": 75}
    ]
)

Response:

{
  "status": "success",
  "underlying": "NIFTY",
  "underlying_ltp": 26050.45,
  "results": [
    {"leg": 1, "action": "BUY", "offset": "OTM6", "option_type": "CE", "symbol": "NIFTY30JAN2526350CE", "orderid": "123", "status": "success"},
    {"leg": 2, "action": "BUY", "offset": "OTM6", "option_type": "PE", "symbol": "NIFTY30JAN2525750PE", "orderid": "124", "status": "success"},
    {"leg": 3, "action": "SELL", "offset": "OTM4", "option_type": "CE", "symbol": "NIFTY30JAN2526250CE", "orderid": "125", "status": "success"},
    {"leg": 4, "action": "SELL", "offset": "OTM4", "option_type": "PE", "symbol": "NIFTY30JAN2525850PE", "orderid": "126", "status": "success"}
  ]
}

Bull Call Spread (2 legs)

response = client.optionsmultiorder(
    strategy="Bull Call Spread",
    underlying="NIFTY",
    exchange="NSE_INDEX",
    expiry_date="30JAN25",
    legs=[
        {"offset": "ATM", "option_type": "CE", "action": "BUY", "quantity": 75},
        {"offset": "OTM2", "option_type": "CE", "action": "SELL", "quantity": 75}
    ]
)

Bear Put Spread (2 legs)

response = client.optionsmultiorder(
    strategy="Bear Put Spread",
    underlying="NIFTY",
    exchange="NSE_INDEX",
    expiry_date="30JAN25",
    legs=[
        {"offset": "ATM", "option_type": "PE", "action": "BUY", "quantity": 75},
        {"offset": "OTM2", "option_type": "PE", "action": "SELL", "quantity": 75}
    ]
)

Straddle (2 legs)

response = client.optionsmultiorder(
    strategy="Long Straddle",
    underlying="BANKNIFTY",
    exchange="NSE_INDEX",
    expiry_date="30JAN25",
    legs=[
        {"offset": "ATM", "option_type": "CE", "action": "BUY", "quantity": 30},
        {"offset": "ATM", "option_type": "PE", "action": "BUY", "quantity": 30}
    ]
)

Strangle (2 legs)

response = client.optionsmultiorder(
    strategy="Short Strangle",
    underlying="NIFTY",
    exchange="NSE_INDEX",
    expiry_date="30JAN25",
    legs=[
        {"offset": "OTM3", "option_type": "CE", "action": "SELL", "quantity": 75},
        {"offset": "OTM3", "option_type": "PE", "action": "SELL", "quantity": 75}
    ]
)

Diagonal Spread (Different Expiries)

response = client.optionsmultiorder(
    strategy="Diagonal Spread",
    underlying="NIFTY",
    exchange="NSE_INDEX",
    legs=[
        {"offset": "ITM2", "option_type": "CE", "action": "BUY", "quantity": 75, "expiry_date": "27FEB25"},
        {"offset": "OTM2", "option_type": "CE", "action": "SELL", "quantity": 75, "expiry_date": "30JAN25"}
    ]
)

Calendar Spread (Same Strike, Different Expiries)

response = client.optionsmultiorder(
    strategy="Calendar Spread",
    underlying="NIFTY",
    exchange="NSE_INDEX",
    legs=[
        {"offset": "ATM", "option_type": "CE", "action": "BUY", "quantity": 75, "expiry_date": "27FEB25"},
        {"offset": "ATM", "option_type": "CE", "action": "SELL", "quantity": 75, "expiry_date": "30JAN25"}
    ]
)

Options Analysis

Get Option Symbol

Find the exact symbol for a given strike:

response = client.optionsymbol(
    underlying="NIFTY",
    exchange="NSE_INDEX",
    expiry_date="30JAN25",
    offset="ATM",
    option_type="CE"
)
# Response: {'symbol': 'NIFTY30JAN2526000CE', 'exchange': 'NFO', 'lotsize': 75, ...}

Get Option Chain

Retrieve the full option chain for analysis:

chain = client.optionchain(
    underlying="NIFTY",
    exchange="NSE_INDEX",
    expiry_date="30JAN25",
    strike_count=10  # ±10 strikes from ATM
)

Response includes for each strike:

{
  "strike": 26000.0,
  "ce": {
    "symbol": "NIFTY30JAN2526000CE",
    "label": "ATM",
    "ltp": 250.50,
    "bid": 250.00,
    "ask": 251.00,
    "volume": 1500000,
    "oi": 5000000,
    "lotsize": 75
  },
  "pe": {
    "symbol": "NIFTY30JAN2526000PE",
    "label": "ATM",
    "ltp": 245.00,
    "bid": 244.50,
    "ask": 245.50,
    "volume": 1200000,
    "oi": 4500000,
    "lotsize": 75
  }
}

Calculate Option Greeks

Get Delta, Gamma, Theta, Vega, Rho for any option:

greeks = client.optiongreeks(
    symbol="NIFTY30JAN2526000CE",
    exchange="NFO",
    interest_rate=0.00,
    underlying_symbol="NIFTY",
    underlying_exchange="NSE_INDEX"
)

Response:

{
  "status": "success",
  "symbol": "NIFTY30JAN2526000CE",
  "option_type": "CE",
  "strike": 26000.0,
  "spot_price": 25966.05,
  "option_price": 250,
  "days_to_expiry": 28.5,
  "implied_volatility": 15.6,
  "greeks": {
    "delta": 0.4967,
    "gamma": 0.000352,
    "theta": -7.919,
    "vega": 28.9489,
    "rho": 9.733994
  }
}

Calculate Synthetic Future Price

synthetic = client.syntheticfuture(
    underlying="NIFTY",
    exchange="NSE_INDEX",
    expiry_date="30JAN25"
)
# Response: {'synthetic_future_price': 26050.05, 'atm_strike': 26000.0, ...}

Get Expiry Dates

expiries = client.expiry(
    symbol="NIFTY",
    exchange="NFO",
    instrumenttype="options"
)
# Returns list of expiry dates: ['30-JAN-25', '06-FEB-25', '13-FEB-25', ...]

Common Index Details

IndexExchangeLot SizeStrike Gap
NIFTYNSE_INDEX7550
BANKNIFTYNSE_INDEX30100
FINNIFTYNSE_INDEX6550
MIDCPNIFTYNSE_INDEX5025
SENSEXBSE_INDEX20100
BANKEXBSE_INDEX30100

Strategy Patterns

Weekly Options Selling (Theta Decay)

# Short Strangle - Sell OTM options to collect premium
response = client.optionsmultiorder(
    strategy="Weekly Strangle",
    underlying="NIFTY",
    exchange="NSE_INDEX",
    expiry_date="30JAN25",  # Weekly expiry
    legs=[
        {"offset": "OTM5", "option_type": "CE", "action": "SELL", "quantity": 75},
        {"offset": "OTM5", "option_type": "PE", "action": "SELL", "quantity": 75}
    ]
)

Directional Play with Protection

# Bull Call Spread - Limited risk bullish bet
response = client.optionsmultiorder(
    strategy="Bullish Spread",
    underlying="BANKNIFTY",
    exchange="NSE_INDEX",
    expiry_date="30JAN25",
    legs=[
        {"offset": "ATM", "option_type": "CE", "action": "BUY", "quantity": 30},
        {"offset": "OTM3", "option_type": "CE", "action": "SELL", "quantity": 30}
    ]
)

Event Day Volatility Play

# Long Straddle before results/events
response = client.optionsmultiorder(
    strategy="Event Straddle",
    underlying="RELIANCE",
    exchange="NSE",
    expiry_date="30JAN25",
    legs=[
        {"offset": "ATM", "option_type": "CE", "action": "BUY", "quantity": 250},
        {"offset": "ATM", "option_type": "PE", "action": "BUY", "quantity": 250}
    ]
)

Butterfly Spread (Low Capital)

response = client.optionsmultiorder(
    strategy="Long Butterfly",
    underlying="NIFTY",
    exchange="NSE_INDEX",
    expiry_date="30JAN25",
    legs=[
        {"offset": "ITM2", "option_type": "CE", "action": "BUY", "quantity": 75},
        {"offset": "ATM", "option_type": "CE", "action": "SELL", "quantity": 150},
        {"offset": "OTM2", "option_type": "CE", "action": "BUY", "quantity": 75}
    ]
)

Margin Calculation

Calculate required margin before placing orders:

margin = client.margin(positions=[
    {
        "symbol": "NIFTY30JAN2526000CE",
        "exchange": "NFO",
        "action": "SELL",
        "product": "NRML",
        "pricetype": "MARKET",
        "quantity": "75"
    },
    {
        "symbol": "NIFTY30JAN2525000CE",
        "exchange": "NFO",
        "action": "BUY",
        "product": "NRML",
        "pricetype": "MARKET",
        "quantity": "75"
    }
])

print(f"Total Margin Required: {margin['data']['total_margin_required']}")
print(f"SPAN Margin: {margin['data']['span_margin']}")
print(f"Exposure Margin: {margin['data']['exposure_margin']}")

Notes

  • Always check available margin before placing option sell orders
  • Use splitsize parameter for large orders to avoid freeze quantity limits
  • Weekly options expire on Thursday, monthly on last Thursday
  • NIFTY lot size is 75, BANKNIFTY is 30
  • Use Analyzer mode for paper trading: client.analyzertoggle(mode=True)

Source

git clone https://github.com/marketcalls/openalgo-claude-plugin/blob/main/plugins/openalgo-python/skills/options-trading/SKILL.mdView on GitHub

Overview

OpenAlgo Options Trading lets you execute both single-leg and complex multi-leg option strategies using a unified Python SDK. It supports index and stock options, provides options chain analysis, and computes Greeks to inform risk and reward. The platform covers quick-start scripts and standardized symbol formats for streamlined trading.

How This Skill Works

Initialize the OpenAlgo Python client with your API key and host, then place orders using optionsorder for single legs or optionsmultiorder for multi-leg strategies. Symbols follow standardized formats for index and stock options, and an offset system (ATM, ITM, OTM) selects strikes relative to the ATM price. The API returns structured results including status, symbol, and underlying details to close the loop on execution and risk.

When to Use It

  • When you need a quick single-leg option order (ATM, ITM, or OTM)
  • When building defined multi-leg strategies (Iron Condor, Straddle, Strangle, Spreads)
  • When analyzing option chains and calculating Greeks to assess risk
  • When trading index options (NIFTY, BANKNIFTY, FINNIFTY) or stock options
  • When you want to automate trading workflows with Python scripts using the OpenAlgo SDK

Quick Start

  1. Step 1: Initialize the OpenAlgo client with your API key and host
  2. Step 2: Place a single-leg options order using client.optionsorder
  3. Step 3: Run a multi-leg strategy with client.optionsmultiorder (e.g., Iron Condor)

Best Practices

  • Test single-leg orders first to validate behavior before deploying multi-leg strategies
  • Use the offset system (ATM/ITM/OTM) to precisely target strikes relative to the underlying
  • Follow standardized symbol formats to avoid mis-trades between index and stock options
  • Incorporate Greeks into decision-making to manage risk and potential reward
  • Use sandbox or simulated runs to verify strategies before live trading and secure API keys

Example Use Cases

  • Place an ATM NIFTY call option using the single-leg order flow
  • Execute a four-leg Iron Condor on NIFTY to capture range-bound profits
  • Enter a Straddle on BANKNIFTY to capitalize on volatility around an event
  • Trade a RELIANCE stock option using the RELIANCE30JAN251400CE format
  • Analyze a given option chain and compute Greeks to compare risk across candidates

Frequently Asked Questions

Add this skill to your agents
Sponsor this space

Reach thousands of developers