Options trading with OpenAlgo - single leg orders, multi-leg strategies (Iron Condor, Straddle, Strangle, Spreads), options chain analysis, and Greeks calculation
Execute options strategies using OpenAlgo: single-leg orders, multi-leg spreads (Iron Condor, Straddle, Strangle), options chain analysis, and Greeks calculation. Use when users request specific options trades or strategy analysis.
/plugin marketplace add marketcalls/openalgo-claude-plugin/plugin install marketcalls-openalgo-python-plugins-openalgo-python@marketcalls/openalgo-claude-pluginThis skill inherits all available tools. When active, it can use any tool Claude has access to.
requirements.txtscripts/greeks.pyscripts/iron_condor.pyscripts/options_order.pyscripts/straddle.pyExecute options trading strategies using OpenAlgo's unified Python SDK. Supports index options (NIFTY, BANKNIFTY, FINNIFTY), stock options, and complex multi-leg strategies.
from openalgo import api
client = api(
api_key='your_api_key_here',
host='http://127.0.0.1:5000'
)
python scripts/options_order.py --underlying NIFTY --expiry 30JAN25 --offset ATM --option-type CE --action BUY --quantity 75
python scripts/iron_condor.py --underlying NIFTY --expiry 30JAN25 --quantity 75
python scripts/straddle.py --underlying BANKNIFTY --expiry 30JAN25 --action BUY --quantity 30
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 |
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 |
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"
)
Execute complex strategies with multiple legs in a single call:
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"}
]
}
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}
]
)
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}
]
)
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}
]
)
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}
]
)
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"}
]
)
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"}
]
)
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, ...}
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
}
}
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
}
}
synthetic = client.syntheticfuture(
underlying="NIFTY",
exchange="NSE_INDEX",
expiry_date="30JAN25"
)
# Response: {'synthetic_future_price': 26050.05, 'atm_strike': 26000.0, ...}
expiries = client.expiry(
symbol="NIFTY",
exchange="NFO",
instrumenttype="options"
)
# Returns list of expiry dates: ['30-JAN-25', '06-FEB-25', '13-FEB-25', ...]
| 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 |
# 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}
]
)
# 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}
]
)
# 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}
]
)
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}
]
)
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']}")
splitsize parameter for large orders to avoid freeze quantity limitsclient.analyzertoggle(mode=True)Use when working with Payload CMS projects (payload.config.ts, collections, fields, hooks, access control, Payload API). Use when debugging validation errors, security issues, relationship queries, transactions, or hook behavior.