2012-05-07 4 views
2

Я разрабатываю систему, предназначенную для расчета различных показателей в наборе холдингов на основе начального дневного холдинга и подачи новых сделок и ценовых тиков. Исходная информация поступает из службы 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)
  • Портфель (Представляет: фонд 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% США.

Каков наилучший способ обобщить эту концепцию в дизайне, то есть где лучше всего хранить данные?

+0

+1 Очень хороший, подробный вопрос. Просто, пожалуйста, не храните свои цены как парные; используйте десятичные знаки. –

ответ

1

Портфолио - хорошая идея представить произвольные сегментации населения позиций; не забудьте также взглянуть на Specification pattern (pdf) для общего способа указать критерии включения для портфелей. На самом деле, портфель модель описана в анализа паттернов (Martin Фаулера) сравнивается с Спецификация шаблона, описанного в Domain Driven Design (Eric Evans).

Портфолио просто представляет критерии включения позиций. Чтобы фактически агрегировать позиции по-разному, взгляните на шаблон Enterprise Segment (описанный в Анализ шаблонов). A Enterprise Segment - это фрагмент различных элементов , которые включают в себя ваш домен (в вашем случае: безопасность, менеджер и фонд), на котором могут быть собраны, рассчитаны и сохранены интересные измерения (например, рыночная стоимость и страновая экспозиция).

Кроме того, убедитесь, чтобы посмотреть на более фундаментальных моделей, как деньги, Количество и Range; и всегда используйте десятичные знаки или integers для хранения денежных значений или курсов для денежных расчетов.

+0

Я заказал копию анализа шаблонов - я дам вам знать, как я нахожусь. – James

+0

Кстати - если деньги нужны до ближайшего целого - не будет ли быстрее использовать двойной вместо десятичного? – James

+0

@James: Нет, двойная неточна для финансовых расчетов .... –

Смежные вопросы