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?
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 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
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.
- 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 .
-
Configure the connector. Select
IndiaEquityEngine, route symbols with the.NSsuffix for NSE or.BOfor 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 . - 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 .
- 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 .
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 .
| Broker | Authority | Live order path? |
|---|---|---|
| Robinhood | Bounded-live, OAuth + mandate | Yes — verified end-to-end |
| Tiger, Alpaca, OKX, Binance, Futu | Paper + mandate-gated live | Yes — experimental |
| IBKR | Read-only via local TWS/Gateway | No, regardless of mandate |
| Longbridge, Dhan, Shoonya | Paper + read-only | No — 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).
Top comments (0)