我正在使用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 =)。如果没有成功登录,这也可能阻止成功登录。

希望这可以帮助!

07-24 20:58