NubraNubra API
Back to Blogs
Options & DerivativesTrading Psychology & EducationAlgo Trading

Options Strategy Deployment: Short Premium Structures Explained

Akshay Navin: Algo Trader & Content DeveloperJanuary 21, 20267 min

Options trading is not about predicting direction — it is about understanding range, volatility, and risk.

Short premium strategies are built on a simple idea:

If price stays within a defined range, time decay works in your favor.

This blog explains three commonly used short premium option structures, when they are typically applied, and how they behave — strictly from an educational perspective.


Understanding Short Premium Strategies#

Short premium strategies benefit from:

  • Time decay (Theta)
  • Range-bound price action
  • Volatility contraction

They are generally used when traders expect the underlying to stay within a range rather than trend aggressively.


Strategy 1: Short Strangle#

The Short Strangle is used when the expected price range is wide, but still controlled.

Structure#

  • Sell an Out-of-the-Money Call
  • Sell an Out-of-the-Money Put
  • No protective wings

Characteristics#

  • Higher probability of profit
  • Lower premium compared to straddle
  • Unlimited risk (educational context only)

When It’s Typically Used#

  • High implied volatility
  • Expectation of consolidation within a wide range
  • Trader is comfortable managing risk dynamically

🎥 Short Strangle – Strategy Visualization


Strategy 2: Iron Condor#

The Iron Condor is a defined-risk alternative to the short strangle.

Structure#

  • Sell an OTM Call
  • Buy a further OTM Call (hedge)
  • Sell an OTM Put
  • Buy a further OTM Put (hedge)

Characteristics#

  • Defined maximum loss
  • Lower margin requirement
  • Lower premium than strangle

When It’s Typically Used#

  • Moderate volatility
  • Clear expected range
  • Traders who prefer defined risk

🎥 Iron Condor – Strategy Visualization


Strategy 3: Iron Butterfly#

The Iron Butterfly is used when the expected price range is very tight.

Structure#

  • Sell an ATM Call
  • Sell an ATM Put
  • Buy an OTM Call (hedge)
  • Buy an OTM Put (hedge)

Characteristics#

  • Highest premium among defined-risk structures
  • Very sensitive to price movement
  • Narrow profit zone

When It’s Typically Used#

  • Low volatility environments
  • Strong conviction that price will remain near ATM
  • Short time-to-expiry setups

🎥 Iron Butterfly – Strategy Visualization


Comparing the Strategies#

StrategyRisk TypePremiumBest Used When
Short StrangleUnlimitedMediumWide expected range
Iron CondorDefinedLow–MediumControlled range
Iron ButterflyDefinedHighVery tight range

Each structure serves a different market expectation.


Why Rule-Based Strategy Selection Matters#

Rather than forcing one strategy every day, experienced traders think in terms of:

  • Expected price range
  • Volatility environment
  • Risk tolerance

Mapping market expectation → strategy structure removes emotional bias and promotes disciplined thinking.


Important Disclaimer#

⚠️ Educational Use Only

This blog and all examples shown are shared strictly for learning and educational purposes.

  • This is not financial advice
  • This is not a recommendation to trade
  • These strategies are not meant to be deployed live without extensive testing, risk management, and regulatory compliance

Options trading involves significant risk and can result in losses exceeding initial capital.


Example Python code#


from time import sleep
from datetime import datetime
import pytz

from nubra_python_sdk.start_sdk import InitNubraSdk, NubraEnv
from nubra_python_sdk.marketdata.market_data import MarketData
from nubra_python_sdk.trading.trading_data import NubraTrader
from nubra_python_sdk.refdata.instruments import InstrumentData

# =========================================================
# SDK INITIALIZATION
# =========================================================
nubra = InitNubraSdk(NubraEnv.UAT, env_creds=True)
md = MarketData(nubra)
trade = NubraTrader(nubra, version="V2")
instruments = InstrumentData(nubra)

IST = pytz.timezone("Asia/Kolkata")

# =========================================================
# STRATEGY CONFIG
# =========================================================
ALLOW_NEW_ENTRIES = True
MANAGE_POSITIONS = True
RR = 2.0
QTY = 1

# =========================================================
# STATE
# =========================================================
positions = {}
orb_levels = {}
last_bar_key = None

# =========================================================
# TIME GATE — EXACT 5 MIN FROM 09:15 IST
# =========================================================
def is_5min_gate():
    now = datetime.now(IST)

    if now.hour < 9 or (now.hour == 9 and now.minute < 15):
        return False

    minutes_from_open = (now.hour * 60 + now.minute) - (9 * 60 + 15)
    return minutes_from_open % 5 == 0 and now.second < 2


def get_bar_key():
    return datetime.now(IST).strftime("%Y-%m-%d %H:%M")

# =========================================================
# UTILITIES
# =========================================================
def get_ltp(symbol):
    try:
        return md.current_price(symbol).price
    except Exception:
        return None


def get_ref_id(symbol):
    return instruments.get_instrument_by_symbol(
        symbol, exchange="NSE"
    ).ref_id


def place_order(symbol, side):
    trade.create_order({
        "ref_id": get_ref_id(symbol),
        "order_side": "ORDER_SIDE_BUY" if side == "BUY" else "ORDER_SIDE_SELL",
        "order_type": "ORDER_TYPE_REGULAR",
        "price_type": "MARKET",
        "order_qty": QTY,
        "validity_type": "IOC",
        "order_delivery_type": "ORDER_DELIVERY_TYPE_IDAY",
        "exchange": "NSE",
        "tag": "ORB_5MIN"
    })

# =========================================================
# ORB LOGIC
# =========================================================
def capture_orb(symbol):
    data = md.historical_data({
        "exchange": "NSE",
        "type": "STOCK",
        "values": [symbol],
        "fields": ["high", "low"],
        "interval": "5m",
        "intraDay": True,
        "realTime": False
    })

    candle = data.result[0].values[0][symbol].high[0]

    orb_levels[symbol] = {
        "high": candle.value,
        "low": data.result[0].values[0][symbol].low[0].value
    }

    print(f"📊 ORB {symbol} | H={orb_levels[symbol]['high']} L={orb_levels[symbol]['low']}")

# =========================================================
# POSITION MANAGEMENT
# =========================================================
def manage_position(symbol, pos):
    ltp = get_ltp(symbol)
    if ltp is None:
        return

    if pos["side"] == "BUY":
        if ltp <= pos["sl"] or ltp >= pos["tp"]:
            place_order(symbol, "SELL")
            positions.pop(symbol)
            print(f"❌ EXIT {symbol}")

    else:
        if ltp >= pos["sl"] or ltp <= pos["tp"]:
            place_order(symbol, "BUY")
            positions.pop(symbol)
            print(f"❌ EXIT {symbol}")

# =========================================================
# MAIN LOOP
# =========================================================
print("🚀 ORB STRATEGY STARTED (CLOCK-ALIGNED)")
print("⏱ 5-MIN EXECUTION FROM 09:15 IST\n")

while True:
    try:
        if is_5min_gate():
            bar_key = get_bar_key()

            if bar_key != last_bar_key:
                last_bar_key = bar_key
                print(f"\n⏱ New 5-min candle @ {bar_key}")

                # Capture ORB once
                if not orb_levels:
                    for symbol in ["INFY", "TCS", "WIPRO"]:
                        capture_orb(symbol)
                    continue

                # Breakout logic
                for symbol, levels in orb_levels.items():
                    if symbol in positions:
                        continue

                    ltp = get_ltp(symbol)
                    if ltp is None:
                        continue

                    if ltp > levels["high"]:
                        sl = levels["low"]
                        tp = ltp + RR * (ltp - sl)
                        place_order(symbol, "BUY")
                        positions[symbol] = {
                            "side": "BUY",
                            "sl": sl,
                            "tp": tp
                        }
                        print(f"✅ LONG {symbol} @ {ltp}")

                    elif ltp < levels["low"]:
                        sl = levels["high"]
                        tp = ltp - RR * (sl - ltp)
                        place_order(symbol, "SELL")
                        positions[symbol] = {
                            "side": "SELL",
                            "sl": sl,
                            "tp": tp
                        }
                        print(f"✅ SHORT {symbol} @ {ltp}")

                # Manage open positions
                for symbol, pos in list(positions.items()):
                    manage_position(symbol, pos)

        sleep(1)

    except Exception as e:
        print(f"🔥 STRATEGY ERROR: {e}")
        sleep(2)

Final Thoughts#

Short premium strategies are powerful tools — but only when used with structure and discipline.

Understanding:

  • When a market is likely to range
  • How volatility impacts option pricing
  • How each structure behaves

is far more important than chasing premium.

Used correctly, these strategies help traders think probabilistically, not directionally.