使用 QuickFix 从 FixServer 获取市场价格





5.00/5 (3投票s)
使用 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 服务器捕获市场价格。
