Проблема входа в QuickFix - PullRequest
       5

Проблема входа в QuickFix

2 голосов
/ 07 сентября 2011

Я использую QuickFix (C #) для создания инициатора исправления. Я пытаюсь войти на сервер FXCM, используя имя пользователя и пароль. Но мой метод onLogon никогда не срабатывает. Когда SocketInitior запущен, метод onCreate работает, затем вызывается метод onLogout. После метода onCreate метод onLogon должен быть запущен, но он не запущен. Поэтому всегда метод initiator.isLoggedOn () возвращает false. Как я могу успешно войти в систему?

Мой интерфейс QuickFix.Application реализован следующим образом:

После initiator.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 ]

1 голос
/ 14 января 2017

Вот мое решение для начала сеанса FIX с FXCM.

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 =) отправлялся с каждым сообщением, чтобы оно было действительным.

Надеюсь, это поможет кому-то там попытаться начать сеанс FIX с FXCM!

0 голосов
/ 23 февраля 2012

Это очень старый, но, возможно, ответ кому-нибудь пригодится, так как я недавно пытался сделать то же самое в c #. Вы должны переопределить это

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

Подробнее см. Здесь: Реализация пользовательских входов в систему

0 голосов
/ 03 апреля 2012

Вы должны добавить метод в свой класс MyApp2 , чтобы отправить сообщение FIX с вашим заголовком, иначе ваш сервер не сможет ответить вам должным образом.

Добавьте этот метод:

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

и вызовите его в методах toAdmin и toApp. Никогда не забывайте проверять свой файл конфигурации на TargetSubID . Если у вас его нет, просто добавьте SUBID в свой файл cfg.

0 голосов
/ 13 сентября 2011

Я не уверен, как это делается с FXCM, но я знаю, onLogon метод запускается в ответ на успешный вход на сервер. Следовательно, вы должны добавить username и password перед отправкой запроса на вход. Попробуйте переместить добавление пароля и имени пользователя в метод toAdmin. Если они верны, и у вас есть успешный вход на сервер - onLogon будет запущен.

В любом случае, вы можете получить более конкретную помощь на форуме поддержки FXCM FIX API: http://forexforums.dailyfx.com/fix-api-support/

...