IntelliSense / ReSharper和自定义Quickfixn库生成

时间:2016-02-05 03:33:14

标签: quickfix quickfixn

我正在开发一个Quickfix / n启动器,用于几个对手方,在同一个实例中,全部使用相同版本的FIX(本例中为4.2)但使用独特的消息规范,我想使用Intellisense / ReSharper开发了这个发起人。

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

我知道我可以通过像Tags [“BidForwardPointsCME”]之类的键或者类似于DataDictionary的类似引用字段/组,但是如上所述,我希望能够使用IntelliSense / ReSharper并引用消息字段/组,类似于Quickfix.CounterParty.WhateverField并使用相同的dll。

我已经在互联网上撞了3-4天没有运气的答案 - 我想做什么?如果是这样,怎么会这样呢?

嗨,请提前告知Grant Birchmeier<: - ]

2 个答案:

答案 0 :(得分: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个方法定义。

这些方法是:

初​​始化

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

基本上,您只需复制一行,并将修复版本替换为自定义的Exchange 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

我已经对此进行了相当广泛的测试,似乎有效,但我建议您在投入生产之前进行测试。

答案 1 :(得分: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.