Я разрабатываю систему, предназначенную для расчета различных показателей в наборе холдингов на основе начального дневного холдинга и подачи новых сделок и ценовых тиков. Исходная информация поступает из службы WCF с событиями для новых сделок и обновлений цен.Оптимальный дизайн OO для портфеля смешанных инструментов
Необходимые показатели включают рыночную стоимость (МВ), которая также должна быть объединена в иерархию различными способами.
На начальной нагрузки мы получаем набор объектов, которые выглядят как:
Позиция [Кол-во: двойной, Безопасность: Охрана, счета: Счет, Стратегия: Стратегия]
безопасности [ Цена: деньги, Страна: Страна Валюта: CCY]
счета [Имя: строка, фонд: фонд, менеджер: менеджер Валюта: CCY]
Стратегия [Имя: строка]
Фонд [Имя: строка]
Менеджер [Имя: строка]
Кратность выглядит следующим образом:
- Менеджер (1) -manages-> (1 .. *) Учетная запись
- Фонд (1) -изобрался из-> (1 .. *) Счет
- Учет (1) -содержания-> (1 .. *) Должность
- Безопасность (1) (1 .. *) Положение
- стратегии (1) -contains-> (1 .. *) Положение
- стратегии (1) -может существуют не-> (1 .. *) Счет
Есть также ряд вещей, которые могут произойти в течение дня:
- Изменение цен безопасности - цена изменения безопасности от а -> б
- Новых позиций - Там была в торговле
- Удалить позицию - Торговый было отменено
От переднего конца - мы должны иметь возможность просматривать данные на уровне Менеджера/Фонда, т.е.
- менеджер 1
- Итого MV = $ 4800
- Самая большая экспозиция страна = 43% Великобритания
- Всего% MV = 100%
- Компоненты: Список>
- Страны: Список>
- Руководитель 2
- Total MV = $ 1200
- Самая большая экспозиция страна = 90% США
- Всего% MV = 100%
- Компоненты: Список>
- Страны: Список>
- Фонд2
- Общая сумма МВ = $ 1200
- Крупнейшая страновая экспозиция = 90% США
- Итого% MV = 100%
- Компоненты: Список>
- Страны: Список>
Или на уровне безопасности
- Sec 1
- MV = $ 1000
- % от Менеджера 1 = 67%
- % от фонда 1 = 48%
- Sec 2
- MV = $ 2000
- % Менеджера 3 = 12%
- % от фонда 2 = 4% ...
Объекты будут загружаться на личном карте, чтобы гарантировать, что они существуют только один раз в системе, и поэтому изменение цены безопасности будет отражаются в соответствующих позициях.
Я смотрю на различные способы представления этого, концептуальный поиск источников (http://martinfowler.com/eaaDev/EventSourcing.html) выглядел многообещающим, хотя нам нужно только посмотреть на текущее состояние, так что, вероятно, это будет излишним.
Моя текущая линия мышления представлять менеджер, фонд и счет в Портфолио объект:
И использовать композитный шаблон (Portfolio: Компонент, Position: Компонент) + посетителя шаблонов для инкапсуляции иерархии + логики расчета соответственно.
Портфель [объект: Представляет, компоненты: ListOfComponents, Accept (Посетитель V): государства]
компонент также имеет MV (в $) (они могут быть вычислены с использованием посетителя)
Пусть MV [position] = * Qty * Security.Price *
Позвольте MV [портфолио] = сумма всех MV позиций ниже.
Таким образом, мы имеем следующую композиционную структуру:
- Портфель (Представляет: Фонд A, MV:)
- Портфолио (Представляет: Счет A, MV:)
- Позиция1 (MV: 300)
- Должность2 (MV: 200)
- Портфолио (Представляет: Счет A, MV:)
- Портфель (Представляет: фонд B, MV)
- Портфель (Представляет: Счет Б, М. В.:)
- Position3 (МВ: 800)
- Position4 (MV: 200)
- Портфолио (Представляет собой: Счет C, MV:)
- Position5 (MV: 200)
- Position6 (MV: 400)
- Портфель (Представляет: Счет Б, М. В.:)
Моя первая проблема с представлением различных уровней в процентах - система должна быть в состоянии представить, какой процент от фонда B и счета C составляет 5 баллов?
Позиция 5 МВ/счета С MV = 200/600 = 33%
Позиция 5 МВ/Фонд Б М.В. = 200/1600 = 12,5%
Значения могут быть рассчитаны с использованием посетителя, но где сохраняем ли мы результаты расчета?
В словаре в Позиция 5 так: словарь percentMV = {[Фонд B, 12,5%], [Счет C, 33%]}
Или в соответствующих портфелях и в этом случае, на все отдельные позиции необходимо будет ссылаться на Фонд B? Нам также потребуется Должность 5 с точки зрения Менеджера, который управляет им.
Другая концепция, с которой я столкнулся, связана с показателем воздействия на страну - каждая безопасность представляет собой определенный риск, связанный с страной. Так с портфелем из двух позиций: - МЗ $ 100, Безопасность Страна = Великобритания - М.В. $ 300, Страна = США
Портфель имеет подвергание страна_рождения - 100/400 = 25% Великобритании и 300/400 = 75% США.
Каков наилучший способ обобщить эту концепцию в дизайне, то есть где лучше всего хранить данные?
+1 Очень хороший, подробный вопрос. Просто, пожалуйста, не храните свои цены как парные; используйте десятичные знаки. –