Files
zszq-trs/UnitTestProject/Modules/EodModule/ExDividendTest.cs
T
2024-05-09 14:06:26 +08:00

80 lines
3.3 KiB
C#

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<DateTime, double> {
{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<ex_dividend_info> {
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);
}
}
}