using YLErp.Abstract.DataProviders; namespace YLErp.Modules.UnderlyingModule { /// /// 篮子标的帮助类 /// public static class BasketUnderlyingHelper { /// /// 获取篮子标的价格 /// public static BasketPriceResult GetBasketPrice(underlying_manager basketUnderlying, IBasketPriceProvider priceProvider, bool ignoreError) { if (basketUnderlying is null) { throw new ArgumentNullException(nameof(basketUnderlying)); } if (!basketUnderlying.IsBasket()) { return new BasketPriceResult(); } return GetBasketPrice(basketUnderlying.SubData, priceProvider, ignoreError); } /// /// 获取篮子标的价格 /// public static BasketPriceResult GetBasketPrice(string subData, IBasketPriceProvider priceProvider, bool ignoreError) { var result = new BasketPriceResult(); var list = JsonHelper.Deserialize>(subData); if (list == null || !list.Any()) { return result; } double weight = 0; foreach (var item in list) { weight += item.weight; if (priceProvider.TryGetSubPrice(item.code, out var price, out var settlePrice)) { result.Price += item.weight * price; result.SettlePrice += item.weight * settlePrice; } else if (!ignoreError) { if (result.ErrorCodeList == null) { result.ErrorCodeList = new List(); } result.ErrorCodeList.Add(item.code); } } if (weight > 0) { result.Price /= weight; result.SettlePrice /= weight; } else { result.Price = result.SettlePrice = 0; } return result; } } /// /// 获取篮子标的价格结果 /// public struct BasketPriceResult { /// /// 行情价或收盘价 /// public double Price; /// /// 结算价 /// public double SettlePrice; /// /// 未找到价格的标的代码集合 /// public List ErrorCodeList; /// /// 是否存在未找到价格的标的代码集合 /// public bool HasError => ErrorCodeList != null && ErrorCodeList.Any(); } }