2

QuickFix (C#) を使用して Fix イニシエーターを作成しています。ユーザー名とパスワードを使用して FXCM サーバーにログオンしようとしています。しかし、私の onLogon メソッドは決してトリガーされません。SocketInitior が開始されると、onCreate メソッドが実行され、次に onLogout メソッドが呼び出されます。onCreate メソッドの後、onLogon メソッドが実行されているはずですが、実行されていません。したがって、initiator.isLoggedOn() メソッドは常に false を返します。どうすれば正常にログオンできますか?

私の QuickFix.Application インターフェイス実装アプリケーションは次のとおりです。

イニシエーター.start(); の後 onLogon メソッドが実行されていません。

class MyApp2 : QuickFix44.MessageCracker, QuickFix.Application
{
    public SessionID sessionId;
    private SessionSettings settings;
    private string userName, password, userPin;
    private CollInquiryID colInquiryId;
    private DateTime startDate;
    private const int REQUEST_LIST_OF_TRADING_SESSIONS = 5;
    private object requestID = 1;
    public MyApp2(QuickFix.SessionSettings setting)
    {
        long temp = 0;
        this.requestID = temp;
        this.settings = setting;
    }
    public void fromAdmin(Message message, SessionID sessionId)
    {
        try
        {
            crack(message, sessionId);
        }
        catch (Exception ex)
        {

            throw ex;
        }
    }

    public void fromApp(Message message, SessionID sessionId)
    {
        try
        {
            crack(message, sessionId);
        }
        catch (Exception ex)
        {

            throw ex;
        }
    }

    public void onCreate(SessionID sessionId)
    {
        this.sessionId = sessionId;
        this.userName = this.settings.get(this.sessionId).getString("username");
        this.password = this.settings.get(this.sessionId).getString("password");

    }

    public void onLogon(SessionID sessionId)
    {
        Console.WriteLine("Login for :{0}", this.userName);
        this.startDate = new DateTime();
        this.SendUserRequest();
        this.SendUserRequest();
    }

    public void onLogout(SessionID sessionId)
    {

    }

    public void toAdmin(Message message, SessionID sessionId)
    {

    }

    public void toApp(Message message, SessionID sessionId)
    {

    }
    public void SendUserRequest()
    {
        QuickFix44.UserRequest userRequest = new QuickFix44.UserRequest();
        userRequest.setString(UserRequestID.FIELD, this.NextId().ToString());
        userRequest.setString(QuickFix.Username.FIELD, this.userName);
        userRequest.setString(QuickFix.Password.FIELD, this.password);
        userRequest.setInt(QuickFix.UserRequestType.FIELD, REQUEST_LIST_OF_TRADING_SESSIONS);
        this.Send(userRequest);
    }
    public void Send(Message message)
    {
        try
        {
            bool isSent = QuickFix.Session.sendToTarget(message, this.sessionId);
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
    private long NextId()
    {
        lock (this.requestID)
        {
            long temp = (long)this.requestID;
            this.requestID = ++temp;
            if (temp > 0x7FFFFFF0)
            {
                temp = 1;
                this.requestID = temp;
            }
        }
        return (long)this.requestID;
    }
}

主なプログラムは次のとおりです。

            string path = "quickfix.cfg";
            FileStream reader = new FileStream(path,FileMode.Open);
            SessionSettings settings = new SessionSettings(reader);
            reader.Close();
            MyApp2 application = new MyApp2(settings);
            MessageStoreFactory storeFactory = new FileStoreFactory(settings);
            LogFactory logFactory = new FileLogFactory(settings);
            MessageFactory messageFactory = new DefaultMessageFactory();
            SocketInitiator initiator = new SocketInitiator(application, storeFactory, settings, logFactory, messageFactory);
            initiator.start();
4

4 に答える 4

0

FXCMでどのように行われるかはわかりませんが onLogon、サーバーへのログオンが成功するとメソッドがトリガーされることはわかっています。したがって、ログオン要求を送信する前に、usernameとを追加する必要があります。passwordパスワードとユーザー名の追加をtoAdminメソッドに移動してみてください。それらが正しく、サーバーへのログオンが成功した場合、onLogonトリガーされます。

とにかく、FXCM FIX APIサポートフォーラムからより具体的なヘルプを得ることができます:http: //forexforums.dailyfx.com/fix-api-support/

于 2011-09-13T17:35:29.220 に答える
0

これは非常に古いものですが、最近 c# で同じことをしようとしていたので、おそらく答えは誰かに役立つでしょう。これをオーバーライドする必要があります

public void toAdmin(Message message, SessionID sessionId){ }

詳細はこちら:カスタム ログオンの実装

于 2012-02-23T19:27:26.093 に答える
0

FIX メッセージをヘッダーと共に送信するには、 MyApp2クラスにメソッドを追加する 必要があります。そうしないと、サーバーが適切に応答できなくなります。

このメソッドを追加します:

    private void setHeader(QuickFix.Message message)
    {
        message.getHeader().setField(new QuickFix.TargetSubID(settings.get(sessionID).getString("TargetSubID")));
    }

toAdmin および toApp メソッドで呼び出します。設定ファイルでTargetSubIDを確認することを忘れないでください。持っていない場合は、cfg ファイルに SUBID を追加するだけです。

于 2012-04-03T10:00:03.390 に答える