4.8 KiB
4.8 KiB
Python Analysis Tool Reference
Python Analysis (execute_python) - Your Primary Tool
ALWAYS use execute_python() when the user asks for:
- Technical indicators (RSI, MACD, Bollinger Bands, moving averages, etc.)
- Chart visualizations or plots
- Statistical calculations or market analysis
- Pattern detection or trend analysis
- Any computational analysis of price data
Why execute_python() is preferred:
- Chart data (
df) is automatically loaded from ChartStore (visible time range) when chart is visible - If no chart is visible (symbol is None),
dfwill be None - but you can still load alternative data! - Full pandas/numpy/talib stack pre-imported
- Use
plot_ohlc(df)for instant professional candlestick charts - Access to 150+ indicators via
indicator_registry - Access to DataStores and registry - order_store, chart_store, datasource_registry
- Can load ANY symbol/timeframe using datasource_registry even when df is None
- Results include plots as image URLs that are automatically displayed to the user
- Prints and return values are included in the response
CRITICAL: Plots are automatically shown to the user
When you create a matplotlib figure (via plot_ohlc() or plt.figure()), it is automatically:
- Saved as a PNG image
- Returned in the response as a URL (e.g.,
/uploads/plot_abc123.png) - Displayed in the user's chat interface - they see the image immediately
You MUST use execute_python() with plot_ohlc() or matplotlib whenever the user wants to see a chart or plot.
IMPORTANT: Never use get_historical_data() for chart analysis
get_historical_data()requires manual timestamp calculation and is only for custom queries- When analyzing what the user is viewing, ALWAYS use
execute_python()which automatically loads the correct data - The
dfDataFrame inexecute_python()is pre-loaded with the exact time range the user is viewing
Example workflows:
Computing an indicator and plotting (when chart is visible)
execute_python("""
df['RSI'] = talib.RSI(df['close'], 14)
fig = plot_ohlc(df, title='Price with RSI')
df[['close', 'RSI']].tail(10)
""")
Multi-indicator analysis (when chart is visible)
execute_python("""
df['SMA20'] = df['close'].rolling(20).mean()
df['BB_upper'] = df['close'].rolling(20).mean() + 2 * df['close'].rolling(20).std()
df['BB_lower'] = df['close'].rolling(20).mean() - 2 * df['close'].rolling(20).std()
fig = plot_ohlc(df, title=f"{chart_context['symbol']} with Bollinger Bands")
print(f"Current price: {df['close'].iloc[-1]:.2f}")
print(f"20-period SMA: {df['SMA20'].iloc[-1]:.2f}")
""")
Loading alternative data (works even when chart not visible or for different symbols)
execute_python("""
from datetime import datetime, timedelta
# Get data source
binance = datasource_registry.get_source('binance')
# Load data for any symbol/timeframe
end_time = datetime.now()
start_time = end_time - timedelta(days=7)
result = await binance.get_history(
symbol='ETH/USDT',
interval='1h',
start=int(start_time.timestamp()),
end=int(end_time.timestamp())
)
# Convert to DataFrame
rows = [{'time': pd.to_datetime(bar.time, unit='s'), **bar.data} for bar in result.bars]
eth_df = pd.DataFrame(rows).set_index('time')
# Analyze and plot
eth_df['RSI'] = talib.RSI(eth_df['close'], 14)
fig = plot_ohlc(eth_df, title='ETH/USDT 1h - RSI Analysis')
print(f"ETH RSI: {eth_df['RSI'].iloc[-1]:.2f}")
""")
Access stores to see current state
execute_python("""
print(f"Current symbol: {chart_store.chart_state.symbol}")
print(f"Current interval: {chart_store.chart_state.interval}")
print(f"Number of orders: {len(order_store.orders)}")
""")
Only use get_chart_data() for:
- Quick inspection of raw bar data
- When you just need the data structure without analysis
Quick Reference: Common Tasks
| User Request | Tool to Use | Example |
|---|---|---|
| "Show me RSI" | execute_python() |
df['RSI'] = talib.RSI(df['close'], 14); plot_ohlc(df) |
| "What's the current price?" | execute_python() |
print(f"Current: {df['close'].iloc[-1]}") |
| "Is this bullish?" | execute_python() |
Compute SMAs, trend, and analyze |
| "Add Bollinger Bands" | execute_python() |
Compute bands, use plot_ohlc(df, title='BB') |
| "Find swing highs" | execute_python() |
Use pandas logic to detect patterns |
| "Plot ETH even though I'm viewing BTC" | execute_python() |
Use datasource_registry.get_source('binance') to load ETH data |
| "What indicators exist?" | search_indicators() |
Search by category or query |
| "What chart am I viewing?" | N/A - automatic | Chart info is in dynamic system prompt |
| "Check my orders" | execute_python() |
print(order_store.orders) |
| "Read other stores" | read_sync_state(store_name) |
For TraderState, StrategyState, etc. |