Напишите программу для простейшего матчинга заявок на упрощенной бирже. На бирже торгуется четыре ценных бумаги ("A", "B", "C" и "D"). Базовая валюта биржи - доллар ("$").
Входные данные для программы содержатся в двух файлах. Первый файл clients.txt
содержит список клиентов биржи с указанием их исходных балансов по торгующимся ценным бумагам и доллару.
Второй файл, orders.txt
, это список заявок от клиентов в хронологическом порядке.
Результатом работы программы является файл result.txt
аналогичный по структуре файлу clients.txt
и содержащий состояние балансов всех клиетов после обработки всех заявок.
Структура файлов предельно проста. Каждая строка тесктового файла содержит одну запись. Поля записи отделяются друг от друга с помощью символа табуляции (\t). Имена клиентов, названия ценных бумаг - строки, состоящие из буквенных и цифровых символов ASCII без разделителей. Числовые значения представлены целыми числами.
Файл списка клиетов имеет следующие поля:
- Имя клиента
- Баланс клиента по долларам
- Баланс клиента по ценной бумаге "A" в штуках
- Баланс по ценной бумаге "B"
- Баланс по ценной бумаге "C"
- Баланс по ценной бумаге "D"
Пример нескольких строк файла:
C1 1000 10 5 15 0
C2 2000 3 35 40 10
Файл списка заявок имеет формат:
- Имя клиента выставившего заявку
- Символ операции: "s" - продажа или "b" - покупка.
- Наименование ценной бумаги
- Цена заявки (целое число за одну штуку ценной бумаги)
- Количество продаваемых или покупаемых ценных бумаг
Пример нескольких строк файла:
C1 b A 7 12
C2 s A 8 10
- Частичное сопоставление заявок реализовывать не обязательно. Для упрощения можно сопоставлять заявки только по полному совпадению цены и количества.
- Не нужно обрабатывать ситуации продажи и покупки самому себе.
- Состояние счетов клиентов можно обрабатывать без транзакций.
- Для простоты можно не проверять отрицательные балансы клиентов по ценным бумагам и долларам.
- Основной результат - файл конечного состояния счетов клиентов биржи после обработки предоставленных данных
- Исходный код проекта на Github
- Набор unit-тестов
- В ТЗ не указанно, по какой цене совершать сделку, если цены заявок перекрываются (продавец готов продавать по цене ниже чем покупатель готов покупать). Логика определения цены по сделке реализованна в методе State.priceLogic .
- Я также реализовал контроль отрицательных баллансов, хотя в задании сказано, что это делать не обязательно (см. п.4 выше). Он реализован в методе Client.able и что бы его отключить, достаточно сделать его =true .
- Моя программа не обрабатывает ситуации отсутствия входных файлов, некорректого содержимого в них итп. В этом случае будут выброшены штатные exception-ы.