5.0 KiB
5.0 KiB
API Reference — Execution Engine
Base Types
TradeOrder
@dataclass
class TradeOrder:
action: str # "buy" or "sell"
token_in: str # Input token address
token_out: str # Output token address
amount: float # Amount of token_in to spend
slippage_bps: int # Slippage tolerance in basis points (50 = 0.5%)
chain: str # "solana", "ethereum", "base", etc.
priority_fee: float | None = None # Optional gas/priority fee override
TradeResult
@dataclass
class TradeResult:
success: bool
tx_hash: str
amount_in: float
amount_out: float
price_impact: float # Percentage
gas_cost: float # In native token
timestamp: str
JupiterExecutor (Solana)
from tradingagents.execution import JupiterExecutor
executor = JupiterExecutor(
rpc_url="https://api.mainnet-beta.solana.com",
private_key="<base58_private_key>", # From SOLANA_PRIVATE_KEY
)
Methods
async get_quote(order: TradeOrder) -> dict
Fetches a swap route from the Jupiter Aggregator V6 API.
quote = await executor.get_quote(order)
# Returns raw Jupiter quote dict with fields like:
# { "inputMint": ..., "outputMint": ..., "outAmount": ... }
Quota: 1 HTTP GET to https://quote-api.jup.ag/v6/quote
async execute_swap(order: TradeOrder) -> TradeResult
Full swap execution:
- Gets quote
- POSTs to
/v6/swapto get serialized transaction - Signs with
solders.Keypair - Sends via Solana RPC
async get_wallet_balance(token_address: str) -> float
Returns the token balance for the configured wallet. (Stub — implement for Scenario 3)
OneInchExecutor (EVM)
from tradingagents.execution import OneInchExecutor
executor = OneInchExecutor(
rpc_url="https://eth-mainnet.g.alchemy.com/v2/YOUR_KEY",
private_key="0x<hex_private_key>", # From ETH_PRIVATE_KEY
chain_id=1, # 1=Ethereum, 8453=Base, 42161=Arbitrum
)
Methods
async get_quote(order: TradeOrder) -> dict
Fetches price estimate from 1inch V6 API.
quote = await executor.get_quote(order)
# Returns: { "dstAmount": "50000000000000000", ... }
async execute_swap(order: TradeOrder) -> TradeResult
Full EVM swap:
- Calls
/swap/v6.0/{chainId}/swapto get calldata - Builds EIP-155 transaction with nonce + gas
- Signs with
web3.eth.account - Broadcasts via
eth_sendRawTransaction
OrderManager
Converts LLM agent signals ("BUY", "SELL", "HOLD") into executable TradeOrder objects.
from tradingagents.execution import OrderManager
manager = OrderManager(
risk_params={
"max_position_size": 1000.0, # USD
"default_buy_amount": 100.0, # USD per buy
}
)
async process_signal(signal, token_address, portfolio, chain) -> TradeOrder | None
| Signal | Behaviour |
|---|---|
"BUY" |
Spends default_buy_amount USDC → target token (capped by max_position_size) |
"SELL" |
Sells entire position of target token → USDC |
"HOLD" |
Returns None — no trade |
GoogleSearchClient + QuotaManager
import os
from tradingagents.dataflows.google_search_tools import GoogleSearchClient, QuotaExceededError
client = GoogleSearchClient(
api_key=os.environ["GOOGLE_SEARCH_API_KEY"],
cx=os.environ["GOOGLE_SEARCH_ENGINE_ID"],
daily_limit=95, # Hard cap — raises QuotaExceededError when reached
warn_threshold=0.8, # Logs warning at 80% usage
)
results = await client.search("solana DeFi TVL", num=5)
# Returns: list[SearchResult(title, link, snippet)]
print(client.quota_status)
# { "usage_today": 3, "daily_limit": 95, "remaining": 92, "is_near_limit": False }
WebResearchAnalyst
from tradingagents.agents.analysts.web_research_analyst import WebResearchAnalyst
analyst = WebResearchAnalyst() # Reads GOOGLE_SEARCH_* from env
report = await analyst.research_token(
token_name="Solana",
token_address="So11111111111111111111111111111111111111112",
)
print(report.to_text()) # LLM-ready markdown report
Report Categories
| Attribute | Description |
|---|---|
security_findings |
Results from honeypot.is, tokensniffer |
news_findings |
Results from coindesk, theblock, bloomberg |
analytics_findings |
Results from defillama, dune, dexscreener |
sentiment_findings |
Results from lunarcrush |
quota_status |
Current daily usage stats |
Quota cost: 4 queries per research_token() call (one per category).
PortfolioTracker
from tradingagents.portfolio import PortfolioTracker
tracker = PortfolioTracker(rpc_url="https://api.mainnet-beta.solana.com")
portfolio = await tracker.get_portfolio_state(wallet="<address>", chain="solana")
print(portfolio.total_value_usd) # e.g. 5420.75
print(portfolio.positions["So1111..."]) # PositionInfo object
Stubs _fetch_token_balances and _fetch_token_prices — implement for Scenario 3 with real RPC/price oracle calls.