QuickFix/Go对接Coinbase Exchange的LOGON序列问题求助
QuickFix/Go与Coinbase FIX会话恢复适配方案
问题本质
Coinbase的FIX会话恢复是其特定实现:即便客户端发送ResetSeqNumFlag=N的LOGON请求,Coinbase的LOGON响应仍会使用MsgSeqNum=1,随后立刻发送带GapFillFlag=Y的SequenceReset消息,将目标序列号跳转到上一会话的正确值。这不属于违反FIX协议,而是Coinbase自定义的重连流程,QuickFix/Go默认逻辑无法直接适配,因此需要手动调整。
正确处理方式
1. 保留现有配置
维持ResetOnLogon=N、ResetOnDisconnect=N、ResetOnLogout=N的配置,这符合你仅在每周六强制登出时重置序列的需求。
2. 优化FromAdmin处理器
你当前手动调整TSN的思路可行,但可优化为仅在重连场景下触发,避免首次登录的不必要操作:
func (a *App) FromAdmin(msg *quickfix.Message, sessionID quickfix.SessionID) (reject quickfix.MessageRejectError) { if msg.IsMsgTypeOf(string(enum.MsgType_LOGON)) { // 获取当前预期的下一个目标序列号 currentTSN, err := quickfix.NextTargetMsgSeqNum(sessionID) if err == nil && currentTSN > 1 { // 仅在重连场景(预期TSN>1)下,接受Coinbase的LOGON响应(Seq=1) msgNum, _ := msg.Header.GetInt(tag.MsgSeqNum) _ = quickfix.SetNextTargetMsgSeqNum(sessionID, msgNum) } } else if msg.IsMsgTypeOf(string(enum.MsgType_SEQUENCE_RESET)) { // QuickFix/Go会自动处理SequenceReset,将TSN更新为NewSeqNo字段的值 // 可添加日志确认序列号更新 newSeqNo, _ := msg.Body.GetInt(tag.NewSeqNo) fmt.Printf("SequenceReset received, target seq num updated to %d\n", newSeqNo) } else { fmt.Println("FromAdmin: Received Admin message", msg.String()) } return }
3. 关于SequenceReset的疑问
无需手动检查初始序列号,QuickFix/Go核心逻辑会自动处理不带PossDupFlag的SequenceReset消息,将目标序列号直接更新为NewSeqNo(36字段)的值,触发后续间隙检测和会话恢复。
结论
这并非QuickFix/Go与Coinbase不兼容,而是需要适配Coinbase的自定义会话恢复流程。优化后的处理器既能解决重连时的序号拒绝问题,又能保证首次登录的正常逻辑,同时依赖QuickFix/Go原生逻辑处理SequenceReset,避免手动维护序列号的风险。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

