我正在使用 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 session 的解决方案(应该很容易移植 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=)是有效的。如果它不存在,这也可能会阻止成功登录。
希望这对您有所帮助!
关于c++ - 由于密码丢失,QuickFix 登录失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25662928/