mirror of
https://github.com/Xe138/AI-Trader.git
synced 2026-04-02 01:27:24 -04:00
Compare commits
6 Commits
v0.2.0-alp
...
v0.2.0
| Author | SHA1 | Date | |
|---|---|---|---|
| 5da02b4ba0 | |||
| 11509ba8c7 | |||
| 1785f9b06f | |||
| 55206549c7 | |||
| 9e05ce0891 | |||
| 2f2c1d6ea2 |
@@ -30,3 +30,9 @@ WEB_HTTP_PORT=8888
|
||||
|
||||
# Agent Configuration
|
||||
AGENT_MAX_STEP=30
|
||||
|
||||
# Data Volume Configuration
|
||||
# Base directory for all persistent data (will contain data/, logs/, configs/ subdirectories)
|
||||
# Use relative paths (./volumes) or absolute paths (/home/user/ai-trader-volumes)
|
||||
# Defaults to current directory (.) if not set
|
||||
VOLUME_PATH=.
|
||||
|
||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -57,6 +57,7 @@ delete.py
|
||||
refresh_data.sh
|
||||
|
||||
# Config files (optional - uncomment if needed)
|
||||
configs/custom_config.json
|
||||
configs/day_config.json
|
||||
configs/hour_config.json
|
||||
configs/test_config.json
|
||||
|
||||
26
CHANGELOG.md
26
CHANGELOG.md
@@ -7,30 +7,50 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
## [0.2.0] - 2025-10-30
|
||||
## [0.2.0] - 2025-10-31
|
||||
|
||||
### Added
|
||||
- Complete Docker deployment support with containerization
|
||||
- Docker Compose orchestration for easy local deployment
|
||||
- Multi-stage Dockerfile with Python 3.10-slim base image
|
||||
- Automated CI/CD pipeline via GitHub Actions for release builds
|
||||
- Automatic draft release creation with version tagging
|
||||
- Docker images published to GitHub Container Registry (ghcr.io)
|
||||
- Comprehensive Docker documentation (docs/DOCKER.md)
|
||||
- Release process documentation (docs/RELEASING.md)
|
||||
- Data cache reuse design documentation (docs/DESIGN_DATA_CACHE_REUSE.md)
|
||||
- CLAUDE.md repository guidance for development
|
||||
- Docker deployment section in main README
|
||||
- Environment variable configuration via docker-compose
|
||||
- Sequential startup script (entrypoint.sh) for data fetch, MCP services, and trading agent
|
||||
- Volume mounts for data and logs persistence
|
||||
- Pre-built image support from ghcr.io/hkuds/ai-trader
|
||||
- Pre-built image support from ghcr.io/xe138/ai-trader
|
||||
- Configurable volume path for persistent data
|
||||
- Configurable web interface host port
|
||||
- Automated merged.jsonl creation during price fetching
|
||||
- API key registration URLs in .env.example
|
||||
|
||||
### Changed
|
||||
- Updated .env.example with Docker-specific configuration and paths
|
||||
- Updated .env.example with Docker-specific configuration, API key URLs, and paths
|
||||
- Updated .gitignore to exclude git worktrees directory
|
||||
- Removed deprecated version tag from docker-compose.yml
|
||||
- Updated repository URLs to Xe138/AI-Trader fork
|
||||
- Docker Compose now uses pre-built image by default
|
||||
- Simplified Docker config file selection with convention over configuration
|
||||
- Fixed internal ports with configurable host ports
|
||||
- Separated data scripts from volume mount directory
|
||||
- Reduced log flooding during data fetch
|
||||
- OPENAI_API_BASE can now be left empty in configuration
|
||||
|
||||
### Fixed
|
||||
- Docker Compose configuration now follows modern best practices (version-less)
|
||||
- Prevent restart loop on missing API keys with proper validation
|
||||
- Docker tag generation now converts repository owner to lowercase
|
||||
- Validate GITHUB_REF is a tag in docker-release workflow
|
||||
- Correct Dockerfile FROM AS casing
|
||||
- Module import errors for MCP services resolved with PYTHONPATH
|
||||
- Prevent price data overwrite on container restart
|
||||
- Merge script now writes to current directory for volume compatibility
|
||||
|
||||
## [0.1.0] - Initial Release
|
||||
|
||||
|
||||
@@ -1,8 +1,12 @@
|
||||
import requests
|
||||
import os
|
||||
from dotenv import load_dotenv
|
||||
load_dotenv()
|
||||
import json
|
||||
import os
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
import requests
|
||||
from dotenv import load_dotenv
|
||||
|
||||
load_dotenv()
|
||||
|
||||
|
||||
all_nasdaq_100_symbols = [
|
||||
@@ -42,4 +46,15 @@ if __name__ == "__main__":
|
||||
for symbol in all_nasdaq_100_symbols:
|
||||
get_daily_price(symbol)
|
||||
|
||||
get_daily_price("QQQ")
|
||||
get_daily_price("QQQ")
|
||||
|
||||
# Automatically run merge after fetching
|
||||
print("\n📦 Merging price data...")
|
||||
try:
|
||||
script_dir = os.path.dirname(os.path.abspath(__file__))
|
||||
merge_script = os.path.join(script_dir, "merge_jsonl.py")
|
||||
subprocess.run([sys.executable, merge_script], check=True)
|
||||
print("✅ Price data merged successfully")
|
||||
except Exception as e:
|
||||
print(f"⚠️ Failed to merge data: {e}")
|
||||
print(" Please run 'python merge_jsonl.py' manually")
|
||||
@@ -18,7 +18,8 @@ all_nasdaq_100_symbols = [
|
||||
]
|
||||
|
||||
# 合并所有以 daily_price 开头的 json,逐文件一行写入 merged.jsonl
|
||||
current_dir = os.path.dirname(__file__)
|
||||
# Use current working directory instead of script directory for volume compatibility
|
||||
current_dir = os.getcwd()
|
||||
pattern = os.path.join(current_dir, 'daily_price*.json')
|
||||
files = sorted(glob.glob(pattern))
|
||||
|
||||
|
||||
@@ -5,8 +5,9 @@ services:
|
||||
# build: .
|
||||
container_name: ai-trader-app
|
||||
volumes:
|
||||
- ./data:/app/data
|
||||
- ./logs:/app/logs
|
||||
- ${VOLUME_PATH:-.}/data:/app/data
|
||||
- ${VOLUME_PATH:-.}/logs:/app/logs
|
||||
- ${VOLUME_PATH:-.}/configs:/app/configs
|
||||
environment:
|
||||
# AI Model API Configuration
|
||||
- OPENAI_API_BASE=${OPENAI_API_BASE}
|
||||
|
||||
101
docs/DOCKER.md
101
docs/DOCKER.md
@@ -53,10 +53,30 @@ AGENT_MAX_STEP=30
|
||||
|
||||
### Custom Trading Configuration
|
||||
|
||||
Pass a custom config file:
|
||||
**Simple Method (Recommended):**
|
||||
|
||||
Create a `configs/custom_config.json` file - it will be automatically used:
|
||||
|
||||
```bash
|
||||
docker-compose run ai-trader configs/my_config.json
|
||||
# Copy default config as starting point
|
||||
cp configs/default_config.json configs/custom_config.json
|
||||
|
||||
# Edit your custom config
|
||||
nano configs/custom_config.json
|
||||
|
||||
# Run normally - custom_config.json is automatically detected!
|
||||
docker-compose up
|
||||
```
|
||||
|
||||
**Priority order:**
|
||||
1. `configs/custom_config.json` (if exists) - **Highest priority**
|
||||
2. Command-line argument: `docker-compose run ai-trader configs/other.json`
|
||||
3. `configs/default_config.json` (fallback)
|
||||
|
||||
**Advanced: Use a different config file name:**
|
||||
|
||||
```bash
|
||||
docker-compose run ai-trader configs/my_special_config.json
|
||||
```
|
||||
|
||||
## Usage Examples
|
||||
@@ -92,16 +112,43 @@ docker-compose up
|
||||
|
||||
### Volume Mounts
|
||||
|
||||
Docker Compose mounts two volumes:
|
||||
Docker Compose mounts three volumes for persistent data. By default, these are stored in the project directory:
|
||||
|
||||
- `./data:/app/data` - Price data and trading records
|
||||
- `./logs:/app/logs` - MCP service logs
|
||||
- `./configs:/app/configs` - Configuration files (allows editing configs without rebuilding)
|
||||
|
||||
Data persists across container restarts. To reset:
|
||||
### Custom Volume Location
|
||||
|
||||
You can change where data is stored by setting `VOLUME_PATH` in your `.env` file:
|
||||
|
||||
```bash
|
||||
# Store data in a different location
|
||||
VOLUME_PATH=/home/user/trading-data
|
||||
|
||||
# Or use a relative path
|
||||
VOLUME_PATH=./volumes
|
||||
```
|
||||
|
||||
This will store data in:
|
||||
- `/home/user/trading-data/data/`
|
||||
- `/home/user/trading-data/logs/`
|
||||
- `/home/user/trading-data/configs/`
|
||||
|
||||
**Note:** The directory structure is automatically created. You'll need to copy your existing configs:
|
||||
```bash
|
||||
# After changing VOLUME_PATH
|
||||
mkdir -p /home/user/trading-data/configs
|
||||
cp configs/custom_config.json /home/user/trading-data/configs/
|
||||
```
|
||||
|
||||
### Reset Data
|
||||
|
||||
To reset all trading data:
|
||||
|
||||
```bash
|
||||
docker-compose down
|
||||
rm -rf data/agent_data/* logs/*
|
||||
rm -rf ${VOLUME_PATH:-.}/data/agent_data/* ${VOLUME_PATH:-.}/logs/*
|
||||
docker-compose up
|
||||
```
|
||||
|
||||
@@ -227,13 +274,45 @@ Services exposed on host:
|
||||
|
||||
### Test Different Configurations
|
||||
|
||||
```bash
|
||||
# Create test config
|
||||
cp configs/default_config.json configs/test_config.json
|
||||
# Edit test_config.json
|
||||
**Method 1: Use the standard custom_config.json**
|
||||
|
||||
# Run with test config
|
||||
docker-compose run ai-trader configs/test_config.json
|
||||
```bash
|
||||
# Create and edit your config
|
||||
cp configs/default_config.json configs/custom_config.json
|
||||
nano configs/custom_config.json
|
||||
|
||||
# Run - automatically uses custom_config.json
|
||||
docker-compose up
|
||||
```
|
||||
|
||||
**Method 2: Test multiple configs with different names**
|
||||
|
||||
```bash
|
||||
# Create multiple test configs
|
||||
cp configs/default_config.json configs/conservative.json
|
||||
cp configs/default_config.json configs/aggressive.json
|
||||
|
||||
# Edit each config...
|
||||
|
||||
# Test conservative strategy
|
||||
docker-compose run ai-trader configs/conservative.json
|
||||
|
||||
# Test aggressive strategy
|
||||
docker-compose run ai-trader configs/aggressive.json
|
||||
```
|
||||
|
||||
**Method 3: Temporarily switch configs**
|
||||
|
||||
```bash
|
||||
# Temporarily rename your custom config
|
||||
mv configs/custom_config.json configs/custom_config.json.backup
|
||||
cp configs/test_strategy.json configs/custom_config.json
|
||||
|
||||
# Run with test strategy
|
||||
docker-compose up
|
||||
|
||||
# Restore original
|
||||
mv configs/custom_config.json.backup configs/custom_config.json
|
||||
```
|
||||
|
||||
## Production Deployment
|
||||
|
||||
@@ -38,12 +38,18 @@ fi
|
||||
echo "✅ Environment variables validated"
|
||||
|
||||
# Step 1: Data preparation
|
||||
echo "📊 Fetching and merging price data..."
|
||||
# Run scripts from /app/scripts but output to /app/data
|
||||
cd /app/data
|
||||
python /app/scripts/get_daily_price.py
|
||||
python /app/scripts/merge_jsonl.py
|
||||
cd /app
|
||||
echo "📊 Checking price data..."
|
||||
if [ -f "/app/data/merged.jsonl" ] && [ -s "/app/data/merged.jsonl" ]; then
|
||||
echo "✅ Using existing price data ($(wc -l < /app/data/merged.jsonl) stocks)"
|
||||
echo " To refresh data, delete /app/data/merged.jsonl and restart"
|
||||
else
|
||||
echo "📊 Fetching and merging price data..."
|
||||
# Run script from /app/scripts but output to /app/data
|
||||
# Note: get_daily_price.py now automatically calls merge_jsonl.py after fetching
|
||||
cd /app/data
|
||||
python /app/scripts/get_daily_price.py
|
||||
cd /app
|
||||
fi
|
||||
|
||||
# Step 2: Start MCP services in background
|
||||
echo "🔧 Starting MCP services..."
|
||||
@@ -57,7 +63,19 @@ sleep 3
|
||||
|
||||
# Step 4: Run trading agent with config file
|
||||
echo "🤖 Starting trading agent..."
|
||||
CONFIG_FILE="${1:-configs/default_config.json}"
|
||||
|
||||
# Smart config selection: custom_config.json takes precedence if it exists
|
||||
if [ -f "configs/custom_config.json" ]; then
|
||||
CONFIG_FILE="configs/custom_config.json"
|
||||
echo "✅ Using custom configuration: configs/custom_config.json"
|
||||
elif [ -n "$1" ]; then
|
||||
CONFIG_FILE="$1"
|
||||
echo "✅ Using specified configuration: $CONFIG_FILE"
|
||||
else
|
||||
CONFIG_FILE="configs/default_config.json"
|
||||
echo "✅ Using default configuration: configs/default_config.json"
|
||||
fi
|
||||
|
||||
python main.py "$CONFIG_FILE"
|
||||
|
||||
# Cleanup on exit
|
||||
|
||||
2
main.sh
2
main.sh
@@ -10,8 +10,8 @@ echo "🚀 Launching AI Trader Environment..."
|
||||
|
||||
echo "📊 Now getting and merging price data..."
|
||||
cd ./data
|
||||
# Note: get_daily_price.py now automatically calls merge_jsonl.py after fetching
|
||||
python get_daily_price.py
|
||||
python merge_jsonl.py
|
||||
cd ../
|
||||
|
||||
echo "🔧 Now starting MCP services..."
|
||||
|
||||
Reference in New Issue
Block a user