IBKR(盈透证券)交易bot偶发无法接收数据问题排查咨询
IBKR 交易Bot偶发CSV无新增数据无报错排查步骤
不要上来就默认是连接链路问题,按从易到难的顺序逐层埋点排查:
- 先排除文件写入层的假故障
调试阶段先把CSV文件打开的缓冲关掉:open('price.csv', 'a', newline='', buffering=0),每次写入后强制调用os.fsync(f.fileno())把系统缓冲区的数据刷到磁盘,避免Python/OS的IO缓冲把数据卡在内存里,看起来像没写入。
给写入逻辑加全链路日志:记录每次触发写入的时间、待写入数据条目数、写入操作的返回值,不要用裸except:吞掉所有写入异常,哪怕是IOError、PermissionError也要全量打堆栈。另外排查有没有其他进程占用CSV文件——比如你手动开着表格看数据、杀毒软件扫描、云同步盘同步文件时,Windows环境下Python可能卡在获取文件锁的步骤,不会立刻抛错,直接表现为写入卡住。 - 再排查IBKR链路的静默断连问题
IBKR的TWS/IB Gateway静默断连是高频已知问题,断连时不会主动给客户端推通用错误提示,如果你没绑全回调事件根本感知不到:- 把API的所有系统回调都绑上日志:包括
connectionClosed、disconnected、error(注意错误码不要过滤,哪怕是提示类的信息码也全打日志),不要只监听价格推送的业务回调 - 加主动心跳检测:每30秒主动调用
reqCurrentTime()向服务端发请求,连续2次没收到返回就判定连接僵死,不要等API自己报故障。同时记录每次收到价格推送的时间,如果超过你平时推送间隔的2倍还没收到新数据,直接触发连接状态检查 - 绝对不要在IBKR的回调线程里直接做文件写入操作:IBKR的消息回调是单线程串行处理的,要是写入逻辑卡了(比如等文件锁、IO阻塞),会直接堵死整个消息接收链路,后续所有价格数据都进不来,自然不会有新数据写CSV,也不会抛错。正确做法是收到推送后先把数据塞到线程安全的内存队列,单独开一个独立的写入线程从队列取数据写文件,把网络接收和磁盘IO完全解耦。
- 把API的所有系统回调都绑上日志:包括
- 最后加线程存活监控定位卡涩点
给每个工作线程(消息接收线程、写入线程)加心跳戳,每隔10秒更新一次自己的最新存活时间,主线程轮询所有心跳戳,如果某个线程超过30秒没更新,直接打印所有线程的当前调用栈,就能直接看到代码具体卡在哪一行,是卡在网络读等待、文件锁等待还是其他逻辑上。
小提示:如果跑在Windows上,记得关闭Windows Defender的实时扫描对CSV存储目录的扫描,很多时候是杀毒软件锁了文件导致写入卡住,完全不会抛可读错误。
内容的提问来源于stack exchange,提问作者Bryce Turner
相关产品推荐
相关产品推荐

