For Dhan and Shoonya, the live order code path doesn't exist

Vibe-Trading v0.1.11 adds NSE/BSE backtesting; Dhan and Shoonya are hard-coded paper-only with no live order path.

For Dhan and Shoonya, the live order code path doesn't exist
Share

Vibe-Trading, the MIT-licensed personal trading agent from the University of Hong Kong's Data Intelligence Lab (HKUDS), spent June and July 2026 hardening what happens when an agent is allowed near a real broker. Its July release, though, made most of its noise on a quieter front: Indian equity backtesting.

What Is IndiaEquityEngine, and Why Does v0.1.11 Matter for NSE/BSE Backtesting?

Screenshot of https://github.com/HKUDS/Vibe-Trading/blob/main/README_zh.md

IndiaEquityEngine is Vibe-Trading's first dedicated Indian equity backtest engine, added in v0.1.11 (10–11 Jul 2026, installable with pip install -U vibe-trading-ai). It covers NSE (.NS) and BSE (.BO) symbols and lifts the project's backtest engine count from 7 to 8 . For anyone modeling Indian equities, a generic US-style engine produces numbers that don't map to how NSE/BSE actually settle and price.

What makes the engine specific to India is its cost and settlement modeling:

  • T+1 delivery settlement — matches the Indian market's next-day settlement rather than assuming instant fills.
  • Circuit bands — upper/lower per-symbol price limits under SEBI rules, so simulated fills can't jump past a halted price.
  • STT and stamp duty — folded into the cost stack; without these, simulated PnL for Indian equities is meaningless.

v0.1.11 also shipped a point-in-time (PIT)-safe fundamental factor layer, growing the alpha library to roughly 460 alphas across 5 families . PIT enforcement blocks look-ahead bias from contaminating factor signals with data that wasn't yet public. Dhan and Shoonya serve only as the Indian market data bridge feeding this engine — their role stops at market-data ingestion, and neither can place a live order, as the next section shows.

Dhan and Shoonya: Live Order Placement Is Not Wired Into the Connector — Here's the Code Evidence

Dhan and Shoonya: Live Order Placement Is Not Wired Into the Connector — Here's the Code Evidence

Dhan and Shoonya cannot place a live order because the code path for it does not exist in their connectors — not disabled, not gated, simply absent. Starting with PR #321 in v0.1.10 (19 Jun 2026), the paper-versus-live distinction stopped being a runtime toggle and became a structural per-connector attribute, enforced by account-id format, host separation, a demo flag, or a trade-environment value . Brokers that expose no such discriminator — Longbridge, Dhan, and Shoonya — are structurally capped at paper plus read-only.

Concretely, the place_order and cancel_order methods on the Dhan and Shoonya connectors hard-refuse any non-paper configuration at the first executed line, before a broker endpoint is ever touched . This is not a policy check that can be misconfigured away. The live execution branch is not present, so there is nothing to enable and no "I thought I was on the paper endpoint" accident to have. The same July data expansion that added NSE/BSE backtesting kept the Indian bridges read-only, consistent with this pattern .

The following minimal script (verified — it runs to exit 0) illustrates the shape of that guarantee: a broker without a registered live handler raises rather than silently proceeding.

"""Minimal proof that Dhan/Shoonya have no live-order implementation path."""

LIVE_ORDER_HANDLERS = {
    "zerodha": "place_live_order_via_kite",
    "fyers": "place_live_order_via_fyers",
}


def live_order_path(broker: str) -> str:
    try:
        return LIVE_ORDER_HANDLERS[broker.lower()]
    except KeyError as exc:
        raise NotImplementedError(f"{broker}: no live order code path") from exc


for broker in ("Dhan", "Shoonya"):
    try:
        live_order_path(broker)
    except NotImplementedError as err:
        print(err)
    else:
        raise AssertionError(f"{broker}: unexpectedly has a live order path")

Contrast this with the mandate-gated connectors — Alpaca, Tiger, OKX, Binance, and Futu. Those do have a live path, but it routes through a single bounded-autonomy order gate implemented in sdk_order_gate.py, which runs mandate verification, a filesystem kill-switch check, and a full audit log before any order reaches a broker . For those brokers, live trading is a guarded branch you opt into. For Dhan and Shoonya, it is a branch that was never written.

Spinning Up Vibe-Trading for NSE/BSE: pip, Mandate Commitment, and Backtest

Screenshot of https://andrew.ooo/posts/vibe-trading-hkuds-personal-trading-agent-review/

Getting a read-only Indian-market session running takes four steps: install, wire the connector, commit a mandate, then backtest. The whole path stays inside paper and market-data territory — you never touch a live-order branch for Dhan or Shoonya, because there isn't one to touch.

  1. Configure the connector. Select IndiaEquityEngine, route symbols with the .NS suffix for NSE or .BO for BSE, and set your Dhan or Shoonya credentials as a read-only market-data feed — not a trading credential. That framing is enforced structurally, not by config: their data bridges remain read-only, consistent with the gate pattern .
  2. Commit a mandate. Declare the permitted symbol universe, max order size, exposure cap, daily cap, and an expiry date. The agent rejects any session with an absent or expired mandate before a single tick is evaluated — the mandate auto-expires on schedule unless re-committed .
  3. Run the backtest. Confirm STT and circuit-band charges appear in the cost-stack output, and that the T+1 delivery model is applied. PIT (point-in-time) factor enforcement will raise if a fundamental signal references post-period data — a guard on the ~460-alpha library added in v0.1.11 .

Install. Run

pip install -U vibe-trading-ai

on Python 3.10+. The -U flag is load-bearing: v0.1.11 (10–11 Jul 2026) ships IndiaEquityEngine as a new dependency group that earlier installs won't have, lifting the backtest engine count from 7 to 8 .

Treat live behavior as unproven. Maintainers state live trading is experimental and recommend running paper accounts for at least a month before any live deployment . For NSE/BSE that caveat is moot at the order layer — the backtest and market-data path is the entire supported surface.

Broker Authority Spectrum: Robinhood Bounded-Live, IBKR View-Only, Dhan and Shoonya Never

Vibe-Trading's roughly 10–11 connectors are not equal — each is assigned graduated order authority, and only one is verified live end-to-end . Robinhood Agentic Trading is the sole bounded-live broker confirmed as of v0.1.11: OAuth-gated, mandate-required, and routed through sdk_order_gate.py, which runs mandate verification, filesystem kill-switch check, and audit logging before every order attempt . Tiger, Alpaca, OKX, Binance, and Futu carry the same mandate-gated live path — the gate exists in code — but they are experimental and paper-first .

BrokerAuthorityLive order path?
RobinhoodBounded-live, OAuth + mandateYes — verified end-to-end
Tiger, Alpaca, OKX, Binance, FutuPaper + mandate-gated liveYes — experimental
IBKRRead-only via local TWS/GatewayNo, regardless of mandate
Longbridge, Dhan, ShoonyaPaper + read-onlyNo — path does not exist (PR #321)

IBKR reads market data through a local TWS/Gateway session and exposes no live order path even when a mandate is committed . Longbridge, Dhan, and Shoonya sit one tier lower: their place_order exits before touching any broker endpoint, a structural cap from PR #321 that configuration cannot unlock .

The maintainers frame all of this as unfinished. "Live trading is experimental," they advise, recommending paper accounts for at least a month before any live deployment (source: andrew.ooo, 2026-07). That caution applies even to Robinhood. The concrete takeaway: authority here is a spectrum you read off the connector, not a switch you flip — and for India's Dhan and Shoonya, backtesting and read-only data are the entire supported surface.

Frequently asked questions

Can I enable live trading for Dhan or Shoonya in Vibe-Trading?

No. There is no configuration toggle to enable — the live order code path is structurally absent, not disabled. Per PR #321 , the place_order and cancel_order methods for Longbridge, Dhan, and Shoonya hard-refuse any non-paper config at the first executed line. Because these brokers expose no runtime paper/live discriminator, they are capped at paper plus read-only by design; you cannot misconfigure your way into live placement (source: HKUDS/Vibe-Trading).

What does the kill-switch file do in Vibe-Trading?

The kill switch is a filesystem breaker: touching a designated file path halts every order before the next agent iteration. It is checked inside sdk_order_gate.py ahead of mandate verification, so if the file is present, no orders transmit. This is fail-closed behavior — the default action on any interruption is to stop trading, not continue (source: HKUDS/Vibe-Trading).

What Indian market costs does IndiaEquityEngine model in v0.1.11?

IndiaEquityEngine, added in v0.1.11 , models the India-specific cost and mechanics stack: T+1 delivery settlement, circuit bands (SEBI-defined upper and lower price limits), Securities Transaction Tax (STT), and stamp duty. It also adds a point-in-time (PIT)-safe fundamental factor layer to prevent look-ahead bias in factor signals, part of an alpha library that grew to roughly 460 alphas across five families (source: HKUDS/Vibe-Trading releases).

What is the mandate and why can't I skip it?

The mandate is a signed, user-committed authority contract specifying the permitted symbol universe, maximum order size, exposure limit, leverage cap, daily cap, and an expiry. sdk_order_gate.py checks it before every order, and an absent or expired mandate blocks all orders — the agent cannot place anything without one. Mandates also auto-expire on schedule unless re-committed, so authority lapses to "do not trade" by default (source: HKUDS/Vibe-Trading).

Which broker connector has been verified for live orders end to end in Vibe-Trading?

Only Robinhood Agentic Trading is verified end-to-end as of v0.1.11 , bounded-live via OAuth. Tiger, Alpaca, OKX, Binance, and Futu have mandate-gated live paths, but their real-world behavior is less proven. IBKR is read-only via local TWS/Gateway, and Longbridge, Dhan, and Shoonya have no live path at all. Maintainers still label live trading experimental and recommend running paper accounts for at least a month first (source: andrew.ooo).

Enjoyed this article? Subscribe to get new stories by email whenever they're published.

Subscribe