Repository navigation
Releases: marketcalls/TradingAgent
Release list
v0.1.0 - first release
A chat-first trading agent for Indian markets, built on Agno with OpenAlgo as the broker connection.
Every order stops and asks you to approve it before anything reaches your broker.
Highlights
- Human approval on every order. The run pauses before the tool executes, the browser shows an approval card, and nothing is sent until you click Approve. Verified end to end over HTTP, including that the resume happens in a different request from the pause.
- All 127 indicators from OpenAlgo's
talibrary behind 5 dispatcher tools, so the full library costs 5 schema slots instead of 127. - 43 tools across 43 endpoints covering market data, symbols, account, options analytics, orders, GTT and indicators. 13 can move money and all 13 are gated.
- Any LLM provider through LiteLLM: Baseten, OpenAI, Anthropic, Gemini, Groq, OpenRouter, or a local model via Ollama with no API key at all.
- A deterministic risk guard that runs after approval and before the broker, which no amount of prompting can talk past.
Safety
Analyzer (simulated) mode is the default, and live orders are refused while REQUIRE_ANALYZER_MODE is set. Four independent layers: instructions, tool scoping (with trading off the order tools are not registered at all), your approval, and RiskGuard.
RiskGuard enforces a kill-switch file, a master switch, analyzer-mode, a symbol denylist, exchange and product allowlists, quantity bounds, a per-session order cap, duplicate suppression within 10 seconds, a notional cap, and a fat-finger guard on limit prices more than 20 percent from the last traded price.
Every order is written to an audit trail twice, before the broker is touched and after.
Getting started
Needs Python 3.14, Node 18+, and a running OpenAlgo instance with your broker logged in. See the README.
Known limitations
- The approval gate only fires when the model actually calls the order tool. Measured on gpt-5.6-luna, 5 of 6 order instructions reached it; the backend emits an explicit warning when a reply claims an order that was never placed.
- Small local models choose poorly among 43 tools, so a lean 15-tool profile is selected automatically for them.
- WebSocket streaming quotes are not wired into the UI; quotes are polled on demand.
- No authentication on the backend. It binds to localhost, and any remote deployment needs auth added first.
Full detail in docs/CHANGELOG.md and docs/model-notes.md.