如何在QuickFIX/n中自定义FIX消息拒绝行为?
解决QuickFIX/n中SENDINGTIME_ACCURACY_PROBLEM拒绝行为的调整方案
一、配置层面调整(优先推荐)
QuickFIX/n支持通过配置文件调整时间校验的容忍阈值,从根源减少这类拒绝触发:
- 在你的FIX 4.4配置文件中,添加或修改以下参数:
将阈值调大到能覆盖网络中断恢复后的时间差(比如300秒/5分钟),即可避免大部分因短暂断网导致的时间偏差拒绝。# 设置发送时间与接收时间的最大允许偏差(单位:秒),默认值为120秒 SendingTimeAccuracy=300
二、代码层面自定义校验逻辑
如果配置调整无法满足需求,需要完全跳过该拒绝规则,可以通过重写Session类的校验逻辑实现:
1. 自定义Session类,跳过指定拒绝原因
创建继承自Session的自定义类,重写Validate方法,忽略SENDINGTIME_ACCURACY_PROBLEM类型的拒绝:
public class CustomSession : Session { public CustomSession(SessionID sessionID, IApplication application, IMessageStoreFactory storeFactory, ILogFactory logFactory, MessageFactory messageFactory) : base(sessionID, application, storeFactory, logFactory, messageFactory) { } protected override bool Validate(Message message, out string rejectReason) { bool isValid = base.Validate(message, out rejectReason); // 仅针对SENDINGTIME_ACCURACY_PROBLEM,标记为有效并记录日志 if (!isValid && rejectReason == "SENDINGTIME_ACCURACY_PROBLEM") { Log.OnEvent($"忽略SENDINGTIME_ACCURACY_PROBLEM,消息内容:{message.ToString()}"); rejectReason = null; return true; } return isValid; } }
2. 实现自定义SessionFactory
让QuickFIX/n使用你的自定义Session,需要创建对应的SessionFactory:
public class CustomSessionFactory : DefaultSessionFactory { public override Session CreateSession(SessionID sessionID, IApplication application, IMessageStoreFactory storeFactory, ILogFactory logFactory, MessageFactory messageFactory) { return new CustomSession(sessionID, application, storeFactory, logFactory, messageFactory); } }
3. 启动时注册自定义SessionFactory
初始化QuickFIX/n引擎时,指定使用自定义工厂类:
var settings = new SessionSettings("your_fix_config.cfg"); var application = new YourApplication(); var storeFactory = new FileStoreFactory(settings); var logFactory = new FileLogFactory(settings); var messageFactory = new DefaultMessageFactory(); var sessionFactory = new CustomSessionFactory(); using (var acceptor = new ThreadedSocketAcceptor(application, storeFactory, settings, logFactory, messageFactory, sessionFactory)) { acceptor.Start(); // 业务运行逻辑 }
三、注意事项
- 调整时间校验阈值时,不要设置过大,避免引入重复消息处理等其他风险。
- 自定义校验逻辑时,确保仅跳过目标拒绝原因,不影响消息签名、必填字段检查等核心校验规则。
- 无论采用哪种方案,都要保留详细日志,方便后续问题排查。
内容的提问来源于stack exchange,提问作者Dov
相关产品推荐
相关产品推荐

