Python使用quickfix连接FIX服务器报CompID错误无法登录
问题原因
- 核心错误:配置与会话实际参数不匹配。你在ini配置文件的SESSION段填写的
TargetCompID=XMEF、TargetSubID=M3是错误值,对接的服务器返回的登录消息中SenderCompID=BMEX、SenderSubID=EQ。QuickFIX会严格校验收到消息的头部字段:收到消息的SenderCompID必须等于本地配置的TargetCompID,收到消息的TargetCompID必须等于本地配置的SenderCompID,SenderSubID/TargetSubID校验规则同理,校验不通过就会触发CompID problem错误,直接断开连接。 - 次要错误:你在
toAdmin方法中硬编码修改登录消息的头部TargetCompID、TargetSubID为正确值,但没有同步修改ini配置,导致发送的登录消息符合服务器要求,但本地校验服务器返回消息时还是用错误的配置参数,触发校验失败。 - 额外小问题:配置的会话时间存在冲突,DEFAULT段
EndTime=23:59:00,SESSION段EndTime=00:00:00,可能引发会话生命周期异常。
修复方案
- 优先修改ini配置文件的SESSION段参数,替换为实际的正确值:
[SESSION] # 保留原有其他配置,修改以下两个参数 TargetCompID=BMEX TargetSubID=EQ # 建议统一会话时间,全天运行可调整为 EndTime=23:59:59
- 精简
toAdmin方法代码:SenderCompID、SenderSubID、TargetCompID、TargetSubID、MsgSeqNum(34)这些标准字段QuickFIX会自动从配置和会话状态中读取填充,不需要手动硬编码设置,避免手动赋值和配置不一致的问题,仅保留自定义字段、用户名密码的设置即可,参考修改后的代码:
def toAdmin(self, message, sessionID): msg_type = fix.MsgType() message.getHeader().getField(msg_type) if msg_type.getString() == fix.MsgType_Logon: message.getHeader().setField(fix.StringField(1408, "T5.10")) message.setField(fix.Username("8826350")) message.setField(fix.Password("******")) print("Logon msg to Admin")
- 排查SSL问题时可临时把
SSLValidateCertificates=Y改为SSLValidateCertificates=N,确认连接正常后再按需开启证书校验。
补充说明
你观察到的拒绝消息未实际发送是正常现象:QuickFIX在会话未完成登录状态下检测到协议错误时,只会在本地打印日志,不会对外发送拒绝消息,会直接断开连接。反复重连是因为你配置了ReconnectInterval=30,解决CompID校验问题后重连现象就会消失。
内容的提问来源于stack exchange,提问作者Xaruman
相关产品推荐
相关产品推荐

