65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 QuickFix 从 FixServer 获取市场价格

starIconstarIconstarIconstarIconstarIcon

5.00/5 (3投票s)

2012年2月19日

CPOL

2分钟阅读

viewsIcon

47774

使用 QuickFix 从 FixServer 获取市场价格 (FIX)

这是对 上一篇帖子 的延续,该帖子解释了如何连接到 FIX Server 并向 Fix Server 发送订单。

我现在没有环境进行测试。我只是想提供一个想法,如果经纪商/交易所通过 FIX 消息发送市场价格,我们如何从 FIX 服务器获取市场价格。

我假设已经与 Fix Server 建立了会话。您可以仔细阅读上一篇帖子以了解设置会话的步骤。

市场数据请求

会话建立后,Fix Initiator 应用程序需要向 FIX 服务器发送 MarketDataRequest 消息。

响应可以是不同的消息

  • 市场数据请求拒绝

    这是 MarketDataRequest 消息的拒绝响应。

  • 市场数据 – 增量刷新 (MarketDataIncrementalRefresh)

    此消息包含市场价格的增量更新。它是 MarketDataRequest 的实时消息。

  • 市场数据 – 快照 / 全量刷新 (MarketDataSnapshotFullRefresh)

    此消息将针对每个 MarketDataRequest 消息发送一次。它包含市场价格的快照。

Fix Initiator

源代码

var marketDataRequest = new MarketDataRequest();
            marketDataRequest.set(new QuickFix.MDReqID(Utility.GetNewUniqueId()));
            marketDataRequest.set(new QuickFix.SubscriptionRequestType('1'));
            //if market depth require
            marketDataRequest.set(new QuickFix.MarketDepth(1));
            marketDataRequest.set(new QuickFix.MDUpdateType(1));
            marketDataRequest.set(new QuickFix.AggregatedBook(true));
            var noMDEntryTypes = new MarketDataRequest.NoMDEntryTypes();
            var mdEntryType_bid = new QuickFix.MDEntryType('0');
            noMDEntryTypes.set(mdEntryType_bid);
            marketDataRequest.addGroup(noMDEntryTypes);
            var mdEntryType_offer = new QuickFix.MDEntryType('1');
            noMDEntryTypes.set(mdEntryType_offer);
            marketDataRequest.addGroup(noMDEntryTypes);
            var relatedSymbol = new MarketDataRequest.NoRelatedSym();
            relatedSymbol.set(new QuickFix.Symbol(instrument));
            marketDataRequest.addGroup(relatedSymbol);
//Send message
Session.sendToTarget(marketDataRequest, _admin.TradeSessionId);

市场数据请求消息字段

  • NoRelatedSym:这是您想要接收市场价格的工具列表。
  • MarketDepth:如果您想要价格的市场深度,请将其设置为 1。
  • MDEntryType:市场数据价格的类型,例如买价、卖价、成交价、开盘价等。

您可以在此处了解有关每个字段的更多信息

捕获市场数据响应

一旦 Marketdatarequest 消息发送到 FixServer,fix initiator 期望在

  • MarketDataIncrementalRefresh
  • MarketDataSnapshotFullRefresh
  • 市场数据请求拒绝

MarketDataIncrementalRefresh

您可以阅读有关此消息的更多信息

源代码

public override void onMessage(MarketDataIncrementalRefresh message, SessionID session)
        {
            try
            {
                MDReqID mdreqid = new MDReqID();
                NoMDEntries nomdentries = new NoMDEntries();
                QuickFix42.MarketDataIncrementalRefresh.NoMDEntries group
                    = new QuickFix42.MarketDataIncrementalRefresh.NoMDEntries();
                MDUpdateAction mdupdateaction = new MDUpdateAction();
                DeleteReason deletereason = new DeleteReason();
                MDEntryType mdentrytype = new MDEntryType();
                MDEntryID mdentryid = new MDEntryID();
                Symbol symbol = new Symbol();
                MDEntryOriginator mdentryoriginator = new MDEntryOriginator();
                MDEntryPx mdentrypx = new MDEntryPx();
                Currency currency = new Currency();
                MDEntrySize mdentrysize = new MDEntrySize();
                ExpireDate expiredate = new ExpireDate();
                ExpireTime expiretime = new ExpireTime();
                NumberOfOrders numberoforders = new NumberOfOrders();
                MDEntryPositionNo mdentrypositionno = new MDEntryPositionNo();

                message.get(nomdentries);

                message.getGroup(1, group);

                int list = nomdentries.getValue();

                for (uint i = 0; i < list; i++)
                {
                    message.getGroup(i + 1, group);
                    group.get(mdupdateaction);
                    if (mdupdateaction.getValue() == '2')
                        Console.WriteLine("Enter");
                    group.get(deletereason);
                    group.get(mdentrytype);
                    group.get(mdentryid);
                    group.get(symbol);
                    group.get(mdentryoriginator);
                    if (mdupdateaction.getValue() == '0')
                        group.get(mdentrypx);
                    group.get(currency);
                    if (mdupdateaction.getValue() == '0')
                        group.get(mdentrysize);
                }

                Console.WriteLine("Got Symbol {0} Price {1}", 
            symbol.getValue(), mdentrypx.getValue());
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }

MarketDataSnapshotFullRefresh

此消息将针对每个 MarketDataRequest 消息发送一次。它包含市场价格的快照。

源代码

public override void onMessage(MarketDataSnapshotFullRefresh message, SessionID session)
        {

            string Symbol = message.get(new Symbol()).getValue();

            NoMDEntries noMDEntries = new NoMDEntries();
            message.get(noMDEntries);
            var group =
              new QuickFix42.MarketDataSnapshotFullRefresh.NoMDEntries();
            MDEntryType MDEntryType = new MDEntryType();
            MDEntryPx MDEntryPx = new MDEntryPx();
            MDEntrySize MDEntrySize = new MDEntrySize();

            message.getGroup(1, group);
            group.get(MDEntryType);
            group.get(MDEntryPx);
            group.get(MDEntrySize);

            message.getGroup(2, group);
            group.get(MDEntryType);
            group.get(MDEntryPx);
            group.get(MDEntrySize);

            Console.WriteLine("Symbol {0} Price {1}", Symbol, MDEntryPx);
        }

市场数据请求拒绝

当经纪商由于业务或技术原因无法满足市场数据请求时使用。

字段

  • MDReqRejReason:拒绝原因代码
  • Text:拒绝原因文本

我希望这篇文章能概述如何从 FIX 服务器捕获市场价格。


© . All rights reserved.