#!/bin/bash # ============================================ # 同步策略 + 全自动回测,不需要重启 Docker! # 使用方法: # ./sync_and_run_backtest.sh --strategy strategies.pangtong-value.strategy_A # ============================================ set -e # 配置信息 NAS_IP="192.168.2.154" NAS_USER="admin" LOCAL_PROJECT="/Users/chufeng/.openclaw/sanguo_projects/sanguo_quant_live" NAS_TARGET="/volume1/stock/sanguo_vnpy" DOCKER_CONTAINER="sanguo_vnpy" # 颜色 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' log_info() { echo -e "${GREEN}[INFO]${NC} $1" } log_warn() { echo -e "${YELLOW}[WARN]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } # 解析参数 while [[ $# -gt 0 ]]; do case $1 in --strategy) STRATEGY="$2" shift shift ;; *) shift ;; esac done # 检查参数 if [[ -z "$STRATEGY" ]]; then log_error "必须指定 --strategy 参数" echo "" echo "使用方法:" echo " $0 --strategy strategies.pangtong-value.strategy_A" echo "" exit 1 fi # 提取策略路径(用于同步) # strategies.pangtong-value.strategy_A → strategies/pangtong-value STRATEGY_PATH=$(echo "$STRATEGY" | tr '.' '/') STRATEGY_PATH=$(dirname "$STRATEGY_PATH") echo "============================================" echo " 同步策略 + 全自动回测(无需重启 Docker)" echo "============================================" echo "" log_info "策略: $STRATEGY" log_info "策略路径: $STRATEGY_PATH" echo "" # 第一步:同步策略代码到 NAS log_info "1/3: 同步策略代码到 NAS" rsync -av --delete \ "$LOCAL_PROJECT/$STRATEGY_PATH"/ \ "$NAS_USER@$NAS_IP:$NAS_TARGET/$STRATEGY_PATH"/ \ --exclude='__pycache__' \ --exclude='*.pyc' \ --exclude='.ipynb_checkpoints' \ --exclude='.DS_Store' log_info "✅ 同步完成" echo "" # 第二步:在容器中运行回测 log_info "2/3: 在运行的容器中执行回测" echo "" ssh "$NAS_USER@$NAS_IP" "export PATH=\$PATH:/var/packages/Docker/target/usr/bin && docker exec $DOCKER_CONTAINER python /app/scripts/run_backtest_auto.py $STRATEGY" log_info "✅ 回测执行完成" echo "" # 第三步:同步回测结果回本地 log_info "3/3: 同步回测结果回本地" echo "" # 结果目录 RESULT_PATH="$STRATEGY_PATH/backtest_results" mkdir -p "$LOCAL_PROJECT/$RESULT_PATH" rsync -av \ "$NAS_USER@$NAS_IP:$NAS_TARGET/$RESULT_PATH"/ \ "$LOCAL_PROJECT/$RESULT_PATH"/ \ --exclude='__pycache__' log_info "✅ 结果同步完成" echo "" echo "============================================" echo " 🎉 回测完成!" echo "============================================" echo "" echo "📄 结果位置:" echo " NAS: $NAS_TARGET/$RESULT_PATH/" echo " 本地: $LOCAL_PROJECT/$RESULT_PATH/" echo "" echo "📊 直接查看结果:" echo " cat $LOCAL_PROJECT/$RESULT_PATH/*.txt" echo " open $LOCAL_PROJECT/$RESULT_PATH/*.png" echo ""