/// <summary> /// 处理费交割月份的合约 /// </summary> /// <param name="code">合约代码</param> /// <param name="year">合约年</param> /// <param name="month">合约月</param> /// <param name="compareDate">要比较的日期</param> /// <param name="breedClassID">合约代码所属品种类型</param> /// <returns>保证金比例</returns> private static decimal ProcessNonDeliveryMonth(string code, int year, int month, DateTime compareDate, int breedClassID) { string errCode = "GT-8482"; string errMsg = "无法根据期货商品代码获取其对应的保证金比例。"; IList <QH_CFBailScaleValue> values = GetBailScaleValues(code, breedClassID); if (values == null || values.Count <= 0) { throw new VTException(errCode, errMsg); } IRealtimeMarketService service = RealTimeMarketUtil.GetRealMarketService(); //RealtimeMarketServiceFactory.GetService(); //FutData futData = service.GetFutData(code); MerFutData merFutData = service.GetMercantileFutData(code); if (merFutData == null) { errMsg = "处理交割月合约保证金时无法获取行情。"; throw new VTException(errCode, errMsg); } //持仓量 decimal openInterest = (decimal)merFutData.OpenInterest; //判断当前月份是那种交割月份类型 Types.QHCFPositionMonthType monthType = FutureService.CheckMonthType(year, month, compareDate); IList <QH_CFBailScaleValue> scaleValues; #region 前三个月交割月份 //如果是前三 if (monthType == Types.QHCFPositionMonthType.OnDeliAgoThreeMonth) { scaleValues = FindScaleValuesByMonthType(values, monthType); //是前三 if (scaleValues.Count > 0) { return(GetScaleByBailType(scaleValues, openInterest, compareDate, breedClassID)); } //否则就是一般月份 scaleValues = FindScaleValuesByMonthType(values, Types.QHCFPositionMonthType.GeneralMonth); if (scaleValues.Count > 0) { return(GetScaleByBailType(scaleValues, openInterest, compareDate, breedClassID)); } } #endregion #region 前二 //如果是前二 if (monthType == Types.QHCFPositionMonthType.OnDeliAgoTwoMonth) { scaleValues = FindScaleValuesByMonthType(values, monthType); //是前二 if (scaleValues.Count > 0) { return(GetScaleByBailType(scaleValues, openInterest, compareDate, breedClassID)); } //否则就是一般月份 scaleValues = FindScaleValuesByMonthType(values, Types.QHCFPositionMonthType.GeneralMonth); if (scaleValues.Count > 0) { return(GetScaleByBailType(scaleValues, openInterest, compareDate, breedClassID)); } } #endregion #region 前一 //如果是前一 if (monthType == Types.QHCFPositionMonthType.OnDeliAgoMonth) { scaleValues = FindScaleValuesByMonthType(values, monthType); //是前一 if (scaleValues.Count > 0) { return(GetScaleByBailType(scaleValues, openInterest, compareDate, breedClassID)); } //否则就是一般月份 scaleValues = FindScaleValuesByMonthType(values, Types.QHCFPositionMonthType.GeneralMonth); if (scaleValues.Count > 0) { return(GetScaleByBailType(scaleValues, openInterest, compareDate, breedClassID)); } } #endregion #region 一般月份 //如果是一般月份 if (monthType == Types.QHCFPositionMonthType.GeneralMonth) { scaleValues = FindScaleValuesByMonthType(values, monthType); //是一般月份 if (scaleValues.Count > 0) { return(GetScaleByBailType(scaleValues, openInterest, compareDate, breedClassID)); } } #endregion #region 最低保证金 QH_SIFBail sifBail = MCService.FuturesTradeRules.GetSIFBailByBreedClassID(breedClassID); if (sifBail == null) { LogHelper.WriteError("Debug_Test_Bail_ProcessNonDeliveryMonth_01:无法获取最低交易保证金比例", new Exception("")); return(-1); } else { LogHelper.WriteDebug("Debug_Test_Bail_ProcessNonDeliveryMonth_02:无对应的保证金比例区间范围值获取最低交易保证金比例" + sifBail.BailScale); return(sifBail.BailScale); } #endregion //return -1; }
/// <summary> /// 处理非交割月份的合约 /// </summary> /// <param name="code">合约代码</param> /// <param name="year">合约年</param> /// <param name="month">合约月</param> /// <param name="positionValueType">持仓限制类型</param> /// <returns>保证金比例</returns> private static PositionLimitValueInfo ProcessNonDeliveryMonth(string code, int year, int month, out Types.QHPositionValueType positionValueType) { string errCode = "GT-8492"; string errMsg = "无法根据期货商品代码获取其对应的持仓限制。"; IList <QH_PositionLimitValue> values = GetPositionLimitValues(code); if (values == null) { throw new VTException(errCode, errMsg); } IRealtimeMarketService service = RealTimeMarketUtil.GetRealMarketService(); //RealtimeMarketServiceFactory.GetService(); //FutData futData = service.GetFutData(code); MerFutData merFutData = service.GetMercantileFutData(code); if (merFutData == null) { errMsg = "处理交割月合约保证金时无法获取行情-持仓限制。"; throw new VTException(errCode, errMsg); } //持仓量 decimal openInterest = (decimal)merFutData.OpenInterest; LogHelper.WriteDebug("非交割月份的合约当前获取到" + code + "行情持仓量:" + openInterest); //判断当前月份是那种交割月份类型 Types.QHCFPositionMonthType monthType = FutureService.CheckMonthType(year, month, DateTime.Now); IList <QH_PositionLimitValue> limitValues; positionValueType = Types.QHPositionValueType.Scales; #region 交割月份前三个月 //如果是前三 if (monthType == Types.QHCFPositionMonthType.OnDeliAgoThreeMonth) { limitValues = FindLimitValuesByMonthType(values, monthType); //是前三 if (limitValues.Count > 0) { return(GetLimitByBailType(limitValues, openInterest, out positionValueType)); } errMsg = "代码" + code + " 无法获取交割前三个月的对应的持仓限制列表参数正在以一般月份查询。"; LogHelper.WriteDebug(errCode + errMsg); //否则就是一般月份 limitValues = FindLimitValuesByMonthType(values, Types.QHCFPositionMonthType.GeneralMonth); if (limitValues.Count > 0) { PositionLimitValueInfo generOnThree = GetLimitByBailType(limitValues, openInterest, out positionValueType); if (generOnThree.PositionValue == -1) { generOnThree.IsNoComputer = true; } return(generOnThree); } errMsg = "代码" + code + " 无法获取交割月份前三个月的一般月份的对应的持仓限制列表参数。"; LogHelper.WriteDebug(errCode + errMsg); } #endregion #region 交割月份前二个月 //如果是前二 if (monthType == Types.QHCFPositionMonthType.OnDeliAgoTwoMonth) { limitValues = FindLimitValuesByMonthType(values, monthType); //是前二 if (limitValues.Count > 0) { return(GetLimitByBailType(limitValues, openInterest, out positionValueType)); } errMsg = "代码" + code + " 无法获取交割前两个月的对应的持仓限制列表参数。"; LogHelper.WriteDebug(errCode + errMsg); //否则就是一般月份 limitValues = FindLimitValuesByMonthType(values, Types.QHCFPositionMonthType.GeneralMonth); if (limitValues.Count > 0) { PositionLimitValueInfo generOnDeliAgo = GetLimitByBailType(limitValues, openInterest, out positionValueType); if (generOnDeliAgo.PositionValue == -1) { generOnDeliAgo.IsNoComputer = true; } return(generOnDeliAgo); } errMsg = "代码" + code + " 无法获取交割月份前两个月的一般月份的对应的持仓限制列表参数。"; LogHelper.WriteDebug(errCode + errMsg); } #endregion #region 交割月份前一个月 //如果是前一 if (monthType == Types.QHCFPositionMonthType.OnDeliAgoMonth) { limitValues = FindLimitValuesByMonthType(values, monthType); //是前一 if (limitValues.Count > 0) { return(GetLimitByBailType(limitValues, openInterest, out positionValueType)); } errMsg = "代码" + code + " 无法获取交割前一个月的对应的持仓限制列表参数正在以一般月份查询。"; LogHelper.WriteDebug(errCode + errMsg); //否则就是一般月份 limitValues = FindLimitValuesByMonthType(values, Types.QHCFPositionMonthType.GeneralMonth); if (limitValues.Count > 0) { PositionLimitValueInfo generOnDeli = GetLimitByBailType(limitValues, openInterest, out positionValueType); if (generOnDeli.PositionValue == -1) { generOnDeli.IsNoComputer = true; } return(generOnDeli); } errMsg = "代码" + code + " 无法获取交割月份前一个月的一般月份的对应的持仓限制列表参数。"; LogHelper.WriteDebug(errCode + errMsg); } #endregion #region 交割月份一般月份 //如果是一般月份 if (monthType == Types.QHCFPositionMonthType.GeneralMonth) { limitValues = FindLimitValuesByMonthType(values, monthType); //是一般月份 if (limitValues.Count > 0) { PositionLimitValueInfo gener = GetLimitByBailType(limitValues, openInterest, out positionValueType); if (gener.PositionValue == -1) { gener.IsNoComputer = true; } return(gener); } errMsg = "代码" + code + " 无法获取一般月份的对应的持仓限制列表参数。"; LogHelper.WriteDebug(errCode + errMsg); } #endregion PositionLimitValueInfo info = new PositionLimitValueInfo(); info.PositionValue = -1; info.IsMinMultiple = false; info.MinMultipleValue = 0; //return -1; return(info); }