从山证v2.3.0拷贝
This commit is contained in:
@@ -0,0 +1,167 @@
|
||||
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<trade_span>().Where(n => n.ValueDate.Day == 10).ToList();
|
||||
var clientSpanNews = new List<ClientSpan>();
|
||||
|
||||
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<trade_span>();
|
||||
var tradeSpansReq = new List<trade_span>();
|
||||
|
||||
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<trade_span>();
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user