Логгер котировок с Финам через Transaq Connector на C#

작업 종료됨

실행 시간 28 일
고객의 피드백
If I could give Andriy 20 starts out of 5, I would do it. Very thoughtful work, done in time, high quality, modular code, functionality works as epxected by the spec or better. Highly recommend!

명시

Создать следующую консольную программу на C# .NET 6.0 в виде Solution Visual Studio (Community) 2022:

1) Подключается к Финам по логину-паролю-серверу-порту, зашитым в код

2) Использует Transaq Connector DLL (https://www.finam.ru/howtotrade/soft/tconnector/), можно начать с приложенного там демо-примера на C#

3) Единократно подписывается на актуальные обратные вызовы (callback-и) для получения **всех** данных всех котировок, сделок, тиков и глубины рынка (полный набор полей согласно "4.9 Котировки по инструменту(ам)", "4.10 Сделки по инструменту(ам)", "4.11 Глубина рынка по инструменту(ам)" и "4.17 Тиковые данные" в терминах TXmlConnector.pdf), по определённому набору инструментов (см. далее п.4), и накапливает их полное содержимое по мере получения данных от Финам внутрь callback-ов в конкурентную очередь; также сохраняет полную информацию обо всех этих инструментах (согласно "4.7 Информация по инструменту" по TXmlConnector.pdf) из набора в момент начала очередного цикла наполнения пустой очереди (см. далее)

4) Набор инструментов (по "4.6 Список инструментов" и "4.7 Информация по инструменту" в терминах TXmlConnector.pdf) определяется в начале каждого нового цикла наполнения пустой очереди как полный список инструментов одного из типов (BOND, FUT, OPT, GKO, FOB), полученный через "4.6 Список инструментов", значение типа по умолчанию зашито в коде как "GKO". Так предлагается сделать потому, что список инструментов по указанному типу вообще говоря может меняться с течением времени

5) В начале каждой новой календарной минуты асинхронно записывает всё текущее содержимое очереди в пять файлов с именами вида "2024.07.06-14.55.00.178-{тип}.csv" (формат "ГГГГ.ММ.ДД-чч.мм.сс.млс-{тип}.csv") в виде CSV, соответствующему содержимому оригинальных XML, полученных в callback-ах (подробнее о трансформации XML в CSV см. п.6). {тип} — это, соответственно, одно из пяти значений: "instruments" (для данных инструментов), "quotes" (для котировок), "depth" (для глубины рынка), "trades" (для сделок) и "ticks" (для тиков). Дата и время (с миллисекундами) в имени файла соответствует моменту ровно перед тем, как текущее содержимое очереди отправлено на запись. В момент, когда очередь отправляется на запись по (еже)минутному таймеру, в соответствующий асинхронный обработчик передаётся копия этой очереди, тогда как оригинальная очередь тут же атомарно и синхронно очищается, после чего асинхронный обработчик сохранения очереди оказывается запущен, и мы попадаем в состояние начала очредного цикла наполнения пустой очереди: очищенная исходная очередь вновь продолжит асинхронно накапливать получаемые в callback-ах данные

6) Раскладка XML-лей на CSV — по здравому смыслу в плоские таблицы, например, для сделок (см. "4.10 Сделки по инструменту(ам)"): каждая сделка будет представлять собой строку таблицы CSV вида datetime, secid, seccode, tradeno, time, board, price, quantity, quantity, openinterest, period; здесь datetime добавляется нами как тот момент времени в виде строки "ГГГГ.ММ.ДД-чч.мм.сс.млс", когда мы только что получили вход в наш callback, а все остальные поля имеются "как есть" в получаемом XML. Соответственно, мы всегда сможем идентифицировать "блоки" изменившейся структуры данных (например, стакана), как группу с одним и тем же значением поля datetime "ГГГГ.ММ.ДД-чч.мм.сс.млс" — момента входа в соответствующий callback.

7) программа работает бесконечным циклом

8) максимально должна использоваться асинхронная обработка и корректная обработка конкуррентности (вероятно, необходимо зайдействовать ConcurrentQueue): таким образом, например, конвертация очередного полученного XML в табличные данные и дамп наполненной очереди(ей) в файлы не будут блокировать слушателей callback-ов и не будут блокировать друг друга. Не могу сказать, лучше ли иметь одну очередь для всех пяти типов потоков данных (заявки, данные инструметнов, котировки, тики и глубина рынка), или же пять разных, это на ваше усмотрение. Главное, чтобы всё асинхронно и конкурентно развязывалось и не создавалось deadlocks. Важно, чтобы коллбеки не блокировались, поскольку в них мы сохраняем наиболее возможно точный момент возникновения новых данных (время входа в callback), это важное поле

Разработанная программа передаётся заказчику полностью в виде исходного кода без каких-либо дополнительных собственных сторонних библиотек с закрытым кодом.


응답함

1
개발자 1
등급
(337)
프로젝트
624
38%
중재
39
23% / 64%
기한 초과
93
15%
무료
게재됨: 4 기고글, 19 코드
2
개발자 2
등급
(6)
프로젝트
8
13%
중재
0
기한 초과
1
13%
무료
게재됨: 1 코드
3
개발자 3
등급
(21)
프로젝트
35
54%
중재
8
63% / 38%
기한 초과
1
3%
무료
4
개발자 4
등급
(284)
프로젝트
459
39%
중재
95
43% / 19%
기한 초과
73
16%
바쁜
게재됨: 2 코드

프로젝트 정보

예산
150 - 200 USD
VAT (25%): 37.5 - 50 USD
총: 187.5 - 250 USD
개발자에게
135 - 180 USD