1

我正在开发一个 Quickfix/n 启动器,在同一实例中与多个交易对手一起使用,它们都使用相同版本的 FIX(在此实例中为 4.2),但使用独特的消息传递规范,我想使用 Intellisense/ReSharper 来开发发起人说。

以前我使用 generate.rb 脚本从修改后的 FIX##.xml 文件创建源代码,但想使用 FIX42.DeutcheBank.xml、FIX42.CME.xml、FIX42.Whatever 之类的东西来生成源代码generate.rb ruby​​ 脚本或其修改版本,以便它们可以被 IntelliSense/ReSharper 解析,我遇到了问题,因为它们都使用“FIX.4.2”作为开始字符串,从而导致编译错误。

我知道我可以通过诸如 Tags["BidForwardPointsCME"] 之类的键或与 DataDictionary 类似的键来引用字段/组,但如前所述,我希望能够使用 IntelliSense/ReSharper 并引用消息字段/具有 Quickfix.CounterParty.WhateverField 之类的组并使用相同的 dll。

我已经在互联网上猛烈抨击了 3-4 天的答案,但没有运气 - 我想做的事情可能吗?如果是这样,一个人会怎么做?

提前致格兰特·伯奇迈尔 <:-]

4

2 回答 2

1

对于任何试图这样做的人来说,答案非常简单——可能不是最有效的,但据我所知它是有效的。

诀窍是编辑两个 ruby​​ 生成脚本(messages_gen.rb 和 generate.rb)并将附加的 FIX 规范 XML 文件放在 spec/fix 目录中。

假设您有一个用于 Foo Exchange 的自定义 FIX xml 文件并且 Foo Exchange 使用 FIX 4.2,您需要将其命名为 FIX.xml(例如:FIXFooExchange.xml)

接下来,您必须像这样覆盖 messages_gen.rb 中的 FIX 版本:

def self.gen_basemsg fixver, destdir
  beginstring = fixver
  if beginstring.match(/^FIX50/)
    beginstring = "FIXT11"
  end

  if beginstring.match(/^FIXFooExchange/)
    beginstring = "FIX42"
  end

接下来,您需要将自定义修复版本添加到 generate.rb 文件中的 6 个方法定义中。

这些方法是:

初始化

聚合字段

get_field_def

生成消息

生成_csproj

generate_message_factories

这里有一些例子:

def initialize
  @fix40 = FIXDictionary.load spec('FIX40')
  @fix41 = FIXDictionary.load spec('FIX41')
  @fix42 = FIXDictionary.load spec('FIX42')
  @fix43 = FIXDictionary.load spec('FIX43')
  @fix44 = FIXDictionary.load spec('FIX44')
  @fix50 = FIXDictionary.load spec('FIX50')
  @fix50sp1 = FIXDictionary.load spec('FIX50SP1')
  @fix50sp2 = FIXDictionary.load spec('FIX50SP2')
  @fixFooExchange = FIXDictionary.load spec('FIXFooExchange')
  @src_path = File.join File.dirname(__FILE__), '..', 'QuickFIXn'
end

def get_field_def fld_name
# we give priority to latest fix version
  fld = merge_field_defs(
  @fix50sp2.fields[fld_name],
  @fix50sp1.fields[fld_name],
  @fix50.fields[fld_name],
  @fix44.fields[fld_name],
  @fixFooExchange.fields[fld_name],
  @fix43.fields[fld_name],
  @fix42.fields[fld_name],
  @fix41.fields[fld_name],
  @fix40.fields[fld_name]
)
End

基本上,您只需复制一行并将修复版本替换为自定义的交换 xml 数据字典名称。

FixValues.cs 中的 BeginString 类应修改为如下所示:

public class BeginString
{
    public const string FIXT11 = "FIXT.1.1";
    public const string FIX50  = "FIX.5.0";
    public const string FIX44  = "FIX.4.4";
    public const string FIX43  = "FIX.4.3";
    public const string FIXFooExchange = "FIX.4.2";
    public const string FIX42  = "FIX.4.2";
    public const string FIX41  = "FIX.4.1";
    public const string FIX40  = "FIX.4.0";
}

Values.cs 文件包含一个类,应将其更改为如下所示:

public class Values
{
    public const string BeginString_FIXT11 = "FIXT.1.1";
    public const string BeginString_FIX50  = "FIX.5.0";
    public const string BeginString_FIX44  = "FIX.4.4";
    public const string BeginString_FIX43  = "FIX.4.3";
    public const string BeginString_FIXFooExchange = "FIX.4.2";
    public const string BeginString_FIX42  = "FIX.4.2";
    public const string BeginString_FIX41  = "FIX.4.1";
    public const string BeginString_FIX40  = "FIX.4.0";
}

做这些事情,然后运行 ​​generate.bat 文件,你应该能够通过“。”引用命名空间。而不是使用基本的 FIX 版本。下面是一些例子: 使用 QuickFix.FIXFooExchange;使用 Message = QuickFix.Message;

QuickFix.FIXFooExchange.MessageFactory mF = new QuickFix.FIXFooExchange.MessageFactory();

并参考消息属性,例如:

string customField = message.yourCustomFieldName.getValue().ToUpper();

而不是通过

string customField = message["yourCustomFieldName"].getValue().ToUpper();

最后,您需要编辑 2 个 .cs 文件:FixValues.cs 和 Values.cs

我已经对此进行了广泛的测试,它似乎可以工作,但我建议您在将任何东西投入生产之前进行测试。

于 2016-04-11T21:21:20.227 回答
0

所以问题是您希望 1 个 QF 发起程序进程连接到多个不同的交易对手,其中每个会话使用单独的数据字典?

你不是DataDictionary=somewhere/FIX42.xml在配置文件中使用吗?

另请参阅http://quickfixn.org/tutorial/configuration.html AppDataDictionary: This setting supports the possibility of a custom application data dictionary for each session.

于 2016-02-06T15:02:19.507 回答