/exchange

Stocks order matching demo

Primary LanguageScalaThe UnlicenseUnlicense

Описание задачи

Напишите программу для простейшего матчинга заявок на упрощенной бирже. На бирже торгуется четыре ценных бумаги ("A", "B", "C" и "D"). Базовая валюта биржи - доллар ("$").

Входные данные для программы содержатся в двух файлах. Первый файл clients.txt содержит список клиентов биржи с указанием их исходных балансов по торгующимся ценным бумагам и доллару. Второй файл, orders.txt, это список заявок от клиентов в хронологическом порядке. Результатом работы программы является файл result.txt аналогичный по структуре файлу clients.txt и содержащий состояние балансов всех клиетов после обработки всех заявок.

Описание форматов файлов

Структура файлов предельно проста. Каждая строка тесктового файла содержит одну запись. Поля записи отделяются друг от друга с помощью символа табуляции (\t). Имена клиентов, названия ценных бумаг - строки, состоящие из буквенных и цифровых символов ASCII без разделителей. Числовые значения представлены целыми числами.

Файл clients.txt

Файл списка клиетов имеет следующие поля:

  • Имя клиента
  • Баланс клиента по долларам
  • Баланс клиента по ценной бумаге "A" в штуках
  • Баланс по ценной бумаге "B"
  • Баланс по ценной бумаге "C"
  • Баланс по ценной бумаге "D"

Пример нескольких строк файла:

C1  1000    10  5   15  0 
C2  2000    3   35  40  10

Файл orders.txt

Файл списка заявок имеет формат:

  • Имя клиента выставившего заявку
  • Символ операции: "s" - продажа или "b" - покупка.
  • Наименование ценной бумаги
  • Цена заявки (целое число за одну штуку ценной бумаги)
  • Количество продаваемых или покупаемых ценных бумаг

Пример нескольких строк файла:

C1  b   A   7   12
C2  s   A   8   10

Замечания

  1. Частичное сопоставление заявок реализовывать не обязательно. Для упрощения можно сопоставлять заявки только по полному совпадению цены и количества.
  2. Не нужно обрабатывать ситуации продажи и покупки самому себе.
  3. Состояние счетов клиентов можно обрабатывать без транзакций.
  4. Для простоты можно не проверять отрицательные балансы клиентов по ценным бумагам и долларам.

Ожидаемые результаты

  • Основной результат - файл конечного состояния счетов клиентов биржи после обработки предоставленных данных
  • Исходный код проекта на Github
  • Набор unit-тестов

Замечания по реализации

  • В ТЗ не указанно, по какой цене совершать сделку, если цены заявок перекрываются (продавец готов продавать по цене ниже чем покупатель готов покупать). Логика определения цены по сделке реализованна в методе State.priceLogic .
  • Я также реализовал контроль отрицательных баллансов, хотя в задании сказано, что это делать не обязательно (см. п.4 выше). Он реализован в методе Client.able и что бы его отключить, достаточно сделать его =true .
  • Моя программа не обрабатывает ситуации отсутствия входных файлов, некорректого содержимого в них итп. В этом случае будут выброшены штатные exception-ы.