using YLErp.DBModels.Helpers; namespace YLErp.Modules.CalculationModule { /// /// 交易手数计算 /// public static class TradeLotsCalc { /// /// 根据标的计算手数,返回null表示未获取到合约乘数 /// public static double GetLots(string underlyingCode, double notional) { var underlying = DataCacheProvider.GetUnderlyingDataSource().GetData(underlyingCode); if (underlying == null) { return notional; } double contractSize; if (underlying.ContractSize > 0) { contractSize = underlying.ContractSize; } else if (underlying.IsStock()) { contractSize = 100; } else { var variety = DataCacheProvider.GetVarietyDataSource().GetData(underlying?.UnderlyingTypeId ?? 0); if (variety == null) { return notional; } contractSize = variety.TradeUnitValue ?? 0; } if (contractSize < 1) { return notional; } return notional / contractSize; } public static double CalcDeltaInLots(double Delta, Variety variety, underlying_manager udm) { return Delta / GetTradeUnitValue(variety, udm); } public static double CalcGammaInLots(double gamma, Variety variety, underlying_manager udm) { return gamma / GetTradeUnitValue(variety, udm); } /// /// 获取标的的交易手数单位,一手多少 /// public static double GetTradeUnitValue(Variety variety, underlying_manager udm) { if (udm is null) { if (variety != null) { var TradeUnit = VarietyHelper.GetTradeUnitValue(variety.VarietyCode, variety.TradeUnit); return TradeUnit > 0 ? TradeUnit.Value : 1; } return 1; } if (udm.ContractSize > 1) { return udm.ContractSize; } if (udm.IsStock()) { return 100; } if (udm.IsSynthetic()) { return udm.ContractSize < 1 ? 1 : udm.ContractSize; } if (udm.ContractSize > 0) { return udm.ContractSize; } if (variety == null) { variety = DataCacheProvider.GetVarietyDataSource().GetData(udm.UnderlyingTypeId); if (variety == null) { return 1; } } var TradeUnit2 = VarietyHelper.GetTradeUnitValue(variety.VarietyCode, variety.TradeUnit); return TradeUnit2 > 0 ? TradeUnit2.Value : 1; } } }