MarketDataIncrementalRefresh消息QuickFix中出现FieldNotFoundExcept
本文关键字:FieldNotFoundExcept 消息 QuickFix MarketDataIncrementalRefresh | 更新日期: 2023-09-27 18:24:53
我正在开发一个具有FixAcceptor和FixInitiator的示例应用程序。我正在从启动器发送MarketDataRequest消息,并从Acceptor发送MarketDataIncrementalRefresh消息,但收到NoMDEntries消息的FieldNotFound异常的错误。我很确定我是发送了错误的信息,从受体,但找不到。如果有人能帮忙,请帮忙。
这是修复启动器消息
发送市场数据请求
string symbol="MSFT";//发送市场数据请求QuickFix42.MarketDataRequest市场数据请求=新的QuickFix42.市场数据请求();
marketDataRequest.set(new MDReqID("1"));
marketDataRequest.set(new SubscriptionRequestType('1'));
marketDataRequest.set(new MarketDepth(1));
marketDataRequest.set(new MDUpdateType(1));
marketDataRequest.set(new AggregatedBook(true));
marketDataRequest.set(new NoMDEntryTypes(2));
QuickFix42.MarketDataRequest.NoMDEntryTypes group = new QuickFix42.MarketDataRequest.NoMDEntryTypes();
group.set(new MDEntryType('0'));
marketDataRequest.addGroup(group);
group.set(new MDEntryType('1'));
marketDataRequest.addGroup(group);
marketDataRequest.set(new NoRelatedSym(1));
QuickFix42.MarketDataRequest.NoRelatedSym group2 = new QuickFix42.MarketDataRequest.NoRelatedSym();
group2.set(new Symbol(symbol));
marketDataRequest.addGroup(group2);
//Send message
Session.sendToTarget(marketDataRequest, sessionID);
FixAcceptor代码
public override void onMessage(QuickFix42.MarketDataRequest消息,SessionID会话){var relatedSymbol=新QuickFix42.MarketDataRequest.NoRelatedSym();
Group g = message.getGroup(1, relatedSymbol);
string symbol=relatedSymbol.get(new Symbol()).getValue();
Console.WriteLine("Got marketdata request for Symbol {0}", symbol );
// Thread.Sleep(1000);
QuickFix42.MarketDataIncrementalRefresh prices = new QuickFix42.MarketDataIncrementalRefresh();
prices.set(new MDReqID("1"));
var mp = new QuickFix42.MarketDataIncrementalRefresh.NoMDEntries();
mp.set(new MDUpdateAction('0'));//tag 279
//price type
mp.set(new MDEntryType('0'));//tag:269
mp.set(new MDEntrySize(2345));
//Symbol
mp.set(new Symbol(symbol));
//Price of the Market Data Entry.
mp.set(new MDEntryPx(36.45d));
prices.addGroup(mp);
try
{
Session.sendToTarget(prices, session);
}
catch (SessionNotFound) { }
}
在FixAcceptor 中接收MarketDataIncrementalRefresh消息
public override void onMessage(MarketDataIncrementalRefresh message, SessionID session)
{
try
{
System.Console.WriteLine("MarketDataIncrementalRefresh : " + message.ToString());
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();
Text text = new Text();
//message.get(mdreqid);
message.get(nomdentries);
int list = nomdentries.getValue();
if (message.isSetNoMDEntries())
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);
//group.get(expiredate);
//group.get(expiretime);
//if (mdupdateaction.getValue() == '0')
// group.get(numberoforders);
//group.get(mdentrypositionno);
//group.get(text);
//if (mdupdateaction.getValue() == '0')
//{
// for (int x = 0; x < mainapp.MDlist.Length; x++)
// {
// if (symbol.ToString() == mainapp.MDlist[x].Symbol)
// {
// if (mdentrytype.getValue() == '0')
// mainapp.MDlist[x].Bid = (float)mdentrypx.getValue();
// else if (mdentrytype.getValue() == '1')
// mainapp.MDlist[x].Ask = (float)mdentrypx.getValue();
// }
// }
//}
}
Console.WriteLine("Got Symbol {0} Price {1}", symbol.getValue(), mdentrypx.getValue());
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
但是在处得到错误FieldNotFoundException
message.getGroup(i+1,group);
int list = nomdentries.getValue();
你的问题是这条线。仅当列表不为0时使用getGroup。你有这个价值,你不需要这个
if (message.isSetNoMDEntries())
你为什么不做这个
for (uint i = 1; i <= list; ++i)
{
message.getGroup(i, group);
你能不能把你收到的一条FIX消息粘贴在上面,正确地分解,而不是一条模糊的字符串。如果你试着解开固定装置的绳子,你会处于一个更好的位置。
您的消息不完整,因为它缺少一个强制标记279。查看此网站了解消息中的必填字段和非必填字段。将帮助您更容易地发现错误。
我解决了这个问题,问题是数据字典的路径是错误的,并且没有指向正确的数据字典文件。