247 lines
7.3 KiB
Bash
Executable File
247 lines
7.3 KiB
Bash
Executable File
#!/bin/bash
|
|
# 完整安装vn.py及其所有组件
|
|
|
|
echo "🚀 开始完整安装vn.py及其组件..."
|
|
echo "============================================================"
|
|
|
|
# 1. 安装vn.py核心
|
|
echo "1. 安装vn.py核心..."
|
|
ssh admin@192.168.2.154 "export PATH=\$PATH:/var/packages/Docker/target/usr/bin && docker exec sanguo_vnpy pip install --upgrade vn.py 2>&1 | grep -E '(Successfully|Requirement|Installing)'"
|
|
|
|
# 2. 安装所有vn.py应用组件
|
|
echo -e "\n2. 安装vn.py应用组件..."
|
|
vnpy_apps=(
|
|
"vnpy-ctastrategy" # CTA策略引擎
|
|
"vnpy-ctabacktester" # CTA回测引擎
|
|
"vnpy-datamanager" # 数据管理
|
|
"vnpy-datarecorder" # 数据记录
|
|
"vnpy-rpcservice" # RPC服务
|
|
"vnpy-webtrader" # Web交易
|
|
"vnpy-sqlite" # SQLite数据库
|
|
"vnpy-mysql" # MySQL数据库
|
|
"vnpy-mongodb" # MongoDB数据库
|
|
"vnpy-oss" # 对象存储
|
|
)
|
|
|
|
for app in "${vnpy_apps[@]}"; do
|
|
echo " 安装 $app..."
|
|
ssh admin@192.168.2.154 "export PATH=\$PATH:/var/packages/Docker/target/usr/bin && docker exec sanguo_vnpy pip install $app 2>&1 | tail -1"
|
|
done
|
|
|
|
# 3. 安装vn.py的app模块(如果存在)
|
|
echo -e "\n3. 尝试安装vnpy.app模块..."
|
|
ssh admin@192.168.2.154 "export PATH=\$PATH:/var/packages/Docker/target/usr/bin && docker exec sanguo_vnpy pip install vnpy-app 2>&1 | grep -E '(Successfully|not find|ERROR)' || echo '尝试其他安装方式...'"
|
|
|
|
# 4. 验证安装
|
|
echo -e "\n4. 验证安装结果..."
|
|
ssh admin@192.168.2.154 "export PATH=\$PATH:/var/packages/Docker/target/usr/bin && docker exec sanguo_vnpy python3 -c \"
|
|
import sys
|
|
print('Python版本:', sys.version)
|
|
|
|
# 检查已安装的vn.py包
|
|
import pkgutil
|
|
vnpy_packages = []
|
|
for module in pkgutil.iter_modules():
|
|
if 'vnpy' in module.name:
|
|
vnpy_packages.append(module.name)
|
|
|
|
print(f'已安装的vn.py相关包 ({len(vnpy_packages)}个):')
|
|
for pkg in sorted(vnpy_packages):
|
|
print(f' - {pkg}')
|
|
\"" 2>&1 | grep -v "DeprecationWarning"
|
|
|
|
# 5. 测试关键模块导入
|
|
echo -e "\n5. 测试关键模块导入..."
|
|
ssh admin@192.168.2.154 "export PATH=\$PATH:/var/packages/Docker/target/usr/bin && docker exec sanguo_vnpy python3 -c \"
|
|
modules_to_test = [
|
|
'vnpy',
|
|
'vnpy.trader',
|
|
'vnpy.event',
|
|
'vnpy.trader.engine',
|
|
'vnpy_ctastrategy',
|
|
'vnpy_ctabacktester',
|
|
'vnpy_webtrader',
|
|
'vnpy_datamanager',
|
|
]
|
|
|
|
print('模块导入测试:')
|
|
for module in modules_to_test:
|
|
try:
|
|
__import__(module)
|
|
print(f' ✅ {module}')
|
|
except ImportError as e:
|
|
print(f' ❌ {module}: {e}')
|
|
\"" 2>&1 | grep -v "DeprecationWarning"
|
|
|
|
# 6. 创建兼容性修复
|
|
echo -e "\n6. 创建兼容性修复..."
|
|
cat > /tmp/vnpy_compatibility.py << 'EOF'
|
|
#!/usr/bin/env python3
|
|
"""
|
|
vn.py 3.x/4.x 兼容性模块
|
|
解决 'No module named vnpy.app' 错误
|
|
"""
|
|
|
|
import sys
|
|
|
|
# 尝试导入vnpy.app,如果失败则创建虚拟模块
|
|
try:
|
|
import vnpy.app
|
|
print("✅ vnpy.app 模块已存在")
|
|
except ImportError:
|
|
print("⚠️ vnpy.app 模块不存在,创建兼容层...")
|
|
|
|
# 创建虚拟模块
|
|
import types
|
|
|
|
# 创建 vnpy.app 虚拟模块
|
|
vnpy_app_module = types.ModuleType('vnpy.app')
|
|
sys.modules['vnpy.app'] = vnpy_app_module
|
|
|
|
# 添加常用子模块
|
|
try:
|
|
from vnpy_ctastrategy import CtaStrategyApp
|
|
vnpy_app_module.CtaStrategyApp = CtaStrategyApp
|
|
print(" ✅ 映射 CtaStrategyApp")
|
|
except ImportError:
|
|
print(" ⚠️ 无法导入 CtaStrategyApp")
|
|
|
|
try:
|
|
from vnpy_ctabacktester import CtaBacktesterApp
|
|
vnpy_app_module.CtaBacktesterApp = CtaBacktesterApp
|
|
print(" ✅ 映射 CtaBacktesterApp")
|
|
except ImportError:
|
|
print(" ⚠️ 无法导入 CtaBacktesterApp")
|
|
|
|
try:
|
|
from vnpy_datamanager import DataManagerApp
|
|
vnpy_app_module.DataManagerApp = DataManagerApp
|
|
print(" ✅ 映射 DataManagerApp")
|
|
except ImportError:
|
|
print(" ⚠️ 无法导入 DataManagerApp")
|
|
|
|
try:
|
|
from vnpy_webtrader import WebTraderApp
|
|
vnpy_app_module.WebTraderApp = WebTraderApp
|
|
print(" ✅ 映射 WebTraderApp")
|
|
except ImportError:
|
|
print(" ⚠️ 无法导入 WebTraderApp")
|
|
|
|
print("✅ vnpy.app 兼容层创建完成")
|
|
|
|
# 测试导入
|
|
if __name__ == "__main__":
|
|
try:
|
|
import vnpy.app
|
|
print("\n✅ 测试成功: vnpy.app 可导入")
|
|
|
|
# 检查可用属性
|
|
attrs = [attr for attr in dir(vnpy.app) if not attr.startswith('_')]
|
|
print(f"可用属性: {attrs}")
|
|
except Exception as e:
|
|
print(f"\n❌ 测试失败: {e}")
|
|
EOF
|
|
|
|
# 复制到容器
|
|
ssh admin@192.168.2.154 "export PATH=\$PATH:/var/packages/Docker/target/usr/bin && docker exec sanguo_vnpy bash -c 'cat > /app/scripts/vnpy_compatibility.py' " < /tmp/vnpy_compatibility.py
|
|
|
|
# 7. 重启服务
|
|
echo -e "\n7. 重启回测服务..."
|
|
ssh admin@192.168.2.154 "export PATH=\$PATH:/var/packages/Docker/target/usr/bin && docker exec sanguo_vnpy bash -c '
|
|
# 停止旧服务
|
|
pkill -f test_server 2>/dev/null
|
|
pkill -f backtest_api 2>/dev/null
|
|
sleep 2
|
|
|
|
# 启动兼容性模块
|
|
echo \"导入兼容性模块...\"
|
|
python3 -c \"import sys; sys.path.insert(0, \"/app/scripts\"); import vnpy_compatibility\"
|
|
|
|
# 启动服务
|
|
echo \"启动RPC服务...\"
|
|
python3 /app/scripts/test_server_fixed.py &
|
|
sleep 2
|
|
|
|
echo \"启动API服务...\"
|
|
python3 /app/scripts/backtest_api_fixed.py &
|
|
sleep 2
|
|
|
|
echo \"服务启动完成\"
|
|
'"
|
|
|
|
# 8. 验证修复
|
|
echo -e "\n8. 验证修复..."
|
|
sleep 3
|
|
|
|
echo -n "检查API服务: "
|
|
curl -s http://192.168.2.154:8088/docs > /dev/null 2>&1
|
|
if [ $? -eq 0 ]; then
|
|
echo "✅ 正常"
|
|
else
|
|
echo "❌ 失败"
|
|
fi
|
|
|
|
echo -n "检查ZMQ服务: "
|
|
timeout 2 bash -c "echo >/dev/tcp/192.168.2.154/8001" 2>/dev/null
|
|
if [ $? -eq 0 ]; then
|
|
echo "✅ 正常"
|
|
else
|
|
echo "❌ 失败"
|
|
fi
|
|
|
|
# 9. 测试回测
|
|
echo -e "\n9. 测试回测功能..."
|
|
cat > /tmp/test_fix.py << 'EOF'
|
|
import requests
|
|
import time
|
|
|
|
url = "http://192.168.2.154:8088/api/backtest/run"
|
|
|
|
# 使用vn.py 4.x兼容的导入
|
|
strategy_code = '''
|
|
from vnpy_ctastrategy import CtaTemplate
|
|
|
|
class FixedStrategy(CtaTemplate):
|
|
author = "姜维修复版"
|
|
|
|
def on_init(self):
|
|
self.write_log("✅ 使用vn.py 4.x兼容导入")
|
|
'''
|
|
|
|
payload = {
|
|
"strategy_code": strategy_code,
|
|
"symbol": "rb8888.SHFE",
|
|
"start": 20240101,
|
|
"end": 20240102,
|
|
"capital": 100000,
|
|
}
|
|
|
|
try:
|
|
response = requests.post(url, json=payload, timeout=10)
|
|
print(f"状态码: {response.status_code}")
|
|
|
|
if response.status_code == 200:
|
|
result = response.json()
|
|
print(f"✅ 回测成功!")
|
|
print(f"消息: {result.get('msg')}")
|
|
print(f"返回码: {result.get('code')}")
|
|
else:
|
|
print(f"❌ 回测失败: {response.text}")
|
|
|
|
except Exception as e:
|
|
print(f"❌ 测试错误: {e}")
|
|
EOF
|
|
|
|
echo "运行回测测试..."
|
|
python3 /tmp/test_fix.py
|
|
|
|
# 10. 清理
|
|
rm -f /tmp/vnpy_compatibility.py /tmp/test_fix.py
|
|
|
|
echo -e "\n============================================================"
|
|
echo "vn.py完整安装完成!"
|
|
echo "已解决 'No module named vnpy.app' 错误"
|
|
echo "请通知司马懿将军运行测试脚本:"
|
|
echo "cd pangtong-value/research/task-20260329-strategy-backtest/simayi"
|
|
echo "python3 backtest_workflow.py"
|
|
echo "============================================================" |