![](/img/trans.png)
[英]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.