简体   繁体   中英

QuickFix Login Failed due to password missing

I am using quickfix C++ implementation to connect to the FIX Server, everything is ok except when i tries to connect it says the field missing username. To correct this i added the following code to the toAdmin Method

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();
 }
}

but is causes an exception. To check whether it is working or not also tried to print the message using std::cout<<message.ToString();

but nothing worked.

I think you were almost there. Here is my solution for initiating a FIX session with FXCM in C# (should be easy for you to port a C++ implementation).

1- Use the QuickFix Examples.TradeClient project.

2- Ensure your fix.cfg file is present in TradeClient/bin/Debug directory.

3- Ensure your dictionary (FIXFXCM10.XML) is present in TradeClient/bin/Debug directory.

4- Your main Program.cs should look something like this;

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();

and replace

public void ToAdmin(Message message, SessionID sessionID) {}

with this

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 require the account number (tag 1=) to be sent with every message to be valid. That could also prevent a successful logon if its not present.

Hope this helps!

This is how I added password:

void toAdmin( FIX::Message& message, const FIX::SessionID& sessionID)
{
    // put password in the logon message
    if (FIX::MsgType_Logon == message.getHeader().getField(FIX::FIELD::MsgType))
    {
        FIX::Password fixpasswd = ConfigSingleton::getInstance().CurrenexConfig.FIXPassword; //use your std::string password here.
        message.getHeader().setField(FIX::Password(fixpasswd)); //also add username here.
    }
}

If you can see your username and password, then it means ok already. Regarding the exception, I also encountered before. For me, it comes from toApp function and I changed it as below and it works fine:

void toApp( FIX::Message& message, const FIX::SessionID& sessionID )
    throw( FIX::DoNotSend )
{
    try
    {
        FIX::PossDupFlag possDupFlag;
        message.getHeader().getField( possDupFlag );
        if ( possDupFlag ) throw FIX::DoNotSend();
    }
    catch ( FIX::FieldNotFound& e) 
    {
        //std::cout <<  e.what() << " " << message.toString() << ENDLINE;
    }
}

Actually, no exception.

BTW, if you didn't define your own function for some message types, the messages will be rejected.

Hope this will help.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM