股票模拟账户中断怎么恢复:重放事件而不重复虚拟买卖
恢复股票模拟账户,不能只是重新运行最后一条买入。账户可能已经提交该事件,只是确认丢失;重复处理就会再次扣款。应从可信资产检查点开始,重放有身份的事件,核对重复内容后再推进现金股数,而不是根据当前持仓猜测中断期间发生了什么。
本指南使用单写者、单只美元股票夹具,并实际创建临时检查点文件,验证保存、重载、重复事件、缺报价、版本错误和内容损坏。不重启真实服务,不调用模型,不联系券商,也不证明 CoTrading 已有持久调度和恢复。事件账恢复仍是外部扩展方法,资产全部独立虚拟。
先定义恢复边界
检查点保存 v1 规则版本、最后提交序号、现金、股数及已处理身份到有效载荷摘要的映射。起点是序号零、现金 1000、零股和空回执。事件流已经是合成确认执行输入,程序不从缺失行情重新生成策略信号,更不通过后来的赢家推断早先本应如何交易。
规则和输入契约应与检查点共同冻结,不能因为重启后某个文件最新,就用新规则替换旧版本。新动作可能与保存库存的原路径不同。未知版本必须停止;若确有迁移需要,应另有书面政策与独立验证,不能借恢复之名改变账户语义,使新旧观察混成同一份历史。
检查点只是恢复工具,不独立证明先前全部源事件正确。需要保留事件档案与初始假设,供完整勾稽。如果没有可信起点,就不能从股票市值推出现金,也不能补编交易,让可用记录连接到一个好看的末余额。恢复结论可能只是已知最后状态、后续暂时未知,这同样是有效交付。
资产与重复回执一起提交
保存状态同时包含资产和已处理事件映射。只存现金股数、把去重留在内存,重启后就失去识别重复事件的依据;先存回执再存资产也有风险,恢复时可能跳过根本没提交的资产移动。两者应属于同一个状态表示,不能靠两个独立写入“通常很快”来假定一致。
程序构造含状态与 SHA-256 的外壳,在同目录写临时文件,刷新并同步文件后替换检查点。Python os.replace 文档说明替换及文件系统限制。本地测试不保证断电耐久,也不认证所有平台的文件系统行为,不能把一次替换成功扩大成任何环境都安全。
方法假设单写者,没有协调两个进程、锁定账户、同步分布式日志或实现生产数据库事务。真实实现需为具体存储环境设计并验证协议,不能把本地文件操作称为券商恰好执行一次保证。真实委托还有提交与回执的外部边界,当前例子没有接触,不能由虚拟账推导实盘幂等。
重复身份还要比较内容
新事件先计算规范 JSON 有效载荷摘要。身份已存在且摘要一致,返回 duplicate,不动现金股数;身份相同但价格、数量、费用或版本不同,报冲突重复。盲目忽略相同身份可能隐藏源记录纠正或不一致投递,所以去重必须保留原内容依据,不能只有一个已见过的布尔标记。
Python JSON 文档说明键排序与非有限数处理。夹具禁止 NaN 和无穷序列化,检查点由程序自己生成。加载器不是任意不可信 JSON 的完整安全导入器;外部文件的模式、大小及重复键政策需要额外校验,不能以有摘要为由假定所有结构都有效。
重复检查之后,要求事件规则版本相同,序号恰好比检查点大一。不能排序后跳过缺口,也不能因后面一笔买得起就直接推进。顺序属于资产历史;已有有效回执的重复事件虽然序号较早,仍可安全识别而不再次提交。这区别于一个新身份带来的乱序执行请求。
完整事件按守恒入账
每条新执行检查方向、正整股数量、有限正价格和有限非负费用。候选现金减去带符号数量乘价格及费用,股数加带符号数量,现金或库存负数就拒绝。按事件同价计算,交易后资产必须等于交易前资产减费用,成立后才能保存新序号和回执,不由终值近似相等替代逐笔检查。
E1 按 100 买两股、费用一,现金 799、两股。E2 按 110 卖一股、费用一,现金 908、一股。E3 按 105 买一股、费用一,现金 802、两股。单独用最终价格 110 估值,净值 1022。这些是合成金额,不是历史账户绩效;最终标价也没有反过来参与之前信号。
程序先算不中断参考状态,再保存并重载 E1 后检查点,代表事件已提交但确认可能没有到达发送方。恢复输入为 E1、E2、E2、E3,状态依次 duplicate、applied、duplicate、applied。最终加载的完整状态连同回执,必须与不中断路径完全相等,不能只比较现金而漏掉股数或去重信息。
遇到缺口就停止
从 E1 检查点开始,若 E2 的 price=None,返回 quote_unknown_stop 和原状态。E3 不能跨过去,因为其序号不是下一条,会报错。最后可信资产仍是现金 799、两股。估值可以未知,不需要编报价或假装缺失事件没有影响。现金股数已知与观察完整是两件不同的事。
缺价格测试针对重放输入,不是要求用后来价格生成一条缺失信号。信号历史缺失时,应另行找回所需观察与冻结规则,或者保持该段未解决。未来价格、当前持仓及看似合理的动作序列,都不能证明中断期间规则实际观察过什么;恢复后有新数据也不能自动补写旧决策。
其他反例包括 v2 版本的 E2、跳序事件,以及 E2 同身份但价格变成 111,都会停止而不改已知状态。程序还故意把已存现金改为 9999,却保留旧校验和,重载时拒绝。摘要能发现这种不匹配,不等于对有权限同时重写内容与摘要的人提供真实性认证。
错误恢复需要记录原因,而不是删除回执重新执行。冲突可能源于导出修正、事件命名错误或不同实验混流,处理方法各不相同。应保留原检查点与失败输入,在明确新修订政策后从可信早期状态重放。直接把冲突事件改成新身份,也不能免除序号、资金及来源检查。
摘要比较的是记录表示,不是经济等价。价格字符串 100 与 100.0 可能得到不同回执;真实导入若需规范金额表示,应在分配事件身份前冻结该变换,并保留原始来源。不能恢复到一半才增加方便的规范化,让冲突重复突然消失。交接时还应保存序列化约定及其版本,否则另一个环境使用不同表示,可能把同一来源误认为内容被修订。
运行并核对恢复证据
下载完整示例,保存 R645.py,以 Python 3.12 或更新版本执行 python R645.py。只需标准库与合成输入,临时文件只在程序自己的临时目录内创建并清理。不访问用户账户、服务目录、行情下载或已有应用状态,也没有启动参考系统的后台任务。
断言比较完整恢复状态与不中断参考,检查缺行情时状态不变,拒绝未知版本、跳序及冲突重复,并识别检查点损坏。它没有在每个写入位置真实杀死进程,也没有认证硬件故障下存储。测试范围是声明的单写者保存重载与幂等重放,不能把模拟丢确认场景写成完整故障注入认证。
交接可以恢复的观察分支
保留最后可信检查点身份、规则字节、事件档案、恢复起止原因、重复回执及未解决缺口。说明检查点是加载、从可信早期状态重建,还是被拒绝。修正事件需要新政策,相同身份下改载荷不能静默覆盖回执,否则历史观察将失去可复核依据,也无法解释为何重复扣款或漏记。
继续新观察前,先勾稽现金股数并确认所需前序事件齐全。循环重新跑起来不证明缺失机会已经评价过;行情或规则版本仍不可用时,保持账户暂停,资产已知、覆盖未知。诚实停止比通过推测动作拼一段连续虚拟历史更能支持后续研究,也避免把中断缺口误报成策略没有交易。
常见问题
重复身份是否总被忽略?
只有规范载荷与保存回执一致才忽略,冲突重复会停止重放。
这保证实盘恰好交易一次吗?
不能。仅测试单写者虚拟保存重载与重放,没有真实券商委托或生产调度。