Entry / Exit
Analyst team
Research debate
Risk debate
Decision
Tool node
Click any node to learn more
propagate(ticker, date)
create_initial_state()
messages, reports, debate states
① Analyst team (runs in sequence)
Market Analyst
get_stock_data · get_indicators
tools_market
tool call?
done →
Msg Clear
Social Media Analyst
get_news (Reddit/Twitter sentiment)
tools_social
tool call?
done →
Msg Clear
News Analyst
get_news · get_global_news · get_insider_transactions
tools_news
tool call?
done →
Msg Clear
Fundamentals Analyst
get_fundamentals · balance sheet · cashflow
tools_fundamentals
tool call?
done →
Msg Clear
② Research debate (Bull vs Bear, max_debate_rounds × 2 turns)
Bull Researcher
reads all 4 reports + memory
Bear Researcher
reads all 4 reports + memory
argues →
← counters
loop until investment_debate_state.count ≥ 2 × max_debate_rounds
Research Manager
synthesises debate → investment_plan · deep LLM
Trader
creates trader_investment_plan
③ Risk debate (Aggressive / Conservative / Neutral, max_risk_discuss_rounds × 3 turns)
Aggressive Analyst
maximise upside risk
Conservative Analyst
protect downside risk
Neutral Analyst
balanced risk view
loop until risk_debate_state.count ≥ 3 × max_risk_discuss_rounds · Agg → Con → Neu → Agg → …
④ Final decision
Risk Judge (Fund Manager)
approves / rejects · writes final_trade_decision
process_signal()
extracts BUY / SELL / HOLD + rationale
return (final_state, decision)
full state + BUY / SELL / HOLD signal
_log_state()
JSON log