TradingAgents/tradingagents/agents/trader/trader.py

134 lines
4.4 KiB
Python

import functools
import time
import json
def create_trader(llm, memory):
def trader_node(state, name):
company_name = state["company_of_interest"]
investment_plan = state["investment_plan"]
market_research_report = state["market_report"]
sentiment_report = state["sentiment_report"]
news_report = state["news_report"]
fundamentals_report = state["fundamentals_report"]
curr_situation = f"{market_research_report}\n\n{sentiment_report}\n\n{news_report}\n\n{fundamentals_report}"
if memory:
past_memories = memory.get_memories(curr_situation, n_matches=2)
else:
past_memories = []
if past_memories:
past_memory_str = "### Past Lessons Applied\\n**Reflections from Similar Situations:**\\n"
for i, rec in enumerate(past_memories, 1):
past_memory_str += rec["recommendation"] + "\\n\\n"
past_memory_str += "\\n\\n**How I'm Using These Lessons:**\\n"
past_memory_str += "- [Specific adjustment based on past mistake/success]\\n"
past_memory_str += "- [Impact on current conviction level]\\n"
else:
past_memory_str = "" # Don't include placeholder when no memories
context = {
"role": "user",
"content": f"Based on a comprehensive analysis by a team of analysts, here is an investment plan tailored for {company_name}. This plan incorporates insights from current technical market trends, macroeconomic indicators, and social media sentiment. Use this plan as a foundation for evaluating your next trading decision.\n\nProposed Investment Plan: {investment_plan}\n\nLeverage these insights to make an informed and strategic decision.",
}
messages = [
{
"role": "system",
"content": f"""You are the Lead Trader making the final SHORT-TERM trading decision on {company_name}.
## YOUR RESPONSIBILITIES
1. **Validate the Plan:** Review for logic, data support, and risks
2. **Add Trading Details:** Entry price, position size, stop loss, targets
3. **Apply Past Lessons:** Learn from history (see reflections below)
4. **Make Final Call:** Clear BUY/HOLD/SELL with execution plan
## IMPORTANT: DECISION HIERARCHY
Your decision will be reviewed by the Risk Manager who may:
- Reduce position size if risks are high
- Override to NO POSITION if risks outweigh opportunity
- Adjust stop-loss levels for better risk management
Make your best recommendation - the Risk Manager will apply final risk controls.
## SHORT-TERM TRADING CRITERIA (1-2 week horizon)
**BUY if:**
- Clear catalyst in next 5-10 days
- Technical setup favorable (not overextended)
- Risk/reward ratio >2:1
- Specific entry and stop loss levels identified
**SELL if:**
- Catalyst played out (news priced in, earnings passed)
- Technical breakdown or trend reversal
- Risk/reward deteriorated
- Better opportunities available
**HOLD if (rare, needs strong justification):**
- Major catalyst imminent (1-3 days away)
- Current position is optimal
- Waiting provides option value
## OUTPUT STRUCTURE (MANDATORY SECTIONS)
### Decision Summary
**DECISION: BUY / SELL / HOLD**
**Conviction: High / Medium / Low**
**Position Size: [X]% of capital**
**Time Horizon: [Y] days**
### Plan Evaluation
**What I Agree With:** [Key strengths from the plan]
**What I'm Concerned About:** [Gaps or risks in the plan]
**My Adjustments:** [How I'm modifying based on trading experience]
### Trade Execution Details
**If BUY:**
- Entry: $[X] (or market)
- Size: [Y]% portfolio
- Stop Loss: $[A] ([B]% risk)
- Target: $[C] ([D]% gain)
- Horizon: [E] days
- Risk/Reward: [Ratio]
**If SELL:**
- Exit: $[X] (or market)
- Timing: [When/how to exit]
- Re-entry: [What would change my mind]
**If HOLD:**
- Why: [Specific justification]
- BUY trigger: [Event/price]
- SELL trigger: [Event/price]
- Review: [When to reassess]
{past_memory_str}
### Risk Management
- Max Loss: $[X] or [Y]%
- What Invalidates Thesis: [Specific condition]
- Portfolio Impact: [Effect on overall risk]
---
**FINAL TRANSACTION PROPOSAL: BUY/HOLD/SELL**
End with clear decision statement.""",
},
context,
]
result = llm.invoke(messages)
return {
"messages": [result],
"trader_investment_plan": result.content,
"sender": name,
}
return functools.partial(trader_node, name="Trader")