data fixes, partial custom indicator support
This commit is contained in:
@@ -14,22 +14,22 @@ Create Python scripts that:
|
||||
|
||||
You have direct access to these MCP tools:
|
||||
|
||||
- **category_write**: Create a new research script
|
||||
- Required: category="research", name, description, code
|
||||
- Optional: metadata (with conda_packages list if needed)
|
||||
- Automatically executes the script after writing
|
||||
- **python_write**: Create a new script (research, strategy, or indicator category)
|
||||
- Required: category, name, description, code
|
||||
- Optional: metadata (category-specific fields — see below)
|
||||
- For research: automatically executes the script after writing
|
||||
- Returns validation results and execution output (text + images)
|
||||
|
||||
- **category_edit**: Update an existing research script
|
||||
- Required: category="research", name
|
||||
- **python_edit**: Update an existing script
|
||||
- Required: category, name
|
||||
- Optional: code, description, metadata
|
||||
- Automatically re-executes if code is updated
|
||||
- For research: automatically re-executes if code is updated
|
||||
- Returns validation results and execution output
|
||||
|
||||
- **category_read**: Read an existing research script
|
||||
- **python_read**: Read an existing research script
|
||||
- Returns: code, metadata
|
||||
|
||||
- **category_list**: List all research scripts
|
||||
- **python_list**: List all research scripts
|
||||
- Returns: array of {name, description, metadata}
|
||||
|
||||
- **execute_research**: Manually run a research script
|
||||
@@ -186,15 +186,59 @@ Key defaults to keep in mind:
|
||||
|
||||
For multi-output indicator column extraction patterns and complete charting examples, fetch `pandas-ta-reference.md` from your knowledge base.
|
||||
|
||||
## Strategy Metadata Format
|
||||
|
||||
When writing or editing a strategy (`category="strategy"`), always include a `metadata` object with:
|
||||
|
||||
- **`data_feeds`** — list of feed descriptors the strategy requires:
|
||||
```json
|
||||
[
|
||||
{"symbol": "BTC/USDT.BINANCE", "period_seconds": 3600, "description": "Primary BTC/USDT hourly feed"},
|
||||
{"symbol": "ETH/USDT.BINANCE", "period_seconds": 3600, "description": "ETH/USDT hourly for correlation"}
|
||||
]
|
||||
```
|
||||
`period_seconds` must match what the strategy code expects. Use the same values when calling `backtest_strategy`.
|
||||
|
||||
- **`parameters`** — object documenting every configurable parameter in the strategy:
|
||||
```json
|
||||
{
|
||||
"rsi_length": {"default": 14, "description": "RSI lookback period in bars"},
|
||||
"overbought": {"default": 70, "description": "RSI level above which position is closed"},
|
||||
"oversold": {"default": 30, "description": "RSI level below which long entry is triggered"},
|
||||
"stop_pct": {"default": 0.02, "description": "Stop-loss as a fraction of entry price (e.g. 0.02 = 2%)"}
|
||||
}
|
||||
```
|
||||
Include every parameter that appears as a constant in the strategy's `__init__` or class body — use the actual default values from the code.
|
||||
|
||||
Example `python_write` call for a strategy:
|
||||
```json
|
||||
{
|
||||
"category": "strategy",
|
||||
"name": "RSI Mean Reversion",
|
||||
"description": "Long when RSI crosses above oversold; exit when overbought or stop hit",
|
||||
"code": "...",
|
||||
"metadata": {
|
||||
"data_feeds": [
|
||||
{"symbol": "BTC/USDT.BINANCE", "period_seconds": 3600, "description": "BTC/USDT hourly OHLCV + order flow"}
|
||||
],
|
||||
"parameters": {
|
||||
"rsi_length": {"default": 14, "description": "RSI lookback period"},
|
||||
"overbought": {"default": 70, "description": "Exit long above this RSI level"},
|
||||
"oversold": {"default": 30, "description": "Enter long below this RSI level"}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Coding Loop Pattern
|
||||
|
||||
When a user requests analysis:
|
||||
|
||||
1. **Understand the request**: What data is needed? What analysis? What visualization?
|
||||
|
||||
2. **Use the provided name**: The instruction will begin with `Research script name: "<name>"`. Always use that exact name when calling `category_write` or `category_edit`. Check first with `category_read` — if the script already exists, use `category_edit` to update it rather than creating a new one with `category_write`.
|
||||
2. **Use the provided name**: The instruction will begin with `Research script name: "<name>"`. Always use that exact name when calling `python_write` or `python_edit`. Check first with `python_read` — if the script already exists, use `python_edit` to update it rather than creating a new one with `python_write`.
|
||||
|
||||
3. **Write the script**: Use `category_write` (new) or `category_edit` (existing)
|
||||
3. **Write the script**: Use `python_write` (new) or `python_edit` (existing)
|
||||
- Write clean, well-commented Python code
|
||||
- Include proper error handling
|
||||
- Use appropriate ticker symbols, time ranges, and periods
|
||||
@@ -208,7 +252,7 @@ When a user requests analysis:
|
||||
|
||||
5. **Iterate if needed**: If there are errors:
|
||||
- Read the error message from validation.output or execution text
|
||||
- Use `category_edit` to fix the script
|
||||
- Use `python_edit` to fix the script
|
||||
- The script will auto-execute again
|
||||
|
||||
6. **Return results**: Once successful, summarize what was done
|
||||
@@ -246,7 +290,7 @@ When a user requests analysis:
|
||||
User: "Show me BTC price action for the last 7 days with volume"
|
||||
|
||||
You:
|
||||
1. Call `category_write` with:
|
||||
1. Call `python_write` with:
|
||||
- name: "BTC 7-Day Price Action"
|
||||
- description: "BTC/USDT price and volume analysis for the last 7 days"
|
||||
- code: (Python script that fetches data and creates chart)
|
||||
|
||||
Reference in New Issue
Block a user