Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 混合工具组合的面向对象优化设计_Oop_Design Patterns_Finance - Fatal编程技术网

Oop 混合工具组合的面向对象优化设计

Oop 混合工具组合的面向对象优化设计,oop,design-patterns,finance,Oop,Design Patterns,Finance,我正在设计一个系统,根据最初一天的持有量以及新交易和价格波动的反馈,计算一组持有量的各种指标。 初始信息来自WCF服务,其中包含新交易和价格更新的事件 所需的指标包括市场价值(MV),市场价值也需要以各种方式聚合到层次结构中 在初始加载时,我们得到一组对象,它们看起来像: 位置[数量:双,安全:安全,账户:账户,策略:策略] 证券[价格:货币,国家:国家,货币:CCY] 账户[名称:字符串,基金:基金,经理:经理,货币:CCY] 策略[名称:字符串] 基金[名称:字符串] 管理器[名称:字符串]

我正在设计一个系统,根据最初一天的持有量以及新交易和价格波动的反馈,计算一组持有量的各种指标。 初始信息来自WCF服务,其中包含新交易和价格更新的事件

所需的指标包括市场价值(MV),市场价值也需要以各种方式聚合到层次结构中

在初始加载时,我们得到一组对象,它们看起来像:

位置[数量:双,安全:安全,账户:账户,策略:策略]

证券[价格:货币,国家:国家,货币:CCY]

账户[名称:字符串,基金:基金,经理:经理,货币:CCY]

策略[名称:字符串]

基金[名称:字符串]

管理器[名称:字符串]

多重性如下所示:

  • 经理(1)-管理->(1..*)帐户
  • 基金(1)-由->(1..*)账户组成
  • 帐户(1)-包含->(1..*)位置
  • 安全(1)-可以处于->(1..*)位置
  • 策略(1)-包含->(1..*)位置
  • 策略(1)-可以存在于->(1..*)帐户中
白天还会发生很多事情:

  • 证券价格变动-证券价格从a->b变动
  • 新职位-有一项交易
  • 删除头寸-交易已取消
从前端-我们需要能够查看经理/基金级别的数据,即

  • 经理1
    • 总MV=4800美元
    • 最大国家风险敞口=英国的43%
    • 总%MV=100%
    • 组件:列表>
    • 国家:名单>
  • 经理2
    • 总MV=1200美元
    • 最大国家风险敞口=90%美国
    • 总%MV=100%
    • 组件:列表>
    • 国家:名单>
  • 基金2
    • 总MV=1200美元
    • 最大国家风险敞口=90%美国
    • 总%MV=100%
    • 组件:列表>
    • 国家:名单>
或者在安全级别

  • 第1节
    • MV=1000美元
    • %管理者1的比例=67%
    • %基金1的总收益=48%
  • 第2节
    • MV=2000美元
    • %管理者3的比例=12%
    • %基金份额2=4%
实体将加载到身份图中,以确保它们在系统中只存在一次,因此证券价格的变化将反映在相关头寸中

我已经研究了各种方式来表示这一点,从概念上讲是事件来源(http://martinfowler.com/eaaDev/EventSourcing.html)看起来很有希望,虽然我们只需要看看目前的状态,所以可能是矫枉过正

我目前的思路是将经理、基金和账户表示为投资组合对象:

并使用组合模式(Portfolio:Component,Position:Component)+访问者模式分别封装层次结构+计算逻辑

公文包[对象:表示,组件:组件列表,接受(访问者v):状态]

组件也有MV(单位:美元)(可以使用访问者计算)

让MV[位置]=*数量*安全价格*

设MV[投资组合]=以下所有MV头寸之和

因此,我们有以下复合结构:

  • 投资组合(代表:基金A,MV:500
    • 投资组合(代表:账户A,MV:500
      • 位置1(MV:300)
      • 位置2(MV:200)
  • 投资组合(代表:基金B,MV1600
    • 投资组合(代表:账户B,MV:1000
      • 位置3(MV:800)
      • 位置4(MV:200)
    • 投资组合(代表:账户C,MV:600
      • 位置5(MV:200)
      • 位置6(MV:400)
我的第一个问题是代表不同级别的百分比-系统需要能够代表基金B和账户C中的第5位占多大百分比

位置5 MV/科目C MV=200/600=33%

头寸5 MV/基金B MV=200/1600=12.5%

可以使用visitor计算这些值,但计算结果存储在哪里

在位置5的字典中,如下所示: 字典百分比mv={[基金B,12.5%],[账户C,33%]}

或者在相关投资组合中,在这种情况下,基金B需要引用所有单个头寸我们还需要管理it的经理的职位5。

另一个我很难理解的概念是国家风险度量——每种证券都代表与一个国家相关的一定数量的风险。 因此,对于两个头寸的投资组合: -MV为100美元,安全国家=英国 -300美元的MV,国家=美国

该投资组合在英国的国家风险敞口为-100/400=25%,在美国的国家风险敞口为300/400=75%

将这一概念推广到设计中的最佳方法是什么,即数据存储的最佳位置在哪里?

组合是一个很好的主意,可以表示职位群体的任意细分;一定要看一看,寻找一种通用的方法来指定投资组合的包含标准。事实上,分析模式(Martin Fowler)中描述的投资组合模式与 领域驱动设计(Eric Evans)中描述的规范模式

现在,一个投资组合仅仅代表一个头寸的包含标准。要以不同的方式实际聚合职位,请查看企业细分模式(在分析模式中描述)。企业细分市场是组成您的领域(在您的案例中是:安全、经理和基金)的不同维度元素的一部分,在这些领域中,有趣的mea