[英]C# Linq Lambda Expression for Entity Framework Query Passing Custom Expression to Where Condition
[英]DataTables, DataSets, Entity Framework, LINQ & Lambda Expression for Financial Technical Analysis C#
这更像是一个架构问题,而不是一个特定的代码问题,因为我在如何继续这个项目时遇到了一个主要障碍。
例如,我正在构建一个财务扫描软件,它可以根据特定标准筛选股票。 例如,如果在 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 天变量可以更改。
我应该在 memory 过滤等中从实体对象转换为数据集吗???
我没有过多地使用 DataSets 或 DataTables,所以我正在寻找指针。
请注意,SMA 只是其中一个过滤器,我还有另一种算法可以计算 EMA(指数移动平均线,这是一个更复杂的公式)和 MACD(移动平均线收敛散度)。
有什么意见吗?
将计算结果放入数据库怎么样? 你有你的 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.您可以在每个人都在家时在几个小时后运行这些,所以如果需要一点时间,您'不受影响。 (老实说,我假设它们是滚动平均值、最小值/最大值等计算,SQL 不会那么慢。)
一个好处是你的查询应该很快,因为你可以写
select stockSymbol from SummaryData where SMA > 10
你已经完成了计算。
另一个好处是数据每天只会更改一次(在工作日结束时),但您可能会在一天中查询多次。 例如,您希望今天对直到昨天(包括昨天)的所有数据运行几个不同的查询。 如果您运行 10 个查询,而您的伙伴运行相同的 10 个查询,那么您刚刚完成了相同的计算。 (本质上,写一次,读多次。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.