//using System; //using System.Collections.Generic; //using System.Linq; //using YLErp.DBModels; //using YLErp.DBModels.Consts; //using YLErp.Model; //using YLErp.Modules.MarginModule; //namespace YLErp.BLL.MarginCalculationBak //{ // public class UniversalMarginCalculation : MarginCalculationBase // { // // 定义一个静态变量来保存类的实例 // public static readonly UniversalMarginCalculation Instance; // static UniversalMarginCalculation() // { // Instance = new UniversalMarginCalculation(); // } // // 定义私有构造函数,使外界不能创建该类实例 // private UniversalMarginCalculation() // { // } // public override List RunMarginCalculation(int userId, string userName, List tradeList, DateTime settleDate, Dictionary priceDict, bool hasOptionInfo = false, bool isEodSettle = false, bool forSingleTrade = true, string volType = "交易", bool forOtherSide = false) // { // List tradeSpans = new List(); // if (!(priceDict?.Count > 0)) // { // var codes = tradeList.Select(O => O.UnderlyingCode).ToArray(); // priceDict = base.GetSettlePrice(codes, settleDate); // } // if (priceDict.Count == 0) // { // //如果价格没有传入也没从数据库获取到,就直接返回,没必要往下运行了。但不应该报错; // return tradeSpans; // } // if (tradeList != null && tradeList.Count > 0) // { // var tempStockTradeList = tradeList.Where(t => t.UnderlyingInstrumentType == ConsGlobal.InstrumentType.Stock).ToList(); // if (tempStockTradeList.Any()) // { // var stockTradeSpanlist = StockMarginCalculation(userId, userName, tempStockTradeList, settleDate, priceDict, hasOptionInfo, isEodSettle); // if (stockTradeSpanlist.Count > 0) // { // tradeSpans.AddRange(stockTradeSpanlist); // } // } // var tempFutureTradeList = tradeList.Where(t => t.UnderlyingInstrumentType == ConsGlobal.InstrumentType.CommodityFutures).ToList(); // if (tempFutureTradeList.Any()) // { // var futureTradeSpanlist = FutureMarginCalculation(userId, userName, tempFutureTradeList, settleDate, priceDict, hasOptionInfo, isEodSettle); // if (futureTradeSpanlist.Count > 0) // { // tradeSpans.AddRange(futureTradeSpanlist); // } // } // } // return tradeSpans; // } // /// // /// 股票类期权计算保证金 // /// // public List StockMarginCalculation(int userId, string userName, List tradeList, DateTime settleDate, Dictionary priceDict, bool hasOptionInfo = false, bool isEodSettle = false) // { // throw new Exception("未实现"); // } // /// // /// 商品期权计算保证金 // /// // public List FutureMarginCalculation(int userId, string userName, List futureTradeList, DateTime settleDate, Dictionary priceDict, bool hasOptionInfo = false, bool isEodSettle = false) // { // List tradeSpans = new List(); // if (futureTradeList != null && futureTradeList.Count > 0) // { // using (YLContext db = new YLContext()) // { // var clientIds = futureTradeList.Select(t => t.ClientId).ToList(); // var clientList = (from client in db.client // join clientlevel in db.clientlevel // on client.LevelId equals clientlevel.id into tempClientlevel // from clientlevelTT in tempClientlevel.DefaultIfEmpty() // where clientIds.Contains(client.id) // select new // { // client, // clientlevel = clientlevelTT // }).ToList(); // var underlyingCodes = futureTradeList.Select(O => O.UnderlyingCode).ToHashSet(); // var mpProvider = new MarginParamProvider(new OptUserInfo(0, "系统"), settleDate) // .Initialize(underlyingCodes, MarginParamTypeEnum.MarginRate); // if (clientList != null) // { // foreach (var t in futureTradeList) // { // priceDict.TryGetValue(t.UnderlyingId, out double price); // mpProvider.TryGetMarginRate(t.UnderlyingCode, out double marginRate); // var contractSize = (_underlyingDataProvider.GetUnderlying(t.UnderlyingCode)?.ContractSize) ?? 0; // double diffPrice = 0; // switch (t.OptionType) // { // case "看涨": // diffPrice = (t.Strike ?? 0) - price; // break; // case "看跌": // diffPrice = price - (t.Strike ?? 0); // break; // } // double visualValue = Math.Max(diffPrice, 0) * contractSize; // double futureMargin = price * marginRate * contractSize; // double optionMargin1 = (t.StockEqvNotional ?? 0) + futureMargin - 0.5 * visualValue; // double optionMargin2 = (t.StockEqvNotional ?? 0) + futureMargin * 0.5; // var client = clientList.FirstOrDefault(c => c.client.id == t.ClientId); // if (client != null) // { // var value = Math.Max(optionMargin1, optionMargin2); // if (t.TradeType == "自定义交易") // { // var eodTradeRiskManual = db.eod_trade_risk_manual.Where(x => x.ValueDate <= settleDate && x.TradeId == t.id).OrderByDescending(x => x.ValueDate).FirstOrDefault(); // //收盘时如果自定义交易还活着且没有维护当日风险,并且收的时系统日期当日的盘,抛出exception // if (isEodSettle && !ConsTrade.TradeCompleteStatus.Contains(t.TradeStatus) && settleDate == valuedateBLL.SystemDate.ValueDate) // { // if (eodTradeRiskManual == null || eodTradeRiskManual.ValueDate != settleDate) // { // var error = $"TradeNumber:{t.TradeNumber}在{settleDate:yyyy-MM-dd}需先进行交易风险维护"; // throw new Exception(error); // } // } // value = eodTradeRiskManual?.Margin ?? 0; // } // tradeSpans.Add(new trade_span // { // TradeId = t.id, // OptDate = DateTime.Now, // OptId = userId, // OptName = userName, // ClientId = client.client.id, // UnderlyingId = t.UnderlyingId, // UnderlyingCode = t.UnderlyingCode, // ValueDate = settleDate, // Spv1 = value, // Spv2 = value, // Spv3 = value, // Spv4 = value, // WorstCastClientPayable = value // }); // } // } // } // } // } // return tradeSpans; // } // public override double GetTradeMargin(trade trade, double price, bool isInitialMargin = false, bool hasOptionInfo = false) // { // using (YLContext db = new YLContext()) // { // if (trade.TradeType == "结构化交易") // { // trade.SubTrades = db.trade.Where(x => x.ParentTradeId == trade.id).ToList(); // } // } // var tradeMargin = RunMarginCalculation(0, "系统", new List { trade }, isInitialMargin ? (trade.TradeDate ?? valuedateBLL.ValueDate) : valuedateBLL.ValueDate, new Dictionary { { trade.UnderlyingId, price } }, hasOptionInfo: hasOptionInfo); // if (null != tradeMargin) // { // return tradeMargin.FirstOrDefault()?.WorstCastClientPayable ?? 0.0; // } // return 0.0; // } // } //}