我正在开发一个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<: - ]
答案 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.