Skip to content

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_id values 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_id
  • order_qty
  • order_side

basket_params commonly includes:

  • order_side
  • order_delivery_type
  • price_type
  • multiplier
  • entry_price
  • momentum_trigger_price
  • exit_price
  • stoploss_price
  • entry_time
  • exit_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_id values.
  • 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, and entry_price apply at basket scope.
  • Validate the same-underlying and strategy constraints used by your workflow before submission.
  1. Get Flexi Order
  2. Modify Flexi Order
  3. Cancel Flexi Order
  4. Get Margin
NEO Assistant