IntelliSense/ReSharper 和自定义 Quickfixn 库生成

IntelliSense/ReSharper and custom Quickfixn library generation

我正在开发一个 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 类似的东西来引用 field/group,但是,如前所述,我希望能够使用IntelliSense/ReSharper 并使用类似 Quickfix.CounterParty.WhateverField 的内容引用消息 fields/groups 并使用相同的 dll。

我已经在互联网上苦思冥想了 3-4 天,但没有成功 - 我想做的事情可行吗?如果是这样,人们会怎么做?

提前问好 Grant Birchmeier <:-]

所以问题是您希望 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.

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

诀窍是编辑两个 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 个方法定义。

这些方法是:

初始化

agg_fields

get_field_def

generate_messages

generate_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 中的 class 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 文件包含一个 class,应将其更改为如下所示:

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; 使用消息 = 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

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