
🔗 接上篇: 我们聊了事件驱动和消息队列。
⏰ 今日主角:定时器——软件里的闹钟。
🤔 核心问题: 光靠行情推着走不够,有些事得按时做(检查仓位、收盘撤单、断线重连)。
💡 主编视角: 这个零件不起眼,但离了它,软件转不动。
🔄 一、最简单也最笨的法子:不停看表
🔁 轮询(Polling):写一个循环,每跑一圈就瞅一眼系统时间。
✅优点:逻辑简单,几行代码搞定。
❌缺点:
▪️看得太勤:CPU空转,耗在“到了没?到了没?”上,正经事没空干。
▪️看得太稀:事情就办晚了(比如该3点整平仓,3点过1秒才看到)。
💡主编解读:轮询只能干点不太要紧的杂活。真要紧的事,得换个聪明法子。
💻 二、把定时交给操作系统
📅 做法
告诉操作系统:“几点几分叫我”。然后程序就可以歇着了。时间一到,操作系统发个事件过来,程序接住就办。
✅ 优点 & ⚠️ 坑
✅ 不空转: 没到点就睡觉,省CPU。 ⚠️ 精度坑: 操作系统喊你可能晚一点点。高频交易里,这点误差能要命。
💡 主编解读:这融入了我们的事件驱动体系。定时=事件,跟行情、订单回报一样排队处理。
📋 三、一堆定时任务,怎么管不打架?
🤯 痛点: 每5秒查一次仓位、每半小时算一次风控、每天14:30撤单… 一堆任务。
📝 解法:优先队列(Priority Queue)
1. 列一张清单,每个任务写着“下次几点做”。
2. 定时器只盯排在最前面(最近要做)的那个任务。
3. 到点执行,算好下一次时间,再塞回清单排队。
⚠️ 坑: 上次任务跑太久,拖到下次时间点过了还没完?是跳过,还是报警?写代码前得想好。
⏱️ 四、交易所时间和机器时间,对不上咋办?
🤔 问题:你的机器说3点,交易所说2点59分59秒。听谁的?
💥后果:机器觉得没到3点,没撤单;交易所说3点已收盘,你的单子成了隔夜单,跳空直接亏哭。
🛠️解法:软件里建一个“交易所时钟”。
▪️ 从行情数据里拿交易所时间戳。
▪️ 算出本机时间和交易所时间的偏移量。
▪️ 定时任务用校准后的时间。
💡主编解读:跟交易直接相关的定时(如收盘撤单),必须听交易所的。
📌 五、几个用得着的经验
🚫 1. 别在定时回调里干重活: 时间一到,赶紧把活交代给别的线程,自己马上退出来。别拖累下一个任务。
🚫 2. 定时任务一定要能取消: 条件变了,得能在执行前把它撤回来。
📝 3. 记日志: 跑了多久、成功没、失败几次。定时任务最爱“默默死掉”,几个月后发现它早就罢工了。
💡 主编总结: 定时器不是最出彩的零件,但一大半稳定性问题都跟它没写好有关。
📌 下篇预告
定时器聊完了。
下一篇,聊一个更让人紧张的话题:
程序崩溃了怎么办?谁来救它?

⚠️ 风险提示: 本文纯属软件工程层面的技术科普,介绍定时器与时钟管理在自动化程序中的设计思路。文中不涉及任何具体交易策略、投资建议或代码实现。技术架构设计需结合实际业务场景,请审慎评估。
夜雨聆风