using CsvHelper; using CsvHelper.Configuration; using Org.BouncyCastle.Ocsp; using System.Globalization; using YLErp.Model.Enum; using static NPOI.HSSF.Util.HSSFColor; namespace YLErp.Modules.MarginModule { [TestClass] public class HaiTongMarginTest { [TestMethod] public void TestMethod1() { var csvFile = Path.Combine(AppContext.BaseDirectory, "Resources\\MarginModule\\tradespans.csv"); var config = new CsvConfiguration(CultureInfo.InvariantCulture) { HeaderValidated = null, MissingFieldFound=null }; using var reader = new StreamReader(csvFile); using var csv = new CsvReader(reader, config); var tradeSpans = csv.GetRecords().Where(n => n.ValueDate.Day == 10).ToList(); var clientSpanNews = new List(); if (tradeSpans != null && tradeSpans.Count > 0) { var tradeIds = tradeSpans.Select(t => t.TradeId).ToList(); //海通预付金保底收益率-用来计算名义本金 double GuaranteedIncome = 0.01; var clientGroups = tradeSpans.GroupBy(t => t.ClientId); foreach (var clientGroup in clientGroups) { var clientRatio = 1.1; var underlyingGroup = clientGroup.Where(x => x.IsSingleMargin != true).GroupBy(t => t.UnderlyingId).Select(t => new ClientSpan { UnderlyingId = t.Key, ClientId = clientGroup.Key ?? 0, ValueDate = DateTime.Today, //负数代表客户应缴预付金,正数代表客户应收预付金 Spv1 = -t.Sum(g => g.Spv1), Spv2 = -t.Sum(g => g.Spv2), Spv3 = -t.Sum(g => g.Spv3), Spv4 = -t.Sum(g => g.Spv4), Spv5 = -t.Sum(g => g.Spv5), Spv6 = -t.Sum(g => g.Spv6), Spv7 = -t.Sum(g => g.Spv7), Spv8 = -t.Sum(g => g.Spv8), WorstCastClientPayable = -t.Sum(g => g.WorstCastClientPayable), OptId = 0, OptName = "ddd", OptDate = DateTime.Now, SpanType = 1 }).ToList(); foreach (var item in underlyingGroup) { if (clientGroup.Count(m => m.UnderlyingId == item.UnderlyingId && m.ClientId == item.ClientId) > 1) { item.SetWorstCastClientPayableMin(); #region 更新tradeSpan,使得每笔交易的持仓预付金和客户预付金计算用的Spv组保持一致 var tradeIdList = clientGroup.Select(x => x.TradeId); var tradeSpansUpdate = new List(); var tradeSpansReq = new List(); if (item.WorstCastClientPayable == item.Spv1) { tradeSpansUpdate.ForEach(x => x.WorstCastClientPayable = x.Spv1); tradeSpansReq.ForEach(x => x.WorstCastClientPayable = x.Spv1); } else if (item.WorstCastClientPayable == item.Spv2) { tradeSpansUpdate.ForEach(x => x.WorstCastClientPayable = x.Spv2); tradeSpansReq.ForEach(x => x.WorstCastClientPayable = x.Spv2); } else if (item.WorstCastClientPayable == item.Spv3) { tradeSpansUpdate.ForEach(x => x.WorstCastClientPayable = x.Spv3); tradeSpansReq.ForEach(x => x.WorstCastClientPayable = x.Spv3); } else if (item.WorstCastClientPayable == item.Spv4) { tradeSpansUpdate.ForEach(x => x.WorstCastClientPayable = x.Spv4); tradeSpansReq.ForEach(x => x.WorstCastClientPayable = x.Spv4); } else if (item.WorstCastClientPayable == item.Spv5) { tradeSpansUpdate.ForEach(x => x.WorstCastClientPayable = x.Spv5); tradeSpansReq.ForEach(x => x.WorstCastClientPayable = x.Spv5); } else if (item.WorstCastClientPayable == item.Spv6) { tradeSpansUpdate.ForEach(x => x.WorstCastClientPayable = x.Spv6); tradeSpansReq.ForEach(x => x.WorstCastClientPayable = x.Spv6); } else if (item.WorstCastClientPayable == item.Spv7) { tradeSpansUpdate.ForEach(x => x.WorstCastClientPayable = x.Spv7); tradeSpansReq.ForEach(x => x.WorstCastClientPayable = x.Spv7); } else if (item.WorstCastClientPayable == item.Spv8) { tradeSpansUpdate.ForEach(x => x.WorstCastClientPayable = x.Spv8); tradeSpansReq.ForEach(x => x.WorstCastClientPayable = x.Spv8); } #endregion } else { var tradeSpansUpdate = new List(); tradeSpansUpdate.ForEach(x => x.Comment = "单笔计算"); } //客户信息中追保方向为“单向追保”或“双向追保”的客户: call 看涨 //(1)Call净名义本金 = 客户Call卖方持仓名义本金 - 客户Call买方持仓名义本金; //(2)Put净名义本金 = 客户Put卖方持仓名义本金 - 客户Put买方持仓名义本金; //(3)单品种预付金占用 = max(0, max(∑逐笔交易持仓预付金,(Call净名义本金 + Put净名义本金)*1 % *1.1)); //(4)预付金占用 =∑单品种预付金占用。 //客户信息追保方向“对手方单向追保”或“其他”的客户:预付金占用 = 0。 //var callsale = clientGroup.Where(m => m.UnderlyingId == item.UnderlyingId && m.trade.BuySell == "买入" && m.trade.OptionType == "看涨").Select(m => m.trade.StockEqvNotional).Sum(); //var callbuy = clientGroup.Where(m => m.UnderlyingId == item.UnderlyingId && m.trade.BuySell == "卖出" && m.trade.OptionType == "看涨").Select(m => m.trade.StockEqvNotional).Sum(); //var putsale = clientGroup.Where(m => m.UnderlyingId == item.UnderlyingId && m.trade.BuySell == "买入" && m.trade.OptionType == "看跌").Select(m => m.trade.StockEqvNotional).Sum(); //var putbuy = clientGroup.Where(m => m.UnderlyingId == item.UnderlyingId && m.trade.BuySell == "卖出" && m.trade.OptionType == "看跌").Select(m => m.trade.StockEqvNotional).Sum(); //var StockEqvNotional = (double)((callsale - callbuy + putsale - putbuy) * GuaranteedIncome * clientRatio); //if (client.MarginOptionType != (int)MarginOptionEnum.双向追保) //{ // item.WorstCastClientPayable = -Math.Max(0, Math.Max(-(double)item.WorstCastClientPayable, StockEqvNotional)); //} } var clientSpan = new ClientSpan { ClientId = clientGroup.Key ?? 0, ValueDate = DateTime.Now, Spv1 = underlyingGroup.Sum(g => g.Spv1), Spv2 = underlyingGroup.Sum(g => g.Spv2), Spv3 = underlyingGroup.Sum(g => g.Spv3), Spv4 = underlyingGroup.Sum(g => g.Spv4), Spv5 = underlyingGroup.Sum(g => g.Spv5), Spv6 = underlyingGroup.Sum(g => g.Spv6), Spv7 = underlyingGroup.Sum(g => g.Spv7), Spv8 = underlyingGroup.Sum(g => g.Spv8), //负数代表客户应缴预付金,正数代表客户应收预付金 WorstCastClientPayable = underlyingGroup.Sum(g => g.WorstCastClientPayable), DeltaMargin = 0, TwoSideMargin = underlyingGroup.Sum(g => g.TwoSideMargin), OptId = 0, OptName = "ddd", OptDate = DateTime.Now, SpanType = 1, AdditionalWorstCastClientPayable = 0 }; clientSpanNews.Add(clientSpan); } } } } }