2016-02-05 53 views
1

我正在開發一個Quickfix/n啓動程序,用於幾個交易對手,在同一個實例中,所有使用相同版本的FIX(本例中爲4.2),但利用唯一的消息規範並且我想使用Intellisense/ReSharper來開發所述啓動器。智能感知/ ReSharper和自定義Quickfixn庫生成

此前我已經使用generate.rb腳本從修改後的FIX ##。xml文件創建源代碼,但希望使用類似於FIX42.DeutcheBank.xml,FIX42.CME.xml,FIX42.Whatever,to使用generate.rb ruby​​腳本或其修改後的版本生成源代碼,以便它們可以通過IntelliSense/ReSharper進行分析,而且我遇到了問題,因爲它們都使用「FIX.4.2」作爲開始字符串,從而導致編譯錯誤。

我知道我可以通過像[[BidForwardPointsCME]]或類似於DataDictionary的鍵來引用字段/組,但如前所述,我希望能夠使用IntelliSense/ReSharper和引用消息字段/組與類似Quickfix.CounterParty.WhateverField和使用相同的DLL。

我在網上找到了我的頭,因爲3-4天沒有運氣的答案 - 我想做什麼?如果是這樣,一個人會怎麼做呢?

嗨提前授予Birchmeier <: - ]

+0

誰是加利?對不起,我對ReSharper沒有任何經驗。我不完全相信我理解這個問題。常見的「FIX.4.2」如何開始字符串導致問題? (我假設你正在談論'8 = FIX.4.2'的開始字符串。) –

+0

對不起,格蘭特 - 我寫了這個很小的睡眠! – Junkiebev

+0

問題是兩個交易對手使用相同的FIX標籤號碼,但數據類型不同。我想要使​​用像'使用QuickFix.SomeCounterParty;'而不是'使用QuickFix.FIX42';'而不是編輯XML定義文件並生成FIX dll。 感謝和高興的星期五。 – Junkiebev

回答

1

見對於任何人有史以來正在努力做到這一點,答案很簡單 - 可能不是最有效的,但據我知道的工作。

訣竅是編輯兩個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生產。

+1

我發現我必須指定特定的消息工廠像這樣創建我的啓動器/接受器:'initiator = new SocketInitiator(this,storeFactory,settings,logFactory,new QuickFix.FIXFooExchange.MessageFactory())' – Feem

0

所以,問題是你要1個QF引發工藝連接到每個會話使用一個單獨的數據字典幾種不同的對手?

難道你不在配置文件中使用DataDictionary=somewhere/FIX42.xml嗎?

http://quickfixn.org/tutorial/configuration.htmlAppDataDictionary: This setting supports the possibility of a custom application data dictionary for each session.

+0

是的 - 這將工作,但它會打破智能感知。除了FIX42/FIX43/FIX44 /等之外,我想要做的是生成。引用/類型/等等,就像'FIXDeutscheBank42',intellisense可以解析它,以便執行自動補全和類型猜測等功能。 我懷疑唯一會出現問題的是所有各種* special * fix數據字典都使用「FIX.4.2」(在本例中)作爲開始字符串,這可能會打破某種類型的枚舉... 其他命名空間/類可能是更好的說法。 – Junkiebev

+0

像上面的格蘭特一樣,我也沒有IntelliSense/ReSharper的經驗,所以我不太明白。當你說「FIXDeutscheBank42哪個intellisense可以解析」,你的意思是選擇一個特定的數據字典並解析內部的消息格式?沒有辦法將QF配置爲每個會話使用不同的數據字典並解決此問題?我的意思是,無論你使用什麼,我都看不到使用tag'8 = FIX.4.2'的方法,因爲,這就是FIX的工作原理,無辜:) – rupweb