You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在QuickFIX/n中自定义FIX消息拒绝行为?

解决QuickFIX/n中SENDINGTIME_ACCURACY_PROBLEM拒绝行为的调整方案

一、配置层面调整(优先推荐)

QuickFIX/n支持通过配置文件调整时间校验的容忍阈值,从根源减少这类拒绝触发:

  • 在你的FIX 4.4配置文件中,添加或修改以下参数:
    # 设置发送时间与接收时间的最大允许偏差(单位:秒),默认值为120秒
    SendingTimeAccuracy=300
    
    将阈值调大到能覆盖网络中断恢复后的时间差(比如300秒/5分钟),即可避免大部分因短暂断网导致的时间偏差拒绝。

二、代码层面自定义校验逻辑

如果配置调整无法满足需求,需要完全跳过该拒绝规则,可以通过重写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 20:14:53