环境隔离与资源控制
客户端内置环境与独立服务器存在本质差异。券商客户端通常基于Windows桌面框架,内置Python或VBA运行时,内存与CPU资源受限于用户终端。A股自动交易程序必须首先解决环境隔离问题。
独立进程与线程管理
将交易逻辑放入独立进程,避免与客户端主界面共享消息循环。使用multiprocessing模块创建子进程,通过队列与主进程通信。子进程崩溃不会导致客户端闪退。每个交易策略分配独立线程,线程数量不超过CPU核心数。

import multiprocessing as mp
import queue
def trading_worker(task_queue, result_queue):
while True:
try:
order = task_queue.get(timeout=1)
if order is None:
break
# 执行交易逻辑
result = execute_order(order)
result_queue.put(result)
except queue.Empty:
continue
except Exception as e:
result_queue.put({'error': str(e)})
内存与句柄限制
客户端内置环境常限制单进程内存至2GB以下。使用tracemalloc监控内存增长,每处理1000笔行情数据后强制垃圾回收。文件句柄数控制在50以内,避免因日志文件未关闭导致客户端拒绝新连接。
异常处理与容错机制
A股市场存在涨跌停、停牌、集合竞价等特殊状态。程序必须预判所有可能的中断场景。
网络断连重试
行情与交易接口分离。行情断连时,程序进入只读模式,停止新开仓。交易接口断连时,立即撤销所有未成交挂单。使用指数退避重试策略,首次等待1秒,第二次2秒,第三次4秒,上限30秒。连续10次失败后触发人工告警。
import time
import requests
def safe_request(url, max_retries=10):
for i in range(max_retries):
try:
resp = requests.get(url, timeout=3)
if resp.status_code == 200:
return resp.json()
except Exception:
pass
time.sleep(min(2 ** i, 30))
raise ConnectionError('行情接口不可用')
订单状态校验
每笔委托发出后,启动独立校验线程。每隔200毫秒查询一次订单状态,若3秒内未收到交易所确认,则主动撤单并记录异常。同时维护本地订单表,与客户端回报数据做双向比对。发现不一致时,以客户端数据为准并重置本地状态。
状态持久化与恢复
客户端可能因系统更新、杀毒软件拦截或用户误操作而重启。程序必须支持断点续跑。
轻量级数据库
使用SQLite存储持仓、挂单、成交记录和策略参数。每笔交易后立即提交事务。数据库文件放在客户端安装目录之外的独立路径,避免被卸载清除。设置WAL模式提升并发读写性能。
import sqlite3
conn = sqlite3.connect('trading_state.db')
conn.execute('PRAGMA journal_mode=WAL')
conn.execute('''CREATE TABLE IF NOT EXISTS positions
(code TEXT PRIMARY KEY, volume INTEGER, cost REAL)''')
conn.commit()
启动自检流程
程序启动时执行完整自检。读取本地数据库,对比客户端持仓界面数据。若差异超过1手,暂停交易并弹出提示。检查所有策略参数是否在合理范围,检查行情时间戳是否最新。自检通过后,进入预热状态,等待下一个交易信号。
日志与监控体系
稳定运行依赖可观测性。日志必须结构化,便于事后回溯。
分级日志记录
使用Python logging模块,设置五个级别。DEBUG记录每笔行情快照,INFO记录订单生命周期,WARNING记录重试与超时,ERROR记录订单拒绝与接口异常,CRITICAL记录资金不足或持仓超限。日志文件按天滚动,保留最近30天。每条日志包含时间戳、线程ID、订单编号和策略名称。
实时监控指标
在客户端内嵌简单监控面板,展示以下指标:行情延迟毫秒数、订单成交率、撤单率、当前持仓盈亏、策略信号频率。当行情延迟超过500毫秒或撤单率高于20%时,面板变红并发出声音告警。所有指标每5秒刷新一次,历史数据存入CSV文件供盘后分析。
定期回测与压力测试
实盘稳定不等于策略有效。程序需要定期在模拟环境验证。
历史行情回放
使用客户端内置的模拟交易功能,导入最近3个月的1分钟K线数据。以10倍速回放,检查程序是否出现内存泄漏、线程死锁或订单重复。回放过程中注入随机网络延迟和接口超时,观察容错逻辑是否触发。
极端场景模拟
构造涨跌停板打开瞬间、集合竞价最后3秒、停牌复牌第一笔等场景。测试程序能否正确处理部分成交、废单和撤单失败。每个场景运行100次,统计异常退出次数。若任何场景失败率超过1%,则修复后重新测试。
代码热更新与版本控制
客户端环境不允许频繁重启。策略参数调整需要热加载。
配置文件驱动
将策略参数写入JSON配置文件。程序每30秒检查文件修改时间,若变化则重新加载。加载前校验参数类型与范围,非法值回退到上一版本并记录错误。
灰度发布
新版本策略先运行在模拟账户,连续3个交易日无异常后,再切换至实盘小资金账户。实盘运行1周后,逐步增加资金。每次更新保留完整版本快照,支持一键回滚。
与期货程序的差异处理
A股自动交易与期货程序在稳定性设计上有显著区别。A股存在T+1限制,当日买入无法卖出,持仓状态必须精确区分可用与冻结。期货程序需处理保证金和强平逻辑,而A股程序需处理涨跌停板上的排队成交。客户端内置环境对期货程序往往提供CTP接口,对A股则多为券商私有协议。编写A股程序时,必须使用客户端提供的委托查询函数,不可依赖通用API。期货程序常见的夜盘连续交易,在A股程序中应替换为集合竞价特殊处理。两者共用异常处理框架,但状态持久化表结构不同。A股程序需要额外记录当日买入冻结数量,期货程序需要记录保证金占用。
每次实盘前,逐项确认:独立进程已启动,数据库连接正常,行情时间戳在3秒内,订单校验线程活跃,日志文件可写,内存占用低于500MB,无未捕获异常。任何一项失败,禁止开始交易。稳定性的本质是冗余与快速失败。程序不应追求永不崩溃,而应追求崩溃后10秒内恢复并保持数据一致。