80 lines
3.3 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|