見對於任何人有史以來正在努力做到這一點,答案很簡單 - 可能不是最有效的,但據我知道的工作。
訣竅是編輯兩個ruby生成腳本(messages_gen.rb和generate.rb)並將其他FIX規範XML文件放在spec/fix目錄中。
假設你有一個自定義FIX xml文件Foo的交流,而且富Exchange使用FIX 4.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
基本上你只要複製一行,並用自定義的交換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
我已經測試了這個相當廣泛,它似乎工作,但我會建議你做任何測試之前,你把任何我n生產。
誰是加利?對不起,我對ReSharper沒有任何經驗。我不完全相信我理解這個問題。常見的「FIX.4.2」如何開始字符串導致問題? (我假設你正在談論'8 = FIX.4.2'的開始字符串。) –
對不起,格蘭特 - 我寫了這個很小的睡眠! – Junkiebev
問題是兩個交易對手使用相同的FIX標籤號碼,但數據類型不同。我想要使用像'使用QuickFix.SomeCounterParty;'而不是'使用QuickFix.FIX42';'而不是編輯XML定義文件並生成FIX dll。 感謝和高興的星期五。 – Junkiebev