Как разобрать строку FIXMessage в объект FIXMessage в С#

У меня есть строковое сообщение FIX в качестве входных данных, и я хочу преобразовать его в сообщение FIX. Я использую QuickFix 1.13.3 (которую я скачал несколько дней назад с сайта quickfix)

Я совсем новичок в QuickFix. Большая часть примера кода / справки, которую вернул Google, предназначена для Java, и также не предлагается прямого пути, когда приложение имеет полезную нагрузку FIXMessage в виде строки.

Большинство примеров, которые я видел в Интернете, — это случаи, когда люди используют QuickFix для сквозного соединения, то есть от связи через сокет до получения сообщения и его взлома.

В моем случае у меня есть собственный коммуникационный уровень, который просто доставляет мне строковую полезную нагрузку, представляющую собой полноценное сообщение FIX. Все, что мне нужно, это проанализировать строку и получить список всех тегов/значений.

Хотя я сам написал небольшую утилиту для разбора сообщения FIX с использованием стандартного string.split().... но кто-то предложил мне использовать QuickFix, так как он поддерживает все.

Но я изо всех сил пытаюсь начать даже с очень простой задачи в QuickFix, поэтому любая помощь в повторном анализе полезной нагрузки строки будет высоко оценена.

Ниже то, что я ищу

//Конвертер или взломщик

public QuickFix44.Message GetMessage(string payload);

// Звонящий

string newOrderSinglePayload = "8=FIX.4.49=13635=D..............";

QuickFix44:Message message = GetMessage(newOrderSinglePayload);

if (message is QuickFix44.NewOrderSingle)

{ 
   //I am happy
}

Если QuickFix слишком много для этой простой работы, я готов использовать любой другой инструмент (бесплатный и с открытым исходным кодом).


person Ishwar Jindal    schedule 10.05.2013    source источник


Ответы (1)


QuickFIX определенно предназначен для сквозного монтажа. Некоторые из его классов можно использовать для других целей, но для этих менее распространенных вариантов использования не так много документации.

Вы можете передать строки FIX в конструктор Message.

// Uses default DataDictionary (e.g. message definitions from FIX spec)
Message::Message( const std::string& string, bool validate )

// Uses a DataDictionary that you supply.
// If your msg has custom fields, you need this one.
// (You'll create a DD from a custom msg definition XML file that
// you'll also need to create)
Message::Message( const std::string& string,
                  const DataDictionary& dataDictionary,
                  bool validate )

Чтобы преобразовать это сообщение в более конкретный тип, вы можете передать его конструктору более конкретного типа, например ExecutionReport(Message).

Рассматривали ли вы QuickFIX/n, собственный порт C#?

Это будет работать с QuickFIX/n:

IMessageFactory _defaultMsgFactory = new DefaultMessageFactory();

var dd = new QuickFix.DataDictionary.DataDictionary();
dd.Load("../../../spec/fix/FIX44.xml");

var msg = new QuickFix.FIX44.ExecutionReport();
msg.FromString(msg_string, false, dd, dd, _defaultMsgFactory);

Если ваш XML сильно изменен, вы, вероятно, захотите сначала заново сгенерировать исходный код и пересобрать библиотеки.

person Grant Birchmeier    schedule 10.05.2013
comment
в их .NET API конструктор ExecutionReport или фактически любой конструктор, представляющий конкретный тип (например, NOS) и т. д., не принимает тип сообщения в качестве входных данных. Его подпись - ExecutionReport(string orderId, string,int........), т.е. как для создания ER, когда у кого-то есть все входные данные - person Ishwar Jindal; 13.05.2013
comment
Фу. Извините, я не очень хорошо знаю API обертки. В некоторых отношениях он отличается от C++, что разочаровывает. Пробовали ли вы QuickFIX/n, родной порт C#? - person Grant Birchmeier; 13.05.2013
comment
Я добавил, как это сделать в QuickFIX/n. - person Grant Birchmeier; 13.05.2013