日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

QuickFIX/N入门

發布時間:2024/4/17 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 QuickFIX/N入门 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

http://www.cnblogs.com/jinglelin/archive/2012/04/26/2470978.html

QuickFix/N簡介?
FIX是Financial Information eXchange的簡稱。FIX是一種專門為實時電子證券交易設計的標準消息協議。該協議由FIX protocol, Ltd(FPL)所有并維護。FIX協議的官方網址為http://www.fixprotocol.org/?
QuickFix引擎(?http://www.quickfixengine.org/?)一個開源的FIX引擎,其中它有JAVA、C++、C#三個版本的實現。

QuickFix/N是實現了FIX協議4.0-5.0版本及其功能的開源軟件,100%使用.NET(C#)實現。
QuickFix/N官網下載 http://www.quickfixn.org/
QuickFix/N源碼下載 https://github.com/connamara/quickfixn

使用QuickFIX/N創建一個Fix應用程序

使用QuickFIX/N創建一個FIX應用程序很容易,實現它的接口Application即可,例如創建一個簡單應用程序如下:

public?class?MyQuickFixApp?:?Application
{
????public?void?FromApp(Message?msg,?SessionID?sessionID)?{?}
????public?void?OnCreate(SessionID?sessionID)?{?}
????public?void?OnLogout(SessionID?sessionID)?{?}
????public?void?OnLogon(SessionID?sessionID)?{?}
????public?void?FromAdmin(Message?msg,?SessionID?sessionID)?{?}
????public?void?ToAdmin(Message?msg,?SessionID?sessionID)?{?}
????public?void?ToApp(Message?msg,?SessionID?sessionID)?{?}
}

?

這些實現方法將被QuickFIX/N的事件調用。

下面我們來看看每個回調事件的說明。

?應用回調

客戶端(對手方)發送登錄請求或其它請求消息,當QuickFIX/N應用程序收到消息。QuickFIX/N應用程序會發送一個回調事件的通知。

FromApp?-每個應用級別的消息將通過該方法處理,如委托指令,執行報告,證券信息以及市場數據。

FromAdmin?-每個管理級別的消息將通過該方法處理,如心跳,登錄以及注銷。

?OnCreate中?- 每當一個新的會話被創建,該方法被調用。

OnLogon?- 當登錄操作成功完成時,該方法被調用。

OnLogout?- 當會話斷開時觸發,包括對方主動請求logout或者網絡連接斷開都會引發該事件。

ToApp?-所有應用級別的消息在發送出去之前,都會調用該方法。如果需要在每個發出的消息當中添加一個標簽(Tag),在該方法是實現該需求最好的位置。

ToAdmin?-所有發出的管理級別消息在發送出去之前,都會調用該方法。

Acceptor 和 Initiator

QuickFIX/N 實現了的acceptor 和 initiator兩種模式。

Initiator:作為客戶端,當我們要連接到對方的應用時,使用Initiator。

Acceptor :作為服務端,當我們要提供應用服務供對方連接時,使用Acceptor。?

創建我們的應用程序

以下示例代碼,我們實現Application?接口,然后實例化一個Acceptor:

using?QuickFix;
public?class?MyQuickFixApp?:?Application
{
????public?void?FromApp(Message?msg,?SessionID?sessionID)?{?}
????public?void?OnCreate(SessionID?sessionID)?{?}
????public?void?OnLogout(SessionID?sessionID)?{?}
????public?void?OnLogon(SessionID?sessionID)?{?}
????public?void?FromAdmin(Message?msg,?SessionID?sessionID)?{?}
????public?void?ToAdmin(Message?msg,?SessionID?sessionID)?{?}
????public?void?ToApp(Message?msg,?SessionID?sessionID)?{?}
}

public?class?MyApp
{
????static?void?Main(string[]?args)
????{
????????SessionSettings?settings?=?new?SessionSettings(args[0]);
????????Application?myApp?=?new?MyQuickFixApp();
????????MessageStoreFactory?storeFactory?=?new?FileStoreFactory(settings);
????????LogFactory?logFactory?=?new?FileLogFactory(settings);
????????ThreadedSocketAcceptor?acceptor?=?new?ThreadedSocketAcceptor(
????????????myApp,
????????????storeFactory,
????????????settings,
????????????logFactory);

????????acceptor.Start();
????????while?(true)
????????{
????????????System.Console.WriteLine("Waiting!");
????????????System.Threading.Thread.Sleep(1000);
????????}
????????acceptor.Stop();
????}
}

?如果要更改應用角色,改為Initiator,只要簡單地用SocketInitiator替換ThreadedSocketAcceptor即可。

其它擴展

1)消息存儲擴展

MessageStore會存儲FIX會話級別消息的消息傳出記錄。我們可以通過實現MessageStoreFactory接口,來自定義或擴展我們的消息存儲。

2)日志存儲擴展

日志記錄已經有了兩個的實現:FileLog、ScreenLog,其中文件存儲的日志記錄器已經可以滿足一般的要求。當然,我們也可以通過實現LogFactory接口,來自定義實現或擴展我們的日志存儲。?

?

一、?????發送消息

?

QuickFIX/N的發送FIX消息的簡單示例:

FIX44.NewOrderSingle order = new FIX44.NewOrderSingle(

??? new ClOrdID("1234"),

??? new Symbol("000001"),

??? new Side(Side.BUY),

??? new TransactTime(DateTime.Now),

??? new OrdType(OrdType.MARKET));

?

Session.SendToTaget(order, sessionID);

首先,我們需要學習如何使用會話發送指令消息。

1)????? QuickFIX會話

發送消息時,我們必須指定QuickFIX會話,QuickFIX根據會話信息判定消息發送目的地。

所有QuickFIX會話的標識是在消息頭定義的,通常包括SenderCompIDTargetCompIDBeginString等字段,這些都是在配置文件中指定。

SenderCompID=CONNAMARA TargetCompID=CBOE BeginString=FIX4.4

有幾個獲得會話的方式。一是當會話被創建并緩存它時,我們可以獲得SessionID

private SessionID MySessionID { get; set; } public void OnCreate(SessionID sessionID) { ??? MySessionID = sessionID; }

另外,我們可以在響應傳入消息時,得到SessionID

public void OnMessage(FIX42.ExecutionReport execution, SessionID sessionID) { ??? ProcessExecution(execution, sessionID); }

或者,先在配置文件當中配置好所有的會話,我們可以從配置文件找到匹配的SessionID

var mySessionID = new SessionID("FIX4.2", "senderCompID", "targetCompID");

2)????? 創建和發送消息

創建消息時,我們首選使用指定Fix版本和消息類型的構造函數,填寫必選字段:

using QuickFix; using QuickFix.Fields; ? var order = new QuickFix.FIX44.NewOrderSingle( ??? new ClOrdID("1234"), ??? new Symbol("000001"), ??? new Side(Side.BUY), ??? new TransactTime(DateTime.Now), ??? new OrdType(OrdType.LIMIT));

使用信息的字段屬性設置字段值:

order.Price = new Price(new decimal(22.4)); order.Account = new Account("18861112");

把上面的內容合并在一起:創建消息,設置其必需的字段,并設置兩個附加字段,使用獲得的SessionID,我們發送消息示意如下:

var order = new QuickFix.FIX44.NewOrderSingle( ??? new ClOrdID("1234"), ??? new Symbol("000001"), ??? new Side(Side.BUY), ??? new TransactTime(DateTime.Now), ??? new OrdType(OrdType.LIMIT)); ? order.Price = new Price(new decimal(22.4)); order.Account = new Account("18861112"); ? Session.SendToTarget(order, sessionID);

3)????? 創建消息及字段的其他實現方式

類型安全的方式 ,已經被證明它是最好的方式了,但我們也可以用其他創建消息及字段的方法。

1)???? 每個消息類型都有一個默認的構造函數:

var order = new QuickFix.FIX44.NewOrderSingle(); order.ClOrdID =?new ClOrdID("1234"); order.Symbol = new Symbol("000001"); order.Side = new Side(Side.BUY);

2)???? 我們也可以用QuickFIX C ++QuickFIX/J風格的get / set方法,也是類型安全的:

order.Set(new TransactTime(DateTime.Now)); order.Set(new OrdType(OrdType.LIMIT));

如果不是一個消息屬性,可以用SetField設置一個字段的值:

order.SetField(new Account("18861112"));

?

3)???? 另外,也可以這么做,先創建一個Message基類的實例,它沒有屬性,因此都必須使用SetField?方法,但不建議使用這種風格

var order = new QuickFix.Message(); order.Header.SetField(new MsgType("D")); order.SetField(new ClOrdID("1234")); order.SetField(new Symbol("AAPL")); order.SetField(new Side(Side.BUY)); order.SetField(new TransactTime(DateTime.Now)); order.SetField(new OrdType(OrdType.LIMIT));

二、??????? 接收消息

QuickFIX/N接收類型安全和簡單類型的消息:

public void OnMessage( QuickFix.FIX44.NewOrderSingle order,SessionID sessionID) { ??? ProcessOrder(order.Price, order.OrderQty, order.Account); }

1)????? 接收類型安全的消息

MessageCracker是一個抽象類,一個助手類,一般在類型安全的各個OnMessage方法中調用,用于解析各個FIX版本的委托消息類型。處理FIX消息時, Crack方法會根據消息類型,判斷其類型類型是否已定義消息類型,如果已定義的消息,將調用其已注冊的處理方法來處理消息。

?

QuickFIX/N應用時,應用類將繼承MessageCracker,對于消息的處理,我們使用的都是指定??的、強類型的Message和Field類,對于不同的消息類型,我們分別不同的處理方法實現處理邏輯。當消息到達時, FromApp方法里面調用Crack,根據不同的消息類型,調用相應類型的消息處理方法?:

using QuickFix; ? public class MyApplication : MessageCracker, Application { ??? public void FromApp(Message msg, SessionID sessionID) ??? { ??????? Crack(msg, sessionID); ??? } ??? //... }

?

在重載的onMessage回調方法當中調用Crack?。以下例子演示接收委托及證券信息:

public void OnMessage( QuickFix.FIX44.NewOrderSingle ord,?SessionID sessionID) { ??? ProcessOrder(ord.Price, ord.OrderQty, ord.Account); } ? public void OnMessage( QuickFix.FIX44.SecurityDefinition secDef,?SessionID sessionID) { ??? GotSecDef(secDef); }

?

2)????? 消息解析器示例

整合一下,一個類型安全的訂單處理的應用是這樣的:

public class MyApplication : MessageCracker, Application { ??? public void OnMessage( ??????? QuickFix.FIX42.NewOrderSingle ord, ??????? SessionID sessionID) ??? { ??????? ProcessOrder(ord.Price, ord.OrderQty, ord.Account); ??? } ? ??? protected void ProcessOrder( ??????? Price price, ??????? OrderQty quantity, ??????? Account account) ??? { ??????? //... ??? } ??? #region Application Methods ? ??? public void FromApp(Message msg, SessionID sessionID) ??? { ??????? Crack(msg, sessionID); ??? } ??? public void OnCreate(SessionID sessionID) { } ??? public void OnLogout(SessionID sessionID) { } ??? public void OnLogon(SessionID sessionID) { } ??? public void FromAdmin(Message msg, SessionID sessionID) ??? { } ??? public void ToAdmin(Message msg, SessionID sessionID) ??? { } ??? public void ToApp(Message msg, SessionID sessionID) ??? { } ??? #endregion }

3)????? 非類型安全的應用實現

直接對接收到的Message基類消息進行處理,沒有了類型安全的類及字段,需要很多額外的邏輯。一般不建議這樣做。

//不推薦 public class MyApplication : Application { ??? public void FromApp(Message msg, SessionID sessionID) ??? { ??????? string msgType = msg.Header.GetString(Tags.MsgType); ??????? if (msgType.Equals(MsgType.EXECUTION_REPORT)) ??????? { ????????? string account = msg.GetString(Tags.Account); ????????? decimal price = msg.GetDecimal(Tags.Price); ??????? } ??? } ?? ?// ...same Application callbacks as above }

?

?

作者:jingle lin
出處:http://jinglelin.cnblogs.com 本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。

QuickFIX/N入門:三、 如何配置QuickFIX/N

?

?

總結

以上是生活随笔為你收集整理的QuickFIX/N入门的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。