DataTables,DataSet,Entity Framework,LINQ&用于财务技术分析的Lambda表达式C#

时间:2011-06-01 17:28:10

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

这更像是一个架构问题,而不是特定的代码问题,因为我在如何进行这个项目方面遇到了重大障碍。

我正在构建一个财务扫描软件,用于根据特定标准过滤选股。例如,如果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没有问题。

现在,我正在使用Entity Framework从我的数据库中检索数据,但是运行或创建我的过滤器的最佳方法是什么,因为每次扫描时必须为每个Symbol或底层Stock Ticker计算SMA。因为100天变量可以改变而执行。

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

我没有使用过DataSet和DataTables所以我正在寻找指针。

请注意,SMA只是其中一个过滤器,我有另一种计算EMA(指数移动平均线,这是一个更复杂的公式)和MACD(移动平均线会聚发散)的算法。

有什么意见吗?

1 个答案:

答案 0 :(得分:0)

如何将计算结果放入数据库?你有你的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个查询,那么您刚刚完成了相同的计算。 (基本上,写一次,读很多。)