Отправка сообщения в QuickFIX

Я использую примеры кода Python из «http://www.quickfixengine.org» и у меня есть вопрос. Я создаю свое приложение, используя сегмент кода, показанный ниже.

import quickfix

if len(sys.argv) < 2: return
fileName = sys.argv[1]

try:
    settings = quickfix.SessionSettings(fileName)
    application = quickfix.MyApplication()
    storeFactory = quickfix.FileStoreFactory(settings)
    logFactory = quickfix.FileLogFactory(settings)
    initiator = quickfix.SocketInitiator(application, storeFactory, settings, logFactory)
    initiator.start()
    # while condition == true: do something
    initiator.stop()
except quickfix.ConfigError, e:
    print e

Соединение установлено, я вхожу в систему, и теперь я хочу отправить сообщение (заказ, например). Предоставленный сегмент кода для этого:

def sendOrderCancelRequest:
    message = quickfix.Message();
    header = message.getHeader();

    header.setField(...)
    *<...build the header and body...>*
    message.setField(...)

    Session.sendToTarget(message)

Мой вопрос об этом объекте Session. Где/как это создается? Он создается с помощью чего-то вроде Session = quickfix.Session() или чего-то еще, что они не показывают? Я пробовал несколько вещей, но из-за нехватки документации это просто метод проб и ошибок...


person gearhead    schedule 16.11.2012    source источник


Ответы (1)


Session — это не объект, это класс. В данном случае sendToTarget() является статическим методом.

Session поддерживает статический для класса список сеансов. sendToTarget() использует поля заголовка в вашем сообщении (или те, которые вы указали явно), чтобы определить, в какой сеанс отправлять сообщения.


EDIT: я неправильно понял ваш вопрос. Вот ответ на ваш вопрос.

Сессия создается в недрах движка QF. Он создается SessionFactory, который сам создается в функции initialize() Initiator и Acceptor. Это то, что вам нужно, только если вы хотите взломать исходный код движка.

Как разработчик приложения, вам действительно не нужен дескриптор сеанса. Если вы думаете, что делаете, то я предполагаю, что вы, вероятно, планируете сделать что-то, что не рекомендуется (например, желание программно сбросить последовательности, что является обычной плохой идеей новичка в списках QF).

Если вам действительно нужен дескриптор, вы можете использовать Session.lookupSession() или одну из getSession() функций Initiator или Acceptor. Но опять же, не вижу причин заморачиваться. Я опытный пользователь QF, и мне пришлось поискать это, потому что я никогда этого не делал.

person Grant Birchmeier    schedule 17.11.2012
comment
Спасибо @грант. Я понимаю, что sendToTarget() - это метод в Session, мой вопрос в том, где создается экземпляр класса. Нигде в коде (который я разместил) нет ничего с именем Session, созданным для того, чтобы его можно было использовать. - person gearhead; 20.11.2012
comment
@gearhead - мой плохой, я неправильно понял. Смотрите мое обновление к ответу. - person Grant Birchmeier; 20.11.2012
comment
Спасибо @Грант. Я полагал, что это было создано за кулисами. Я получаю ошибки, когда использую код с сайта QuickFIX. Когда дело доходит до этой строки, я получаю ошибку времени выполнения: "NameError: name 'Session' is not defined" Что имеет смысл, потому что я никогда не создаю ничего с таким именем... Хотя я думаю, что понял это. Если вместо этого я использую: quickfix.Session_sendToTarget(message) Все кажется работает Еще раз спасибо, @Grant. Я очень ценю всю помощь и советы, которые вы дали в моих последних постах. - person gearhead; 20.11.2012
comment
Это подчеркивание должно быть соглашением, созданным для оболочки Python. И вам за помощь! - person Grant Birchmeier; 20.11.2012