我正在开发一个Quickfix/n启动器,用于多个对手方,在同一个实例中,它们都使用相同版本的FIX (在本例中为4.2),但使用了唯一的消息传递规范,我希望使用Intellisense/ReSharper来开发所述启动器。
以前,我使用generate.rb脚本从修改过的FIX##.xml文件创建源代码,但希望使用类似FIX42.DeutcheBank.xml、FIX42.CME.xml、file 42之类的东西。不管是什么,用generate.rb ruby脚本或修改后的版本生成源代码,这样它们就可以被IntelliSense/ReSharper解析,而且我遇到了问题,因为它们都使用"FIX.4.2“作为开始字符串,从而导致编译错误。
我知道我可以通过一个键来引用一个字段/组,比如标记“BidForwardPointsCME”,或者类似于DataDictionary的东西,但是,如前所述,我希望能够使用IntelliSense/ReSharper,用类似于Quickfix.CounterParty.WhateverField的东西引用消息字段/组,并使用相同的dll。
3天来,我一直在互联网上寻找答案,但没有运气--我想做些什么呢?如果是这样的话,我们会怎么做呢?
你好格兰特·伯奇迈尔& Hi;--]
发布于 2016-04-11 21:21:20
对于任何试图做到这一点的人来说,答案都很简单--也许不是最有效的,但据我所知,这是可行的。
诀窍是编辑两个ruby生成脚本(messages_gen.rb和generate.rb),并将附加的修复规范XML文件放在spec/fix目录中。
假设您有一个用于FIXFooExchange.xml的自定义FIX.xml文件,并且FIXFooExchange.xml使用了Fix4.2,则需要将其命名为FIX.xml(例如: FIXFooExchange.xml)。
接下来,必须在messages_gen.rb中覆盖修复版本,如下所示:
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数据字典名称替换修复版本。
应该将FixValues.cs中的类FixValues.cs修改为如下所示:
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文件,您应该能够通过'.‘引用名称空间。而不是使用基本的修复版本。下面是一些例子:使用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();最后,您需要编辑两个.cs文件: FixValues.cs和Values.cs
我已经对此进行了相当广泛的测试,它似乎很有效,但我建议您在投入任何产品之前进行测试。
发布于 2016-02-06 15:02:19
因此,问题是,您希望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.
https://stackoverflow.com/questions/35215854
复制相似问题