我正在使用quickfix C ++实现连接到FIX服务器,一切正常,除非我尝试连接它时说字段缺少用户名。为了解决这个问题,我在toAdmin方法中添加了以下代码
void Application::toAdmin( FIX::Message& message, const FIX::SessionID& sessionID)
{
if (FIX::MsgType_Logon == message.getHeader().getField(FIX::FIELD::MsgType))
{
FIX44::Logon & logon_message = dynamic_cast<FIX44::Logon&>(message);
logon_message.setField(FIX::Username("username"));
logon_message.setField(FIX::Password("password"));
}
std::cout<<message.toString();
}
}
但会导致异常。要检查它是否正常工作,还尝试使用
std::cout<<message.ToString();
打印消息但没有任何效果。
最佳答案
我想你快到了。这是我的解决方案,用于在C#中使用FXCM启动FIX会话(对于您来说,移植C ++实现应该很容易)。
1-使用QuickFix Examples.TradeClient项目。
2-确保您的fix.cfg文件存在于TradeClient / bin / Debug目录中。
3-确保您的字典(FIXFXCM10.XML)存在于TradeClient / bin / Debug目录中。
4-您的主Program.cs应该看起来像这样;
var settings = new QuickFix.SessionSettings("fix.cfg");
var client = new QuickFixClient();
var storeFactory = new QuickFix.FileStoreFactory(settings);
var logFactory = new QuickFix.ScreenLogFactory(settings);
var initiator = new QuickFix.Transport.SocketInitiator(client, storeFactory, settings, logFactory);
initiator.Start();
client.Run();
initiator.Stop();
并更换
public void ToAdmin(Message message, SessionID sessionID) {}
有了这个
public void ToAdmin(Message message, SessionID sessionID)
{
if (message.GetType() == typeof(QuickFix.FIX44.Logon))
{
message.SetField(new Username("YOUR_USERNAME"));
message.SetField(new Password("YOUR_PASSWORD"));
}
message.SetField(new QuickFix.Fields.Account("YOUR_ACCOUNT_NUMBER"));
}
福汇(FXCM)要求在发送每条消息时都必须发送帐号(标签1 =)。如果没有成功登录,这也可能阻止成功登录。
希望这可以帮助!