使用快速修复的

时间:2016-11-14 18:44:07

标签: c# ice quickfixn

我是新手修复协议和快速修复编程。我正在寻求从ICE获得Trade Capture报告的帮助。我用google搜索示例/教程使用快速修复/ n来获取交易报告,但我无法获得足够的输出。 我的问题是获取Trade Capture报告或交易信息我尝试使用TradeCaptureReportRequest,TradeCaptureReportRequestAck,TradeCaptureReport类但不知何故它现在正在工作。 一个简单的如何提取信息将是一个很大的帮助。 提前感谢所有人。

1 个答案:

答案 0 :(得分:0)

好的,我发帖作为答案,因为评论的时间太长了。请记住,我已经编写了自定义常量,消息类型等(我也编写了我的接受器服务器,所以我不受ICE常量/枚举的限制)。您需要确定ICE需要哪些字段并进行更改 - 这不容易复制/粘贴...

首先,您需要确保您拥有并引用了所有必需的文件。我在项目中创建了一个名为“fix”的文件夹,并将所有修复文件复制到其中。这些必须是(至少1个)FixXXX.xml文件,如果你使用的是FIX50SP1或2,你还需要有FIXT11.xml。与.xml文件一起,你需要一个initiator.cfg文件(假设你正在创建一个启动器,没有服务器,否则这将需要是“acceptor.cfg”但是再一次,听起来你正在尝试连接到ICE,所以启动器是正确的用法。最后,你需要有一个QuickFix.dll。我的树看起来如下: enter image description here

我不打算浏览XML文件 - 你需要了解它 - 它非常混乱并且需要时间......特别是如果使用FIXT11.XML以及SP1或2。

您的initiator.cfg应类似于以下内容:

# default settings for sessions
[DEFAULT]
FileStorePath=store
FileLogPath=log
ConnectionType=initiator
ReconnectInterval=60
SenderCompID=[Enter yours]

ResetOnLogon=Y 
ResetOnLogout=Y 
ResetOnDisconnect=Y 


[SESSION]
BeginString=FIXT.1.1
TargetCompID=[Enter ICE Acceptor]
DefaultApplVerID=FIX.5.0
StartTime=12:30:00
EndTime=21:30:00
# overide default setting for RecconnectInterval
ReconnectInterval=30
HeartBtInt=30
SocketConnectPort=[From ICE]
# (optional) only listen for incoming connections on a specific host
#SocketConnectHost=127.0.0.1
SocketConnectHost=[ICE Ip Address- from your documentation/registration]
DataDictionary=..\..\fix\FIX50.xml
TransportDataDictionary=..\..\fix\FIXT11.xml

好的,假设您已导入并引用了QuickFix.dll,并且您的initiator.cfg已正确连接,那实际上非常简单:

创建一个处理所有内容的类。忽略AddToLB,这是一个测试函数。

public class TCT_Fix : Control, IApplication
{
    private readonly string username = [removed]
    private readonly string password = [removed]
    public string InitiatorID;                           
    SessionID sessionID;                                 
    public bool running;                                 
    SessionSettings settings;
    IMessageStoreFactory storeFactory;
    ILogFactory logFactory;
    SocketInitiator initiator;
    public event EventHandler AddToLB;
    public event EventHandler AddToAdmin;
    public void StopIt()
    {
        if (sessionID == null) return;
        try
        {
            Session.LookupSession(sessionID).Disconnect("Stopping");
            settings.Remove(sessionID);
            settings = null;
            initiator.Dispose();
            settings = new SessionSettings(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "fix", "initiator.cfg"));
            storeFactory = new FileStoreFactory(settings);
            logFactory = new FileLogFactory(settings);
            initiator = new SocketInitiator(
                this,
                storeFactory,
                settings,
                logFactory);
        }
        catch { }   
    }
    public void FromApp(QuickFix.Message msg, SessionID sessionID)
    {
        var sMsg = "FROM APP: " + msg.ToString();
        AddToLB(sMsg, null);
        if (msg.Header.GetField(35) == "TC") //Cash
        {
            DateTime dtTdate;
            float fPrice;
            int Qty;
            int OrdType;
            bool BPisBuyer;

            DateTime.TryParse(msg.GetField(CustomConstants.TDATE),out dtTdate);
            string BPSide = msg.GetField(CustomConstants.BP_SIDE);                
            float.TryParse(msg.GetField(CustomConstants.F_PRICE), out fPrice);
            int.TryParse(msg.GetField(CustomConstants.QTY), out Qty);
            string TCTReference = msg.GetField(CustomConstants.TCT_REF);
            string BPAcct = msg.GetField(CustomConstants.BP_COMPANY);
            int.TryParse(msg.GetField(CustomConstants.ORDER_TYPE), out OrdType);
            string ExecBkr = msg.GetField(CustomConstants.EXEC_BKR);
            string CounterParty = msg.GetField(CustomConstants.COUNTER_PARTY);
            BPisBuyer = msg.GetField(CustomConstants.IS_BUYER) == "Y";
            string BPTrader = msg.GetField(CustomConstants.BP_TRADER);
            string CounterTrader = msg.GetField(CustomConstants.COUNTER_TRADER);
            string Grade = msg.GetField(CustomConstants.GRADE);
            string Location = msg.GetField(CustomConstants.LOCATION);
            string CycDt = msg.GetField(CustomConstants.CYCLE_DATE);
            string DelMo = msg.GetField(CustomConstants.DELIVER_MONTH);
            string Terms = msg.GetField(CustomConstants.TERMS);
            string Payment = msg.GetField(CustomConstants.PAYMENT);
            string Origin = msg.GetField(CustomConstants.ORIGIN);
            string NumOfCyc = msg.GetField(CustomConstants.NUM_OF_CYCLES);
            string Via = msg.GetField(CustomConstants.VIA);
            string MoveMo = msg.GetField(CustomConstants.MOVE_MONTH);
            string Comment = msg.GetField(CustomConstants.COMMENT);
        }
        else if (msg.Header.GetField(35) == "TE") //EFP
        {
            DateTime dtTdate;
            float fPrice;
            int Qty;
            int OrdType;
            bool BPisBuyer;
            bool IsWater;

            DateTime.TryParse(msg.GetField(CustomConstants.TDATE), out dtTdate);
            string BPSide = msg.GetField(CustomConstants.BP_SIDE);
            float.TryParse(msg.GetField(CustomConstants.F_PRICE), out fPrice);
            int.TryParse(msg.GetField(CustomConstants.QTY), out Qty);
            string TCTReference = msg.GetField(CustomConstants.TCT_REF);
            string BPAcct = msg.GetField(CustomConstants.BP_COMPANY);
            int.TryParse(msg.GetField(CustomConstants.ORDER_TYPE), out OrdType);
            string ExecBkr = msg.GetField(CustomConstants.EXEC_BKR);
            string CounterParty = msg.GetField(CustomConstants.COUNTER_PARTY);
            BPisBuyer = msg.GetField(CustomConstants.IS_BUYER) == "Y";
            string BPTrader = msg.GetField(CustomConstants.BP_TRADER);
            string CounterTrader = msg.GetField(CustomConstants.COUNTER_TRADER);
            string Grade = msg.GetField(CustomConstants.GRADE);
            string Location = msg.GetField(CustomConstants.LOCATION);
            string CycDt = msg.GetField(CustomConstants.CYCLE_DATE);
            string DelMo = msg.GetField(CustomConstants.DELIVER_MONTH);
            string Terms = msg.GetField(CustomConstants.TERMS);
            string Payment = msg.GetField(CustomConstants.PAYMENT);
            string Origin = msg.GetField(CustomConstants.ORIGIN);
            string NumOfCyc = msg.GetField(CustomConstants.NUM_OF_CYCLES);
            string Via = msg.GetField(CustomConstants.VIA);
            string MoveMo = msg.GetField(CustomConstants.MOVE_MONTH);
            string Comment = msg.GetField(CustomConstants.COMMENT);
            IsWater = msg.GetField(CustomConstants.ISWATER) == "Y";
            string BPFloorBkr = msg.GetField(CustomConstants.BP_FLOOR_BKR);
            string CounterFloorBkr = msg.GetField(CustomConstants.COUNTER_FLOOR_BKR);
            string Diff = msg.GetField(CustomConstants.DIFFERENCE);
            string MercMo = msg.GetField(CustomConstants.MERC_MO);
            string MercPr = msg.GetField(CustomConstants.MERC_PRICE);
        }
        else if (msg.Header.GetField(35) == "TI") //Index
        {
            DateTime dtTdate;
            float fPrice;
            int Qty;
            int OrdType;
            bool BPisBuyer;
            bool IsWater;

            DateTime.TryParse(msg.GetField(CustomConstants.TDATE), out dtTdate);
            string BPSide = msg.GetField(CustomConstants.BP_SIDE);
            float.TryParse(msg.GetField(CustomConstants.F_PRICE), out fPrice);
            int.TryParse(msg.GetField(CustomConstants.QTY), out Qty);
            string TCTReference = msg.GetField(CustomConstants.TCT_REF);
            string BPAcct = msg.GetField(CustomConstants.BP_COMPANY);
            int.TryParse(msg.GetField(CustomConstants.ORDER_TYPE), out OrdType);
            string ExecBkr = msg.GetField(CustomConstants.EXEC_BKR);
            string CounterParty = msg.GetField(CustomConstants.COUNTER_PARTY);
            BPisBuyer = msg.GetField(CustomConstants.IS_BUYER) == "Y";
            string BPTrader = msg.GetField(CustomConstants.BP_TRADER);
            string CounterTrader = msg.GetField(CustomConstants.COUNTER_TRADER);
            string Grade = msg.GetField(CustomConstants.GRADE);
            string Location = msg.GetField(CustomConstants.LOCATION);
            string CycDt = msg.GetField(CustomConstants.CYCLE_DATE);
            string DelMo = msg.GetField(CustomConstants.DELIVER_MONTH);
            string Terms = msg.GetField(CustomConstants.TERMS);
            string Payment = msg.GetField(CustomConstants.PAYMENT);
            string Origin = msg.GetField(CustomConstants.ORIGIN);
            string NumOfCyc = msg.GetField(CustomConstants.NUM_OF_CYCLES);
            string Via = msg.GetField(CustomConstants.VIA);
            string MoveMo = msg.GetField(CustomConstants.MOVE_MONTH);
            string Comment = msg.GetField(CustomConstants.COMMENT);
            IsWater = msg.GetField(CustomConstants.ISWATER) == "Y";
            string BPFloorBkr = msg.GetField(CustomConstants.BP_FLOOR_BKR);
            string CounterFloorBkr = msg.GetField(CustomConstants.COUNTER_FLOOR_BKR);
            string Diff = msg.GetField(CustomConstants.DIFFERENCE);
            string MercMo = msg.GetField(CustomConstants.MERC_MO);
            string MercPr = msg.GetField(CustomConstants.MERC_PRICE);


        }
    }
    public void OnCreate(SessionID sessionID)
    {
        AddToAdmin("SESSION CREATED: " + sessionID.ToString(), null);
    }
    public void OnLogout(SessionID sessionID)
    {
        AddToAdmin("LOGOUT: " + this.sessionID.ToString(), null);       
    }
    public void OnLogon(SessionID sessionID)
    {
        this.sessionID = sessionID;
        AddToAdmin("LOG ON: " + this.sessionID.ToString(),null);
    }
    public void FromAdmin(QuickFix.Message msg, SessionID sessionID)
    {
        AddToAdmin("FROM ADMIN: " + msg.ToString(), null);
    }
    public void ToAdmin(QuickFix.Message msg, SessionID sessionID)
    {
        if (msg.Header.GetField(35).ToString() == "A")
        {
            msg.SetField(new QuickFix.Fields.Username(username));
            msg.SetField(new QuickFix.Fields.Password(password));
        }

        AddToAdmin("TO ADMIN: " + msg.ToString(), null);
    }
    public void ToApp(QuickFix.Message msg, SessionID sessionID)
    {
        AddToLB("TO APP: " + msg.ToString(), null);       
    }        
    public void GetTestMessage(string msgType)
    {
        if (sessionID == null) return;
        QuickFix.FIX50.TestMessage msg = new QuickFix.FIX50.TestMessage();
        msg.TestType = msgType;
        msg.Header.SetField(new QuickFix.Fields.MsgType("TEST"));
        msg.SetField(new QuickFix.Fields.StringField(CustomConstants.TEST_TYPE, msgType));
        Session.SendToTarget(msg, sessionID);
    }
    public TCT_Fix()
    {
        settings = new SessionSettings(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "fix", "initiator.cfg"));
        storeFactory = new FileStoreFactory(settings);
        logFactory = new FileLogFactory(settings);
        initiator = new SocketInitiator(
            this,
            storeFactory,
            settings,
            logFactory);
    }
    public TCT_Fix(ref string initID)
    {
        InitiatorID = initID;
        settings = new SessionSettings(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "fix", "initiator.cfg"));
        storeFactory = new FileStoreFactory(settings);
        logFactory = new FileLogFactory(settings);
        initiator = new SocketInitiator(
            this,
            storeFactory,
            settings,
            logFactory);
    }
    public void RunIt()
    {
        if (running) return;
        if(initiator.IsStopped)
        {
            try
            {   
                initiator.Start(); //This can throw an error due to current set up.  I would recommend making the connection,
                                   //pulling data, and then closing the connection (polling) to ensure the initiator clears the
                                   //log files
                                   //reference http://lists.quickfixn.com/pipermail/quickfixn-quickfixn.com/2013q1/000747.html
                                   //2013 issue, still unresolved...  Restart app
            }
            catch(Exception ex)
            {
                if (MessageBox.Show("Error restarting initiator.  Program will close due to file access.  This is a Quickfix bug, not an issue with this program.  Please restart." + Environment.NewLine + Environment.NewLine +
                    "Reference: http://lists.quickfixn.com/pipermail/quickfixn-quickfixn.com/2013q1/000747.html for more information.  Click ok to copy link to clipboard.  Click \"X\" to ignore.") == DialogResult.OK)
                {
                    Clipboard.SetText("http://lists.quickfixn.com/pipermail/quickfixn-quickfixn.com/2013q1/000747.html");
                }
                throw new Exception(ex.ToString());
            }
        }          
        running = true;           
    }
}

最后,为了使它脱颖而出(这实际上也在上面的块中),你构造一个类似于下面的消息,记住你的ICE消息将具有我的“TestMessage”没有的某些必需字段。我不能从制作中提供代码 - 抱歉。

public void GetTestMessage(string msgType)
    {
        if (sessionID == null) return;
        QuickFix.FIX50.TestMessage msg = new QuickFix.FIX50.TestMessage();
        msg.TestType = msgType;
        msg.Header.SetField(new QuickFix.Fields.MsgType("TEST"));
        msg.SetField(new QuickFix.Fields.StringField(CustomConstants.TEST_TYPE, msgType));
        Session.SendToTarget(msg, sessionID);
    }

学习曲线很丰富。你只需要继续玩,直到你得到它。一旦你把它弄下来,它就有意义了。坚持下去。如果您还有其他需要,请告诉我。