#!/usr/bin/env python3 """ 通过RPC测试 - 缩短到1个月验证修复(最少数据量) """ import zmq import json import traceback # 简化策略 - 简单买入持有 strategy_code = ''' from vnpy_ctastrategy import CtaTemplate, BarGenerator, ArrayManager from vnpy.trader.constant import Direction class SimpleTestStrategy(CtaTemplate): author = "测试" parameters = [] variables = ["in_position"] def __init__(self, cta_engine, strategy_name, vt_symbol, setting): super().__init__(cta_engine, strategy_name, vt_symbol, setting) self.bg = BarGenerator(self.on_bar) self.am = ArrayManager(100) self.in_position = False def on_init(self): self.load_bar(30) self.write_log("策略初始化") def on_bar(self, bar): self.am.update_bar(bar) if not self.am.inited: return # 第一天收盘买入,一直持有 if not self.in_position: self.buy(bar.close_price, 10000) self.in_position = True self.write_log(f"买入开仓 @ {bar.close_price:.2f}") self.put_event() ''' # RPC请求 - 缩短到1个月(2026-02-01 ~ 2026-03-01)≈20条K线 request = { "strategy_code": strategy_code, "symbol": "510300.SSE", "interval": "1d", "start": 1738358400, # 2025-02-01 → 不对,2026年2月 "end": 1772515200, # 2026-03-01 "capital": 1000000, "rate": 3e-5, "slippage": 0.002, "size": 10000, "pricetick": 0.001, "data_source": "sqlite" } print("Connecting to RPC: tcp://127.0.0.1:8008") context = zmq.Context() socket = context.socket(zmq.REQ) socket.setsockopt(zmq.LINGER, 0) socket.connect("tcp://127.0.0.1:8008") socket.setsockopt(zmq.RCVTIMEO, 60000) socket.setsockopt(zmq.SNDTIMEO, 60000) print("Sending request (1个月区间)...") socket.send_string(json.dumps(request)) print("Waiting for response...") try: response_json = socket.recv_string() response = json.loads(response_json) if "error" in response: print(f"\n❌ ERROR: {response['error']}") if "traceback" in response: print("\nTraceback:") print(response["traceback"]) else: print("\n✅ SUCCESS!") print("\n" + "=" * 60) print("回测结果:") print("=" * 60) if "statistics" in response: stats = response["statistics"] print(f"\n📊 绩效指标:") print(f" 总收益率: {stats.get('total_return', 0):.2%}") print(f" 总交易次数: {stats.get('total_trades', 0)}") print(f" 胜率: {stats.get('win_rate', 0):.2%}") if "trades" in response: trades = response["trades"] print(f"\n📝 交易记录: 共 {len(trades)} 笔") for idx, trade in enumerate(trades, 1): print(f" {idx}. {trade.get('datetime', '')[:10]} {trade.get('direction', '')} @ {trade.get('price', 0):.2f} × {trade.get('volume', 0)}") print("\n" + "=" * 60) print("回测完成!") print("=" * 60) except zmq.error.Again: print("\n❌ TIMEOUT: 超过1分钟仍未完成") except Exception as e: print(f"\n❌ ERROR: {e}") traceback.print_exc() finally: socket.close() context.term()