Отправка сообщения в определенный сеанс в QUICKFIX N

Недавно мне поручили сделать базовую торговую платформу для начинающих трейдеров. Я подключаюсь к реализации банка FIX 4.4.

Банк указал 2 сеанса. Один для данных котировок и один для исполнения сделок.

Я использую QuickfixN и кодирую на С#

Я настроил конфигурацию сеанса инициатора так, чтобы в нем были оба сеанса. Порт другой, а идентификаторы целевой и отправляющей компов разные. Я могу подключиться к обоим нормально. То, с чем я борюсь, - это выяснить, как отправлять запросы на заказ через один сеанс, а не через другой.

Для обоих сеансов требуется FIX 4.4. По умолчанию он просто использует первый сеанс.


person Brett    schedule 09.05.2016    source источник


Ответы (2)


При создании инициаторов сохраните объекты сеанса в переменных. (Возможно, с помощью обратного вызова OnCreate, как это сделано здесь. )

Сделайте эти переменные доступными для класса отправки сообщений.

Затем, чтобы отправить сообщения, просто позвоните по одному из:

quoteSession.send(msg)
tradeSession.send(msg)
person Grant Birchmeier    schedule 09.05.2016
comment
Спасибо! OnCreate был той частью, которая мне была нужна! - person Brett; 10.05.2016

Что ж, вам нужно мультиплексировать SessionId сеанса, в котором нужно отправить сообщение, и настроить заголовок сообщения. Что-то вроде этого (на Java):

public void mySend (Message m) throws FieldNotFound 
{       
    String beginString = "FIX.4.4";
    String sender = "SENDER";
    String target = "TARGET";

    // Set the message headers
    m.getHeader().setField(new SenderCompID(sender));
    m.getHeader().setField(new TargetCompID(target));

    // Set the correct session for the initiator to send out to
    SessionID s = new SessionID(beginString, sender, target);

    // Lookup the relevant QF session
    _session = Session.lookupSession(s);

    // Send the FIX message
    try
    {
            if (_session != null)
            {
                _session.send(m);
            }
            else
            {
                log("Can't send message: FIX session not created.");
                log(" " + m.toString());
            }
    }
    catch (Exception e)
    {
            errorHandler(e);
    }
}
person rupweb    schedule 09.05.2016
comment
Установка заголовков здесь бесполезна; они будут затерты значениями сеанса в течение _session.send(m). Кроме того, нет необходимости выполнять поиск сеанса для каждой отправки; лучше просто сохранить сеансы во внешне видимые vars и позволить вызывающему абоненту решить, какой из них использовать. - person Grant Birchmeier; 09.05.2016
comment
Спасибо, я не знал, что теги id отправителя и целевого идентификатора comp для сообщения QF будут перезаписаны вызовом send. Верно? Код, подобный приведенному выше, должен был быть быстрым способом решения мультиплексирования между множеством различных сеансов приема и инициирования (т. е. для распределения цен и обновлений для многих клиентов FIX), и да, управление каким-то внутренним массивом сеансов — лучший способ сделать это. (вы не знаете, сколько сессий будет динамически подключено/дискотека и т. д.) - person rupweb; 11.05.2016
comment
Верный. Большую часть времени вы будете создавать сообщение, вообще не устанавливая никаких полей заголовка; вы просто полагаетесь на то, что движок сделает это за вас на основе сеанса. В QuickFIX/n все BeginString/SenderCompID/TargetCompID будут затерты. В Java я не уверен на 100%, но подозреваю, что то же самое. - person Grant Birchmeier; 12.05.2016