118 lines
3.5 KiB
Python
118 lines
3.5 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
测试新API服务 (端口8089)
|
|
"""
|
|
|
|
import requests
|
|
import json
|
|
import time
|
|
|
|
def main():
|
|
print("🚀 测试新API服务 - 510300.SSE 回测")
|
|
print("="*60)
|
|
|
|
# 使用新端口8089
|
|
url = "http://192.168.2.154:8089/api/backtest/run"
|
|
|
|
# 简单均线策略 - 使用vnpy.app.cta_strategy导入
|
|
strategy_code = '''
|
|
from vnpy.app.cta_strategy import CtaTemplate
|
|
|
|
class SimpleMAStrategy(CtaTemplate):
|
|
"""简单均线策略"""
|
|
author = "关羽将军"
|
|
|
|
parameters = ["fast_window", "slow_window"]
|
|
variables = ["fast_ma", "slow_ma"]
|
|
|
|
def __init__(self, cta_engine, strategy_name, vt_symbol, setting):
|
|
super().__init__(cta_engine, strategy_name, vt_symbol, setting)
|
|
|
|
self.fast_window = 5
|
|
self.slow_window = 20
|
|
|
|
self.fast_ma = 0
|
|
self.slow_ma = 0
|
|
|
|
def on_init(self):
|
|
self.write_log("✅ 策略初始化完成")
|
|
self.put_event()
|
|
|
|
def on_bar(self, bar):
|
|
# 简单逻辑
|
|
if self.fast_ma > self.slow_ma and not self.pos:
|
|
self.buy(bar.close, 1)
|
|
self.write_log(f"买入: {bar.close}")
|
|
elif self.fast_ma < self.slow_ma and self.pos > 0:
|
|
self.sell(bar.close, self.pos)
|
|
self.write_log(f"卖出: {bar.close}")
|
|
|
|
self.put_event()
|
|
'''
|
|
|
|
payload = {
|
|
"strategy_code": strategy_code,
|
|
"symbol": "510300.SSE",
|
|
"interval": "1d",
|
|
"start": 20200101,
|
|
"end": 20220926,
|
|
"capital": 1000000,
|
|
}
|
|
|
|
print(f"请求参数:")
|
|
print(f" API地址: {url}")
|
|
print(f" 标的: {payload['symbol']}")
|
|
print(f" 时间: {payload['start']} - {payload['end']}")
|
|
print(f" 初始资金: {payload['capital']}")
|
|
print()
|
|
|
|
try:
|
|
start_time = time.time()
|
|
response = requests.post(url, json=payload, timeout=60)
|
|
elapsed = time.time() - start_time
|
|
|
|
print(f"请求完成,耗时: {elapsed:.2f} 秒")
|
|
print(f"状态码: {response.status_code}")
|
|
print()
|
|
|
|
if response.status_code == 200:
|
|
result = response.json()
|
|
print(f"响应内容:")
|
|
print(json.dumps(result, indent=2, ensure_ascii=False))
|
|
|
|
code = result.get('code')
|
|
if code == 200:
|
|
print("\n🎉 " + "="*60)
|
|
print("✅ 回测成功完成!")
|
|
print("="*60)
|
|
print("修复验证:")
|
|
print(" ✅ vnpy.app导入问题已解决")
|
|
print(" ✅ 510300.SSE数据已加载")
|
|
print(" ✅ 回测功能正常工作")
|
|
|
|
data = result.get('data', {})
|
|
if 'statistics' in data:
|
|
stats = data['statistics']
|
|
print(f"\n📊 回测统计:")
|
|
for key, value in stats.items():
|
|
print(f" {key}: {value}")
|
|
else:
|
|
print(f"\n📦 返回数据: {list(data.keys())}")
|
|
else:
|
|
error = result.get('error', '未知错误')
|
|
print(f"\n❌ 回测失败: {error}")
|
|
else:
|
|
print(f"❌ HTTP错误: {response.status_code}")
|
|
print(f"响应: {response.text[:200]}")
|
|
|
|
except requests.exceptions.Timeout:
|
|
print("❌ 请求超时")
|
|
except Exception as e:
|
|
print(f"❌ 异常: {e}")
|
|
|
|
print("\n" + "="*60)
|
|
print("测试完成")
|
|
print("="*60)
|
|
|
|
if __name__ == "__main__":
|
|
main() |