对于任何试图这样做的人来说,答案非常简单——可能不是最有效的,但据我所知它是有效的。
诀窍是编辑两个 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
我已经对此进行了广泛的测试,它似乎可以工作,但我建议您在将任何东西投入生产之前进行测试。