QuickFIX/N入門:二、發送消息及接收消息


一、     發送消息

 

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
}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM