【问题标题】:DataTables, DataSets, Entity Framework, LINQ & Lambda Expression for Financial Technical Analysis C#用于金融技术分析 C# 的数据表、数据集、实体框架、LINQ 和 Lambda 表达式
【发布时间】:2011-06-01 17:28:09
【问题描述】:

这更像是一个架构问题,而不是一个特定的代码问题,因为我在如何继续这个项目时遇到了一个主要障碍。

例如,我正在构建一个财务扫描软件,用于根据特定标准筛选选股。例如,如果在 8000 只股票中,其今天的收盘价高于 SMA 100,而 10 天前的收盘价低于 SMA 100,则将此股票代码返回给我。

但是,请注意,在上述示例中,SMA(简单移动平均线)是使用最近 100 天的数据计算得出的,但我们可以将 100 天更改为另一个值,例如 105 或 56 - 可以做任何事。

在我的数据库中,我有一个名为 EODData 的表定义,其中包含几列,下面是定义;

EODData
sSymbol nvarchar(6)
mOpen money
mClose money
mHigh money
mLow money
Date datetime

该表将保存美国证券交易所 3 年的日终数据,因此大约有 6,264,000 行,对于 MS SQL 2008 R2 没有问题。

现在,我目前正在使用实体框架从我的数据库中检索数据,但是运行或创建我的过滤器的最佳方法是什么,因为每次扫描时必须为每个符号或基础股票代码计算 SMA执行,因为 100 天变量可以更改。

我应该将实体对象转换为数据集以进行内存过滤等吗???

我没有经常使用 DataSets 或 DataTables,所以我正在寻找指针。

请注意,SMA 只是过滤器之一,我还有另一种算法可以计算 EMA(指数移动平均线,这是一个更复杂的公式)和 MACD(移动平均线收敛散度)。

有什么意见吗?

【问题讨论】:

  • “内存过滤等”是什么意思,为什么需要数据集?除非必要,否则我不建议转换它们。 EF 确实支持许多过滤和聚合功能。
  • 嗨,从我读过的关于 Dataset 的内容来看,它允许在执行例如 DataBind 之前进行内存排序。当然,我想只使用实体对象,但我无法找到一种方法来使用 SMA 和其他必须由我的算法即时计算的值,我使用 TA-Lib 作为我的算法顺便说一句。跨度>
  • 那么,您的意思是基于 UI 交互在 UI/绑定级别上进行过滤/排序?在这种情况下,每个 UI 平台都提供了绑定源组件来帮助解决此问题。例如,WinForms 中的 BindingSource 和 ASP.NET 中的 ObjectDataSource(和其他)。通常,您会发现控件甚至会为您执行此操作 - 例如,大多数数据网格都支持排序。

标签: c# entity-framework-4 datatable strongly-typed-dataset


【解决方案1】:

将计算放入数据库怎么样?你有你的 EODData 表,这很棒。创建另一个作为您的 SummaryData 的表,例如:

SummaryData
stockSymbol varchar(6) -- don't need nvarchar, since AMSE doesn't have characters outside of normal English alphabet.
SMA decimal
MCDA decimal
EMA decimal

然后您可以编写一些在收盘时运行的存储过程,并根据您的 EODData 表中的数据更新这个表。或者您可以编写一个触发器,以便 EODData 表的每次插入都会更新数据库中的摘要数据。

这样做的一个缺点是您将一些业务逻辑放入数据库中。另一个缺点是您将更新您可能不需要做的股票代码的统计数据。例如,如果没有人想看看 XYZZ 做了什么,那么对其进行计算就毫无意义。

但是,第二个问题通过以下事实得到缓解:1.您在 MSSQL 可以优化的服务器上运行 SP;2.您可以在每个人都在家的下班后运行这些 SP,所以如果需要一点时间你不受影响的时间。 (老实说,我认为如果它们是滚动平均值、最小值/最大值等计算,SQL 不会那么慢。)

一个好处是你的查询应该很快,因为你可以写

select stockSymbol from SummaryData where SMA > 10你已经完成了计算。

另一个好处是数据每天只会更改一次(在工作日结束时),但您可能会在一天中查询多次。例如,您希望今天对直到昨天(包括昨天)的所有数据运行几个不同的查询。如果您运行 10 个查询,而您的伙伴运行相同的 10 个查询,那么您刚刚完成了相同的计算。 (本质上,一次写入,多次读取。)

【讨论】:

  • 谢谢 Taylonr,事实上我首先考虑的是建立一个汇总表等。但是上面示例中的 SMA 100(SMA 天)输出值对于 SMA 101 会有所不同输出值和 SMA 102。对于每次扫描(可能是每天 10 次不同的扫描),SMA 可以用不同的前几天使用来计算,这就是我不想使用摘要的原因数据库中的表。这就是为什么我在考虑使用 DataSet 在内存中进行数据操作或过滤的原因?或者以某种方式利用实体对象?
  • 老实说,我错过了你原来的帖子中谈到 SMA 的部分可能是不同的时间段......现在我明白你的问题了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-23
  • 1970-01-01
  • 1970-01-01
  • 2012-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多