Place Flexi Order¶
flexi_order() places a flexi basket strategy with basket-level execution parameters such as entry price, stop-loss, exit price, and multiplier.
LLM guidance
Use this page for F&O multi-leg basket strategies built from multiple legs plus shared basket_params. Do not use this page for one regular order or a simple list of independent orders. For one order, use Place Order. For multiple independent orders without basket strategy logic, use Place Multi Order.
Basic Usage¶
from nubra_python_sdk.start_sdk import InitNubraSdk, NubraEnv
from nubra_python_sdk.trading.trading_data import NubraTrader
nubra = InitNubraSdk(NubraEnv.UAT, env_creds=True)
trader = NubraTrader(nubra, version="V2")
result = trader.flexi_order({
"exchange": "NSE",
"basket_name": "OptionBasket",
"order_type": "ORDER_TYPE_LIMIT",
"tag": "flexi_example",
"orders": [
{
"ref_id": 69353,
"order_qty": 1,
"order_side": "ORDER_SIDE_BUY"
}
],
"basket_params": {
"order_side": "ORDER_SIDE_BUY",
"order_delivery_type": "ORDER_DELIVERY_TYPE_CNC",
"price_type": "LIMIT",
"entry_price": 72500,
"momentum_trigger_price": 72600,
"exit_price": 74000,
"stoploss_price": 71000,
"entry_time": "2026-03-20T09:10:00.000Z",
"exit_time" : "2026-03-20T09:30:00.000Z",
"multiplier": 2
}
})
print(result.basket_id)
Example Order Patterns¶
These examples show common option strategy baskets built with flexi_order().
- each leg is passed through
orders - basket-level pricing and controls stay inside
basket_params - option
ref_idvalues are resolved dynamically before order placement
from datetime import datetime
from nubra_python_sdk.refdata.instruments import InstrumentData
from nubra_python_sdk.marketdata.market_data import MarketData
from nubra_python_sdk.start_sdk import InitNubraSdk, NubraEnv
from nubra_python_sdk.trading.trading_data import NubraTrader
from nubra_python_sdk.trading.trading_enum import (
DeliveryTypeEnum,
OrderSideEnum,
PriceTypeEnumV2,
ExchangeEnum,
)
nubra = InitNubraSdk(NubraEnv.UAT, env_creds=True)
instruments = InstrumentData(nubra)
market_data = MarketData(nubra)
trader = NubraTrader(nubra, version="V2")
def get_ref_id(asset, strike, expiry, option_type):
expiry = datetime.strptime(expiry, "%d-%m-%Y").strftime("%Y%m%d")
result = instruments.get_instruments_by_pattern([{
"asset": asset,
"strike_price": str(strike * 100),
"expiry": expiry,
"option_type": option_type,
}])
return result[0].ref_id if result else None
def get_ltp(asset, strike, expiry, option_type):
ref_id = get_ref_id(asset, strike, expiry, option_type)
quote = market_data.quote(ref_id=ref_id, levels=1)
return ref_id, quote.orderBook.last_traded_price
short_call_ref_id, short_call_ltp = get_ltp("NIFTY", 23600, "17-03-2026", "CE")
short_put_ref_id, short_put_ltp = get_ltp("NIFTY", 23600, "17-03-2026", "PE")
result = trader.flexi_order({
"exchange": ExchangeEnum.NSE,
"basket_name": "NIFTY_Straddle",
"tag": "straddle_example",
"orders": [
{
"ref_id": short_call_ref_id,
"order_qty": 65,
"order_side": OrderSideEnum.ORDER_SIDE_SELL,
},
{
"ref_id": short_put_ref_id,
"order_qty": 65,
"order_side": OrderSideEnum.ORDER_SIDE_SELL,
},
],
"basket_params": {
"order_side": OrderSideEnum.ORDER_SIDE_BUY,
"order_delivery_type": DeliveryTypeEnum.ORDER_DELIVERY_TYPE_CNC,
"price_type": PriceTypeEnumV2.LIMIT,
"entry_price": -short_call_ltp - short_put_ltp + 100,
"multiplier": 1,
}
})
print(result.basket_id)
Use this pattern for a two-leg same-strike short straddle basket.
from datetime import datetime
from nubra_python_sdk.refdata.instruments import InstrumentData
from nubra_python_sdk.marketdata.market_data import MarketData
from nubra_python_sdk.start_sdk import InitNubraSdk, NubraEnv
from nubra_python_sdk.trading.trading_data import NubraTrader
from nubra_python_sdk.trading.trading_enum import (
DeliveryTypeEnum,
OrderSideEnum,
PriceTypeEnumV2,
ExchangeEnum,
)
nubra = InitNubraSdk(NubraEnv.UAT, env_creds=True)
instruments = InstrumentData(nubra)
market_data = MarketData(nubra)
trader = NubraTrader(nubra, version="V2")
def get_ref_id(asset, strike, expiry, option_type):
expiry = datetime.strptime(expiry, "%d-%m-%Y").strftime("%Y%m%d")
result = instruments.get_instruments_by_pattern([{
"asset": asset,
"strike_price": str(strike * 100),
"expiry": expiry,
"option_type": option_type,
}])
return result[0].ref_id if result else None
def get_ltp(asset, strike, expiry, option_type):
ref_id = get_ref_id(asset, strike, expiry, option_type)
quote = market_data.quote(ref_id=ref_id, levels=1)
return ref_id, quote.orderBook.last_traded_price
short_call_ref_id, short_call_ltp = get_ltp("NIFTY", 23800, "17-03-2026", "CE")
short_put_ref_id, short_put_ltp = get_ltp("NIFTY", 23200, "17-03-2026", "PE")
result = trader.flexi_order({
"exchange": ExchangeEnum.NSE,
"basket_name": "NIFTY_Strangle",
"tag": "strangle_example",
"orders": [
{
"ref_id": short_call_ref_id,
"order_qty": 65,
"order_side": OrderSideEnum.ORDER_SIDE_SELL,
},
{
"ref_id": short_put_ref_id,
"order_qty": 65,
"order_side": OrderSideEnum.ORDER_SIDE_SELL,
},
],
"basket_params": {
"order_side": OrderSideEnum.ORDER_SIDE_BUY,
"order_delivery_type": DeliveryTypeEnum.ORDER_DELIVERY_TYPE_CNC,
"price_type": PriceTypeEnumV2.LIMIT,
"entry_price": -short_call_ltp - short_put_ltp + 100,
"multiplier": 1,
}
})
print(result.basket_id)
Use this pattern for a two-leg short strangle basket with different call and put strikes.
from datetime import datetime
from nubra_python_sdk.refdata.instruments import InstrumentData
from nubra_python_sdk.marketdata.market_data import MarketData
from nubra_python_sdk.start_sdk import InitNubraSdk, NubraEnv
from nubra_python_sdk.trading.trading_data import NubraTrader
from nubra_python_sdk.trading.trading_enum import (
DeliveryTypeEnum,
OrderSideEnum,
PriceTypeEnumV2,
ExchangeEnum,
)
nubra = InitNubraSdk(NubraEnv.UAT, env_creds=True)
instruments = InstrumentData(nubra)
market_data = MarketData(nubra)
trader = NubraTrader(nubra, version="V2")
def get_ref_id(asset, strike, expiry, option_type):
expiry = datetime.strptime(expiry, "%d-%m-%Y").strftime("%Y%m%d")
result = instruments.get_instruments_by_pattern([{
"asset": asset,
"strike_price": str(strike * 100),
"expiry": expiry,
"option_type": option_type,
}])
return result[0].ref_id if result else None
def get_ltp(asset, strike, expiry, option_type):
ref_id = get_ref_id(asset, strike, expiry, option_type)
quote = market_data.quote(ref_id=ref_id, levels=1)
return ref_id, quote.orderBook.last_traded_price
short_call_ref_id, short_call_ltp = get_ltp("NIFTY", 23600, "17-03-2026", "CE")
short_put_ref_id, short_put_ltp = get_ltp("NIFTY", 23600, "17-03-2026", "PE")
long_call_ref_id, long_call_ltp = get_ltp("NIFTY", 23900, "17-03-2026", "CE")
long_put_ref_id, long_put_ltp = get_ltp("NIFTY", 23200, "17-03-2026", "PE")
result = trader.flexi_order({
"exchange": ExchangeEnum.NSE,
"basket_name": "NIFTY_IronCondor",
"tag": "iron_condor_example",
"orders": [
{
"ref_id": short_call_ref_id,
"order_qty": 65,
"order_side": OrderSideEnum.ORDER_SIDE_SELL,
},
{
"ref_id": short_put_ref_id,
"order_qty": 65,
"order_side": OrderSideEnum.ORDER_SIDE_SELL,
},
{
"ref_id": long_call_ref_id,
"order_qty": 65,
"order_side": OrderSideEnum.ORDER_SIDE_BUY,
},
{
"ref_id": long_put_ref_id,
"order_qty": 65,
"order_side": OrderSideEnum.ORDER_SIDE_BUY,
},
],
"basket_params": {
"order_side": OrderSideEnum.ORDER_SIDE_BUY,
"order_delivery_type": DeliveryTypeEnum.ORDER_DELIVERY_TYPE_CNC,
"price_type": PriceTypeEnumV2.LIMIT,
"entry_price": -short_call_ltp - short_put_ltp + long_call_ltp + long_put_ltp + 100,
"multiplier": 1,
}
})
print(result.basket_id)
Use this pattern for a four-leg defined-risk short premium basket.
from datetime import datetime
from nubra_python_sdk.refdata.instruments import InstrumentData
from nubra_python_sdk.marketdata.market_data import MarketData
from nubra_python_sdk.start_sdk import InitNubraSdk, NubraEnv
from nubra_python_sdk.trading.trading_data import NubraTrader
from nubra_python_sdk.trading.trading_enum import (
DeliveryTypeEnum,
OrderSideEnum,
PriceTypeEnumV2,
ExchangeEnum,
)
nubra = InitNubraSdk(NubraEnv.UAT, env_creds=True)
instruments = InstrumentData(nubra)
market_data = MarketData(nubra)
trader = NubraTrader(nubra, version="V2")
def get_ref_id(asset, strike, expiry, option_type):
expiry = datetime.strptime(expiry, "%d-%m-%Y").strftime("%Y%m%d")
result = instruments.get_instruments_by_pattern([{
"asset": asset,
"strike_price": str(strike * 100),
"expiry": expiry,
"option_type": option_type,
}])
return result[0].ref_id if result else None
def get_ltp(asset, strike, expiry, option_type):
ref_id = get_ref_id(asset, strike, expiry, option_type)
quote = market_data.quote(ref_id=ref_id, levels=1)
return ref_id, quote.orderBook.last_traded_price
short_call_ref_id, short_call_ltp = get_ltp("NIFTY", 23600, "17-03-2026", "CE")
short_put_ref_id, short_put_ltp = get_ltp("NIFTY", 23600, "17-03-2026", "PE")
long_call_ref_id, long_call_ltp = get_ltp("NIFTY", 23900, "17-03-2026", "CE")
long_put_ref_id, long_put_ltp = get_ltp("NIFTY", 23200, "17-03-2026", "PE")
result = trader.flexi_order({
"exchange": ExchangeEnum.NSE,
"basket_name": "NIFTY_IronButterfly",
"tag": "iron_butterfly_example",
"orders": [
{
"ref_id": short_call_ref_id,
"order_qty": 65,
"order_side": OrderSideEnum.ORDER_SIDE_SELL,
},
{
"ref_id": short_put_ref_id,
"order_qty": 65,
"order_side": OrderSideEnum.ORDER_SIDE_SELL,
},
{
"ref_id": long_call_ref_id,
"order_qty": 65,
"order_side": OrderSideEnum.ORDER_SIDE_BUY,
},
{
"ref_id": long_put_ref_id,
"order_qty": 65,
"order_side": OrderSideEnum.ORDER_SIDE_BUY,
},
],
"basket_params": {
"order_side": OrderSideEnum.ORDER_SIDE_BUY,
"order_delivery_type": DeliveryTypeEnum.ORDER_DELIVERY_TYPE_CNC,
"price_type": PriceTypeEnumV2.LIMIT,
"entry_price": -short_call_ltp - short_put_ltp + long_call_ltp + long_put_ltp + 100,
"multiplier": 1,
}
})
print(result.basket_id)
Use this pattern for a four-leg same-center short premium basket with defined wings.
Request Contract¶
| Field | Type | Required | Meaning |
|---|---|---|---|
exchange |
enum |
yes | exchange |
basket_name |
str |
yes | basket name |
tag |
str |
no | basket tag |
orders |
list[SingleBasketOrderV2] |
yes | basket legs |
basket_params |
BasketParamsV2 |
yes | basket-level parameters |
Each orders item includes:
ref_idorder_qtyorder_side
basket_params commonly includes:
order_sideorder_delivery_typeprice_typemultiplierentry_pricemomentum_trigger_priceexit_pricestoploss_priceentry_timeexit_time
Response Contract¶
| Field | Type | Meaning |
|---|---|---|
basket_id |
int |
flexi basket identifier |
basket_name |
str |
basket name |
tag |
str |
basket tag |
orders |
list[BasketIDOrdersV2] |
basket legs with execution data |
basket_params |
BasketIDParamsV2 |
basket-level parameters |
last_traded_price |
int |
basket-level LTP field when present |
pnl |
int |
P&L field |
pnl_change |
float |
P&L change field |
Important Rules¶
Important Rules
- Flexi orders are basket strategies, not just grouped regular orders.
- Use only environment-correct
ref_idvalues. - Basket price fields are typically passed in exchange-native integer units such as paise for NSE instruments.
- Basket-level fields such as
stoploss_price,exit_price, andentry_priceapply at basket scope. - Validate the same-underlying and strategy constraints used by your workflow before submission.