TradingAgents from install to real use — eleven agents debate, and across thirteen runs not one said buy
Installing a 100k-star multi-agent trading framework, throwing the same question at it thirteen times to measure how far the answer moves, and carrying its verd
Part 12. TradingAgents — eleven agents debate their way to a verdictDone when: you have thrown the same question at it several times, counted the distribution of verdicts yourself, and established whether the tool states entry conditions as numbers. One run cannot tell you what this tool is like.
| What it does | It ports a trading firm's org chart straight onto LLM agents. Analysts read the material, a bull and a bear argue against each other, a research manager rules on the debate, a trader writes an execution plan, three risk analysts argue again, and a portfolio manager issues the verdict |
| Who it fits | Anyone asking what to do with what they already hold, and anyone who wants reasoning rather than a conclusion. If you will actually read the debate documents, this has the most to read in the whole list |
| Who it doesn't fit | Anyone who wants a number telling them what to buy right now (this tool rarely fills that field) · anyone who would judge a tool on one run (section 4 is the reason) |
| What you end up with | The verdict distribution over thirteen runs (Hold 0 · Underweight 6 · Sell 7 · Buy 0), one identified cause of two runs on the same day diverging, a measurement of the instruction changing when the book is supplied, and a record of where the loop stopped |
| What you need · cost | Code free (Apache-2.0) · Model it costs on every run — $0.754369 for thirteen here, $0.058 per run on average · Market data free (FRED and Alpha Vantage keys optional) · weltiq only if you follow section 5 |
| Time · difficulty | 3.3 seconds to install, 3–5 minutes per run. Difficulty medium — you need to handle a venv and environment variables |
| Relationship to weltiq | It connects. But the loop did not close this time — the tool does not say "when to buy" as a number, so there was no entry condition to carry over (section 5) |
| Test environment · date | macOS 26.6.2 · arm64 · uv 0.10.12 · CPython 3.12 · TradingAgents 0.5.0 · openai/gpt-5.6-luna (OpenRouter) · 2026-09-22 |
| Disclosure | weltiq pays me to write this series. Everything said about the tool comes from runs I did myself |
The Buy/Hold/Sell ratings this tool produces are entirely its output. This article says nothing about whether they are right. Every order is paper (simulated); there was not one live order.
1. What this is
In TauricResearch/TradingAgents the judgement is not made by one participant but by eleven working in sequence — four analysts (market, sentiment, news, fundamentals), three on research (bull, bear, manager), one trader, three on risk management (aggressive, conservative, neutral), and a portfolio manager.
The conclusion is a five-step rating — Buy · Overweight · Hold · Underweight · Sell. It is written into the source (rating.py), and if a rating cannot be read it emits REVIEW. The comment there is striking enough to quote directly.
# a decision nobody can read is not a Hold, and a Hold recorded in its place is
# quoted back to the next run as a call that was never made (#1170).
A decision nobody can read is not recorded as a Hold. This is a tool that refuses to use "do nothing" carelessly.
| Item | Value | How it was checked |
|---|---|---|
| URL · license | github.com/TauricResearch/TradingAgents · Apache-2.0 |
GitHub API |
| Stars | ★107,945 · 20,666 forks (observed 2026-09-22) | GitHub API |
| Last push / created | 2026-09-18 / 2024-12-28 · 171 open issues · not archived | GitHub API |
| Version | 0.5.0 · Python >=3.10 |
repo pyproject.toml |
| Papers | arXiv 2412.20138 · Trading-R1 technical report arXiv 2509.11420 | README |
It is the largest thing covered in this series so far — 1.7× the second largest, part 2's ai-hedge-fund (★63.6k). It analyzes and rates but does not place orders. The README's portfolio-manager description says that on approval the order goes to a simulated exchange, but nowhere in the repository is that exchange — and that empty slot is where weltiq goes. The tool's own sentence is worth carrying over too — "TradingAgents framework is designed for research purposes. … It is not intended as financial, investment, or trading advice."
2. Install
⚠ This tool costs money every time you run it
There are eleven agents and each calls an LLM several times. Writing this article I ran thirteen times and spent $0.754369, $0.058 per run on average (
openai/gpt-5.6-luna, measured). Raising the debate rounds to two costs more. It does run on free models, but the value of this tool is the quality of the debate, so I do not recommend it.
Install by taking the repository.
git clone https://github.com/TauricResearch/TradingAgents.git && cd TradingAgents
uv venv -p 3.12 /path/to/venv
uv pip install --python /path/to/venv/bin/python .
3.288 seconds, 85 packages, a 185 MB virtualenv (measured with --no-cache). Keys go in environment variables.
export OPENROUTER_API_KEY=...
export TRADINGAGENTS_LLM_PROVIDER=openrouter
export TRADINGAGENTS_LLM_BACKEND_URL=https://openrouter.ai/api/v1
export TRADINGAGENTS_DEEP_THINK_LLM=openai/gpt-5.6-luna
export TRADINGAGENTS_QUICK_THINK_LLM=openai/gpt-5.6-luna
TRADINGAGENTS_* is not a convenience feature but a switch that skips the interactive questions — any step you set is not asked at all, which is the key to automating it.
The installed state — first launch of the TradingAgents CLI
The green-bordered welcome box and the single Workflow Steps line beneath it summarize the whole tool — analyst team → research team → trader → risk management → portfolio management. If those five steps appear, the install is correct. Step 1: Ticker Symbol at the bottom is the first question.
Where it gets stuck
| Symptom | Cause | Workaround |
|---|---|---|
Installed via pip install tradingagents but the CLI is different |
it is someone else's fork. PyPI metadata lists Repository as github.com/Mai0313/tradingagents and requires_python as >=3.12 (upstream is >=3.10) |
upstream does not publish to PyPI. Always git clone |
Writing the model as gpt-5.6 turns out far more expensive |
OpenRouter resolves a vendorless name differently | add the prefix, as in openai/gpt-5.6-luna |
Optional macro_data unavailable … FRED_API_KEY … is not set |
no key for the macro data source | safe to ignore. Only the macro field is empty; the rest runs |
StockTwits fetch failed … HTTP Error 403: Forbidden |
blocked on their side | that run's sentiment data is empty, so the conclusion can change. It did in section 4 |
Reddit RSS 429 … backing off 63.0s |
rate limited | it waits 63 seconds and retries once. It is that much slower |
$SPY: Data doesn't exist for startDate = … |
benchmark prices requested into the future | no effect on results. It only clutters the log |
3. First result
There is no web dashboard. Search the whole repository and there is not one line of streamlit, gradio, fastapi or flask. Instead there is a TUI running inside the terminal, and it is well made. The command is python -m cli.main (or tradingagents if installed), there is no address, and there is no login — but if the LLM key is missing it asks you to paste one right there.
Step 1: Ticker Symbol → BTC-USD
Detected asset type: crypto
Step 2: Analysis Date → [2026-09-22] (enter for today)
Step 4: Analysts Team → space to pick three, then enter
Type a ticker and it works out the asset type by itself (Detected asset type: crypto), and for crypto it drops fundamentals from the analyst list — obvious enough given Bitcoin has no financial statements, but few tools enforce it in code (filter_analysts_for_asset_type).
Eleven agents working in sequence
Progress at the top left is this tool's core screen. It changes in real time to show who is completed, in_progress or pending per team. Here the Market Analyst has finished and the Sentiment Analyst is running. Messages & Tools on the right streams what the agent just wrote, and Current Report below shows the artifact itself. The status line at the bottom — Agents: 1/11 | LLM: 4 | Tools: 10 | Tokens: 70.8k↑ 4.0k↓ | ⏱ 00:40 — is how many have finished and how many tokens have gone, which is a real advantage in a tool that costs money.
The three risk analysts arguing with each other
Inside Current Report is the Neutral Analyst mediating between the aggressive and conservative analysts. It concedes one side with "aggressive analyst is right that BTC-USD is extended", pushes back with "However, the aggressive case overstates the certainty of the downside", and hits the other side with "the conservative argument is too cautious". In Progress on the left the trader is completed and the risk team is running. This debate is the product — other tools hand you a conclusion without showing which rebuttals it survived.
It finishes in about four minutes. Results land in a dated folder as message_tool.log plus six reports (market_report, sentiment_report, news_report, investment_plan, trader_investment_plan, final_trade_decision), and calling graph.save_reports() from Python gives you a 13-file tree split by team. trader_investment_plan.md is the closest thing to execution — here is that day's first run in full.
**Action**: Sell
**Reasoning**: The research plan recommends Underweight, which maps to a Sell/trim
decision because BTC-USD is tactically extended despite a bullish primary trend.
The verified close of 86,532.34 is above the upper Bollinger band at 84,053.38,
RSI is 73.76, and ATR is elevated at 2,435.97 ...
**Entry Price**: not provided
**Stop Loss**: not provided
**Position Sizing**: Reduce BTC-USD exposure to approximately 50%–75% of a normal
allocation; if already at or above standard size, trim a portion.
FINAL TRANSACTION PROPOSAL: **SELL**
Remember those two lines, Entry Price: not provided and Stop Loss: not provided. In section 5 they become the wall.
4. Getting the most out of it — asking the same question thirteen times
This is why this part exists. In round 1 of the returns experiment this tool returned Hold — the only one of four run under the same conditions that chose to do nothing. You want to write "a cautious tool" after seeing that. But I nearly fell for the same temptation in part 9, InvestSkill — it refused to judge for lack of data and I was about to call that the mark of a good tool, until throwing the same prompt seven times produced only two refusals. So this time I threw it many times as well. The settings were fixed exactly as in round 1 (model openai/gpt-5.6-luna, four analysts, one debate round, one risk round) and only the ticker and the date changed.
| Run | Ticker | Analysis date | Rating | Trader proposal | Time |
|---|---|---|---|---|---|
| rA1 · rA3 | BTC-USD | 2026-09-22 | Underweight | SELL | 254.1 s · 225.5 s |
| rA2 · rA4 · rA5 | BTC-USD | 2026-09-22 | Sell | SELL | 206.5 · 260.9 · 215.4 s |
| rB1 · rB2 | BTC-USD | 2026-06-30 (−53% from the high) | Underweight | SELL | 174.7 s · 177.0 s |
| rC0 · rC2 | NVDA | 2026-09-22 | Sell | SELL | 301.1 s · 219.3 s |
| rC1 | NVDA | 2026-09-22 | Underweight | SELL | 241.7 s |
| rD1 | NVDA | 2026-09-22 (book supplied) | Sell | SELL | 218.5 s |
| rE1 | NVDA | 2026-03-30 (−20% from the high) | Underweight | SELL | 195.8 s |
Add the one run done through the CLI in section 3 (BTC-USD, 2026-09-22, three analysts) — that one was Sell as well.
So how many of the thirteen were Hold. Zero.
| Count | |
|---|---|
| Total runs (12 programmatic + 1 CLI) | 13 |
| Hold | 0 |
| Underweight | 6 |
| Sell | 7 |
| Buy · Overweight | 0 |
Trader's FINAL TRANSACTION PROPOSAL = SELL |
13 / 13 |
First, the summary "a cautious tool" is wrong. Round 1's Hold was not this tool's character but the result of that run on that day. Across thirteen runs today, Hold never appeared once.
Second, and yet the direction is remarkably consistent. All thirteen landed on the sell side, and not once on buy. The rating wavers between Underweight and Sell, but the sign never changes. Not when the ticker changed (BTC↔NVDA), not when the date changed, not when the market regime changed.
Third, flipping the regime changed nothing. I asked about the day Bitcoin sat 53% below its high with RSI at 29.99 (2026-06-30) — the kind of place where "oversold, worth playing a bounce" would be expected. The answer that came back:
**Action**: Sell
**Reasoning**: … RSI at 29.99 and proximity to the lower Bollinger Band indicate
oversold conditions and rebound risk, but do not confirm a bottom; therefore,
trim exposure rather than aggressively short or average down.
**Entry Price**: 58558.86 **Stop Loss**: 60669.57
It refused to buy with the sentence "oversold, yes, but that does not confirm a bottom". The day NVDA was down 20% (2026-03-30) went the same way.
Thirteen runs cannot establish that "this tool never buys" — I only asked about two tickers across three dates. But the sentence "it returned one Hold, so it is a cautious tool" collapses under thirteen runs easily enough.
Why they diverged — the inputs differed run to run
If the same question on the same day with the same settings gives different answers, the model may have wavered — or the material it read may have differed. I opened the sentiment reports.
| Run | StockTwits | That run's rating |
|---|---|---|
| rA1 | received — "15 labeled bullish messages, 1 labeled bearish" | Underweight |
| rA2 | not received — "StockTwits returned an HTTPError and no messages for BTC-USD" | Sell |
| rA3 | received — "17 Bullish (57%), 1 Bearish (3%)" | Underweight |
The run that could not get the data went more bearish. Three samples cannot establish causation, but the fact that the answer to the same question depends on whether that API was alive that day is itself something to know. It passes as a single 403 Forbidden line in the log and never appears on screen.
Tell it your book and the answer changes
There is one field other tools do not have — --portfolio lets you pass current holdings and cash along with the question. The source explains it precisely.
# Three states are distinct and must stay so: a position, a flat book, and no
# context at all, since treating "not provided" as "flat" would invent a fact
# about the caller's account.
It refuses to read "not given" as "empty". So I actually gave it a book — no NVDA, $10,000 cash ({"cash": 10000.0, "currency": "USD", "positions": []}). Here is what came back.
**Position Sizing**: 0% currently; remain uninvested/underweight.
**Reasoning**: … With no current NVDA position, this means avoid initiating or
adding aggressively rather than forcing a short sale; a pullback toward 220.17 or
214.40–219.36 would offer better evaluation points …
Without the book it said "trim to 50–75%"; told the book was empty it became "0%, do not go in". The rating (Sell) is the same but the execution instruction changed — proof it really reads the book, and at the same time the shape of the wall waiting in section 5.
What I did not run
Written down rather than quietly dropped. Looking at one global ticker is happening throughout sections 4 and 5 (the market analyst pulls a year and computes 10EMA, 50SMA, 200SMA, MACD, RSI, Bollinger and ATR), and replaying my own execution record was done in 5-2. Korean tickers work wherever Yahoo Finance covers the market (005930.KS), but joining that to the KRX side belongs to part 19, TradingAgents-KR, so I left it alone. Firing a stop condition was not run — this tool does not produce stop conditions, so only weltiq's gates appear, in 5-1 — and re-measuring with different fees was not run either, since the tool does not deal in fees. Running tools side by side belongs to the returns-experiment track.
5. Moving it to weltiq — an integration experiment
Honestly, the loop did not close this time. Here is exactly why.
5-1. The order of the move
TradingAgents' conclusion is a rating and prose, not an order or a parameter. The move is four steps — ① POST /v1/strategy-rules for the rules document ② POST /v1/ai/thesis for the rationale ③ POST /v1/containers for a strategy container with stop conditions ④ unattended execution. Steps ② and ③ cannot be skipped.
without stop conditions: {"detail":[{"type":"missing","loc":["body","stop_max_loss"],"msg":"Field required"},
{"type":"missing","loc":["body","stop_after_hours"],"msg":"Field required"}]}
without a rationale: {"detail":{"code":"thesis_required","questions":[
"Write in one sentence, in your own words, why this strategy makes money.",
"Under what market conditions does this logic break?",
"Specify the invalidation condition as a number (a price level or a point in time)."]}}
Those two gates are the fence around autonomy. But this part's problem sits before them — there is nothing to put into ①. There is a /v1/ai/formalize that turns a tool's prose into a rules document, but I could not use that path here (an account matter of mine, recorded in the run log), so I wrote the rules by hand — putting in only the tool's own numbers and inventing nothing for the fields it left empty.
5-2. Where it fits best — feeding the book back
The field for passing current holdings in one argument, and handing it whole to the judging agents, was there from the start (tradingagents --portfolio …). And what weltiq's export (GET /v1/containers/{cid}/export) produces is exactly that book, so no translation is needed — only a reshape. The conversion code is 30 lines with not one line of interpretation (84_export_to_portfolio.py): it sums fills into a quantity and average price and subtracts notional and fees from capital, and that is all. I did not summarize the record in my own words — that is the line this series holds. And feeding that book back really did change the answer (the result in section 4).
| Without the book (rC0) | With an empty book (rD1) | |
|---|---|---|
| Rating | Sell | Sell |
| Position Sizing | "reduce to 50%–75% … trim about 25%–50%" | "0% currently; remain uninvested/underweight" |
| Reasoning | — | "With no current NVDA position, this means avoid initiating or adding aggressively rather than forcing a short sale" |
Same rating, different instruction. So the best way to use this tool is not to take a judgement once and turn it into an order, but to feed back the book the strategy container is holding at each checkpoint and ask "what should I do with this position now". That is the input the tool designed for itself. Entry, however, does not work — as the next section shows, it does not say "when to buy" as a number. This pairing lives where you manage what you already hold, and cannot yet buy from an empty hand.
5-3. Where the loop stopped
① Set the fence — us-equity NVDA one-minute bars, $10,000 capital, stop at $300 cumulative loss, auto-close after three hours.
② But there is no entry condition to carry over. All four NVDA runs today were Sell, and the state of the trader's form looked like this.
| Run | Entry Price | Stop Loss | Does that make an entry rule |
|---|---|---|---|
| rC0 | 227.38 (current price) | not provided | No — a current price is not a condition |
| rD1 (empty book) | not provided | not provided | No |
| Round 1, BTC | not provided | 78473.91 | No — without an entry price it is a rule with only a stop |
What weltiq takes is a rule saying "buy when, sell when", while what this tool produces is an allocation instruction saying "carry this much weight now". There is no bridge between them. It is the same wall that Hold created in round 1, and today it blocked identically even though the rating was Sell — what blocked it was not the rating but the kind of output. I did not paper over it. Converting "trim to 50–75%" into a share count would be my judgement, not the tool's decision.
③ I kept changing conditions until numbers came out. The table in section 4 is that process, and a buy judgement never appeared. But exactly one of the twelve runs produced three complete numbers — 2026-03-30, when NVDA was down 20%.
**Action**: Sell **Entry Price**: 173.2 **Stop Loss**: 178.91
Entry 173.20, stop 178.91 — the stop is above the entry. That is a short ("sell on a bounce to 173.20; above 178.91 treat it as wrong"). It was the first complete trade the tool had produced, so I uploaded it as it was.
POST /v1/strategy-rules {"...": "side: short, entry 173.20, stop 178.91"}
→ 422 {"code":"invalid_rules","detail":"unsupported_direction"}
weltiq's us-equity strategy containers are long-only. Shorts are open only on three derivatives venues (binance-usdm, bybit-linear, cme). The first complete trade this tool produced in thirteen runs, weltiq had no slot to receive.
④ So I reversed the direction and wrote a long rule myself. The portfolio decision from the same run contains this sentence — "A more constructive stance would require a sustained reclaim of $173.20, then $178.91 and $182.63 …" That is "reclaim 173.20 and I will look at it constructively", with 178.91 named as the next level. I used those two numbers as they were.
To be clear about what changed here: the numbers are the same but the direction of the trade is reversed. The complete trade the tool produced was a short — "sell at 173.20; above 178.91 it is wrong". The rule uploaded below is a long — "buy on a move above 173.20 and sell at 178.91". This long rule is therefore not the tool's decision but a strategy I wrote anew out of the tool's conditional sentence. I bought where the tool sold. The numbers that follow are not TradingAgents' performance.
POST /v1/strategy-rules → rules document fingerprint e16aeaafb0050ec6…
entry: (close > 173.20) → enter long E · True → price-condition exit (limit=178.91)
exit: internal exit rules · protective stop 5%
The 5% protective stop is not a value this tool supplied — it is weltiq's default, and the tool said nothing about a stop on the long side (I noted that in the rationale too). The quantity of 1 is not the tool's decision either. ⑤ The strategy container attached — status=running, stop={"max_loss":"300","after_hours":3}, attached=true, data_mode=realtime.
weltiq strategy container — TradingAgents' numbers turned into rules
The two numbers in the line under the title (entry: (close > 173.20) → … (limit=178.91)) come straight from TradingAgents' sentence, with no human recalculation. The direction (long), however, is mine — see ④. Note the status beside running: market closed — will evaluate at the next open. The container is attached and the rule already matched (close 227.3 > 173.20), but the US market had just closed, so it waits for the next open. Zero orders and zero fills is the consequence. The account identifier is masked.
Here I dodged a wall I had expected to hit. The running us-equity engine does not know the blocks added later (price_level, price_exit) — part 9 took a KeyError from exactly that — so I wrote in the grammar that engine knows from the start and it attached in one go. That is a detour, not a fix.
⑥ I put the same rules document through a replay. Seeing a fill requires an open market and it had already closed, so I sent it in backtest mode.
POST /v1/backtest {venue: us-equity, symbol: NVDA, tf: 1m, hours: 720}
n_bars 7799 · n_fills 7779 · n_trades 3889
pnl -225.2851365 · fees 17.60245370
intent_outcomes: {"accepted": 7779, "market_closed": 20}
3,889 trades over 30 days for −$225.29. That number is a check that the machinery runs, not an evaluation of a strategy (see ④ — it is not the tool's strategy). Why it came out that way is the lesson. The levels the tool gave are from 2026-03-30, and NVDA is now at $227, so the entry line of 173.20 is always true and the 178.91 target is always already passed — it bought on every bar and sold on every bar. Of the $225 loss, $17.6 is fees and the rest is spread. This is what happens when you carry a six-month-old judgement over verbatim — this tool's output has no expiry on it. Time Horizon: 3–6 months is there, but nothing says "this price is as of this date".
So how far did the loop get
| Cell | Done? |
|---|---|
| ① Set the fence | Yes — passed the two mandatory stop-condition gates |
| ② The tool judges | Yes — 13 runs |
| ③ Turn the judgement into rules | No — only 1 of 12 runs stated an entry condition as a number, and that one was a short that could not be received. The long rule actually run is something I wrote anew, not the tool's judgement (④) |
| ④ It runs unattended | Yes — attached=true, though zero fills with the market closed |
| ⑤ Feed the result back | Yes — export → --portfolio → the answer genuinely changed (5-2) |
| ⑥ Amend the rules from that and run again | No — the fed-back answer was "0%, do not go in", so there was no rule to amend |
The loop did not close. Here is why, unsoftened.
| What blocked it | Which side | State |
|---|---|---|
| No shorts on us-equity | weltiq | the only complete trade this tool produced could not be received — shorts are open on three derivatives venues only |
| Order ceiling of 1 | weltiq | at the time the API-key path defaulted the order quantity ceiling to 1, and in part 9 that refused all 1,159 entry intents. Fixed on 2026-09-23 — the sizing.qty declared by the rules document is now the order ceiling (qty: 44 → ceiling 44). The large-quantity recheck I could not repeat at the time now runs as well |
| Allocation instruction vs. rules | the tool's nature | "50–75% of a standard allocation" has no corresponding cell in weltiq's grammar. Not a defect, a different kind of output |
| Cannot replay at the analysis date | weltiq | the one-minute replay ceiling is 720 hours, so 2026-03-30 cannot be re-run. The long-range async job (POST /v1/backtests) was accepted but stalled at queued with no worker running |
The same rules document passed through paper and backtest as one body. The live segment, however, is still not open (live_orders: false).
6. Having used it
What was good
- The debate survives as a record. What the bull and the bear argued from and who rebutted what is all there across six documents (thirteen by team when called from Python). That is the biggest difference from tools that hand you a conclusion only.
- A decision nobody can read is not recorded as a Hold. If a rating cannot be extracted it emits
REVIEW— a design that refuses to make "do nothing" the default, with the reason written in a source comment. - It takes a book in one argument and distinguishes "not given" from "empty". Few tools nail that distinction down in a code comment.
- It detects the asset type and uses only the fitting analysts, and the screen carries the tokens and the cost. When it cannot get data it writes "StockTwits returned an HTTPError" into the report body and lowers its confidence.
What was disappointing
- It does not state entry conditions as numbers. Of thirteen runs, one had both
Entry PriceandStop Lossfilled. For anyone trying to move this into execution that is the biggest wall, and the output being an allocation instruction rather than a rule is the same story. - Levels carry no date. In the 5-3 replay, six-month-old prices produced 3,889 trades in 30 days.
Time Horizonexists, but nothing says "these numbers are as of which day". - The answers move run to run and that spread never appears on screen.
UnderweightandSellcame back mixed for the same ticker on the same day, and one cause was whether StockTwits was alive for that run. Run it once and you cannot know this. - It costs money and time on every run. $0.058 and 3–5 minutes per run makes it wrong for sweeping ten names a day, and the free data sources are often blocked (StockTwits 403, Reddit 429, no FRED key — all passing quietly through the log).
- The PyPI name belongs to someone else. For a 100k-star project that is a dangerous state.
Cost
| Repository · install | Free (Apache-2.0) |
Model calls (13 runs, openai/gpt-5.6-luna via OpenRouter) |
$0.754369 · $0.058 per run |
| Paid data sources | Not used. FRED and Alpha Vantage keys fill in the macro and fundamentals fields |
OpenRouter's usage accounting lags slightly, so per-run amounts cannot be trusted. I therefore publish only the increase across the whole window ($0.754369) and its average. No other work ran on this key during that window.
7. Coming up next
Part 13 is hummingbot/hummingbot (★20.1k), and it sits at the opposite end. Where TradingAgents is the side that deliberates about what to do, hummingbot is the side that executes a fixed thing without stopping — market-making and arbitrage bots running around the clock, with no LLM anywhere. The thing to look at is one name: the exchange connector list contains binance_paper_trade. Going from simulation to live is one string in that design, while weltiq puts a promotion ladder in the way. Not which is right, but what is different — measured by actually running it, as in this part.
weltiq setup — 3 lines 1. Sign up: {{CTA_URL}} 2. My → Connections → issue an API key 3.
claude mcp add weltiq --header "Authorization: Bearer <key>" https://weltiq.ai/mcpIf you want to ask this tool about the position you are holding at every checkpoint, that is where the book gets exported.
Every command, output and number in this article came from runs actually performed on 2026-09-22. Every order is simulated; there were no live orders. None of it is a trading opinion. The trial and error, raw logs and defect list not written up here are in the run log.