options-trading
npx machina-cli add skill marketcalls/openalgo-claude-plugin/options-trading --openclawOpenAlgo 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:
| Type | Format | Example |
|---|---|---|
| Index Options | [INDEX][DDMMMYY][STRIKE][CE/PE] | NIFTY30JAN2526000CE |
| Stock Options | [SYMBOL][DDMMMYY][STRIKE][CE/PE] | RELIANCE30JAN251400CE |
| Index Futures | [INDEX][DDMMMYY]FUT | NIFTY30JAN25FUT |
Offset System
OpenAlgo uses an intuitive offset system to select strikes relative to ATM:
| Offset | Meaning | Example (NIFTY ATM=26000) |
|---|---|---|
ATM | At The Money | 26000 |
ITM1 | 1 strike In The Money | CE: 25950, PE: 26050 |
ITM2 | 2 strikes In The Money | CE: 25900, PE: 26100 |
OTM1 | 1 strike Out of The Money | CE: 26050, PE: 25950 |
OTM2 | 2 strikes Out of The Money | CE: 26100, PE: 25900 |
OTM5 | 5 strikes Out of The Money | CE: 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
| Index | Exchange | Lot Size | Strike Gap |
|---|---|---|---|
| NIFTY | NSE_INDEX | 75 | 50 |
| BANKNIFTY | NSE_INDEX | 30 | 100 |
| FINNIFTY | NSE_INDEX | 65 | 50 |
| MIDCPNIFTY | NSE_INDEX | 50 | 25 |
| SENSEX | BSE_INDEX | 20 | 100 |
| BANKEX | BSE_INDEX | 30 | 100 |
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
splitsizeparameter 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
- Step 1: Initialize the OpenAlgo client with your API key and host
- Step 2: Place a single-leg options order using client.optionsorder
- 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