2014-09-04 66 views
1

我正在使用quickfix C++實現連接到FIX服務器,除了當我嘗試連接它時表示缺少用戶名的字段,一切都正常。爲了解決這個問題,我在代碼中添加了以下代碼QuickFix登錄失敗,由於密碼丟失

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

打印該消息,但沒有任何工作。

+0

您可以查看日誌文件以找出FIX消息格式並查看缺少的內容。 – billz 2014-09-04 10:20:53

+1

拋出的異常是什麼? – 2014-09-04 13:28:54

+0

這個問題解決您的問題? http://stackoverflow.com/questions/13348939/how-to-make-the-login-part-in-quickfix。並檢查這裏http://niki.code-karma.com/2011/01/quickfix-logon-support-for-username-password/ – DumbCoder 2014-09-04 13:52:10

回答

0

我想你幾乎在那裏。這裏是我在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),以與每一個消息中發送是有效的。如果它不存在,這也可能阻止成功登錄。

希望這會有所幫助!

0

這是我補充的密碼:

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. 
    } 
} 

如果你能看到你的用戶名和密碼,那麼就意味着確定了。關於例外,我也遇到過。對我來說,它來自於應用功能,我改變它如下,它工作正常:

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

其實,沒有例外。

順便說一句,如果您沒有爲某些消息類型定義自己的函數,則消息將被拒絕。

希望這會有所幫助。