using YLErp.Configuration; using YLErp.Modules.EodModule.SettlementModule; using YLErp.Modules.TradeDalModule; namespace YLErp.Modules.EodModule { [TestClass] public class ExDividendTest { [TestMethod("测试除权除息基础循环处理是否符合预期")] public void Test1() { var startIndex = 0; var priceDic = new Dictionary { {new DateTime(2021,1,1),1d }, {new DateTime(2021,1,2),1d }, {new DateTime(2021,1,3),1d }, {new DateTime(2021,1,4),1d }, {new DateTime(2021,1,5),1d }, {new DateTime(2021,1,6),1d }, {new DateTime(2021,1,7),1d }, {new DateTime(2021,1,8),1d }, {new DateTime(2021,1,9),1d }, {new DateTime(2021,1,10),1d }, }; var exDividendInfos = new List { new ex_dividend_info{ ExDividendDate = new DateTime(2021,1,2)}, new ex_dividend_info{ ExDividendDate = new DateTime(2021,1,6)}, new ex_dividend_info{ ExDividendDate = new DateTime(2021,1,8)}, }; //日终价格和除权除息信息都按照正序排列 //获取除权价格则使用大于日终价格日期的除权信息除权 //循环日终价格,如果一个除权日期小于价格日期则被排除掉 foreach (var kv in priceDic) { (var date, var price) = (kv.Key, kv.Value); Console.WriteLine("===========" + date.ToString("yyyy-MM-dd") + "==========="); for (var i = startIndex; i < exDividendInfos.Count; i++) { var dividenInfo = exDividendInfos[i]; //除权日当天的收盘价也需要处理 if (date <= dividenInfo.ExDividendDate) { Console.WriteLine(dividenInfo.ExDividendDate.Value.ToString("yyyy-MM-dd")); } else { startIndex = i; } } } } [TestMethod] public void TestEodDividend() { var userInfo = OptUserInfo.UnitTestUser; using var db = DbContextFactory.GetYLDbContext(); var eodDate = new DateTime(2021, 06, 04); var trades = db.eod_trade.Where(et => et.ValueDate == eodDate && !ConsTrade.TradeCompleteStatus.Contains(et.TradeStatus)) .ToArray().Select(O => O.trade).ToList(); var tradeIds = trades.Select(O => O.id); var parentTradeIds = trades.Where(O => O.ParentTradeId > 0 && !tradeIds.Contains(O.ParentTradeId)).Select(O => O.ParentTradeId).ToHashSet(); if (parentTradeIds.Any()) { var parentTrades = new TradeDalService(userInfo).GetTradeOrEodTrade(parentTradeIds, eodDate); trades.AddRange(parentTrades); } var request = new EodSettlementRequest(userInfo) { SettleDate = eodDate }; var context = new EodSettlementContextV2(request, new SettlementConfig { }, CancellationToken.None); new EodDividenService(context).Execute(trades); } } }