Пример #1
0
        /// <summary>
        /// 处理交割月合约保证金
        /// </summary>
        /// <param name="code">合约代码</param>
        /// <param name="compareDate">要比较的日期</param>
        /// <param name="breedClassID">合约代码所属品种类型</param>
        /// <returns>保证金比例</returns>
        private static decimal ProcessDeliveryMonth(string code, DateTime compareDate, int breedClassID)
        {
            string errCode = "GT-8482";
            string errMsg  = "无法根据期货商品代码获取其对应的保证金比例。";


            IList <QH_CFBailScaleValue> values = GetBailScaleValues(code, breedClassID);

            if (values == null)
            {
                throw new VTException(errCode, errMsg);
            }



            //如果是过期合约不用获取行情的持仓量,这是为了盘前检查,因为交割月的比例计算没有用到行情持仓量
            //持仓量----这里为了不用修改后面的代码设置如果合约是过期时直接给予市场持仓量为最大值,这是为了盘前检查时要计算一些强制平仓过期合约而设置
            //因为过期后的合约直接取交割月的其中一个比例,而这里设置这个持仓量是为了不知道此代码所设置的保证金比例计算方式是以天计算还是双边、单边计算
            decimal openInterest = int.MaxValue;

            if (!FutureService.CheckQHContractIsExpired(code))
            {
                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);
                }
                //持仓量
                openInterest = (decimal)merFutData.OpenInterest;
            }


            Types.QHCFPositionMonthType monthType   = Types.QHCFPositionMonthType.OnDelivery;
            IList <QH_CFBailScaleValue> scaleValues = FindScaleValuesByMonthType(values, monthType);

            if (scaleValues.Count != 0)
            {
                return(GetScaleByBailType(scaleValues, openInterest, compareDate, breedClassID));
            }

            return(-1);
        }
        /// <summary>
        /// 处理交割月合约持仓限制
        /// </summary>
        /// <param name="code">合约代码</param>
        /// <param name="positionValueType">持仓限制类型</param>
        /// <returns>持仓限制</returns>
        private static PositionLimitValueInfo ProcessDeliveryMonth(string code, out Types.QHPositionValueType positionValueType)
        {
            string errCode = "GT-8492";
            string errMsg  = "无法根据商品期货商品代码获取其对应的持仓限制。";


            //根据合约代码获取其持仓限制列表
            IList <QH_PositionLimitValue> values = GetPositionLimitValues(code);

            if (values == null)
            {
                throw new VTException(errCode, errMsg);
            }

            #region 获取行情持仓量
            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);
            #endregion

            #region 过滤所属持仓限制类型记录
            Types.QHCFPositionMonthType   monthType   = Types.QHCFPositionMonthType.OnDelivery;
            IList <QH_PositionLimitValue> limitValues = FindLimitValuesByMonthType(values, monthType);
            #endregion

            positionValueType = Types.QHPositionValueType.Scales;
            if (limitValues.Count != 0)
            {
                return(GetLimitByBailType(limitValues, openInterest, out positionValueType));
            }

            throw new VTException(errCode, errMsg);
            // return -1;
        }
Пример #3
0
        /// <summary>
        /// 判断当前月是属于那种交割月份类型
        /// Update by:李健华
        /// Update date:2010-03-31
        /// desc.:增加比较的日期,不直接内部取当前日期,由外部传递,这为了清算时获取期货的保证金比例而用
        /// </summary>
        /// <param name="year">合约交割年</param>
        /// <param name="month">合约交割月</param>
        /// <param name="compareDate">要比较的日期</param>
        /// <returns>交割月份类型</returns>
        public static Types.QHCFPositionMonthType CheckMonthType(int year, int month, DateTime compareDate)
        {
            Types.QHCFPositionMonthType monthType = Types.QHCFPositionMonthType.GeneralMonth;

            //int nowYear = DateTime.Now.Year;
            //int nowMonth = DateTime.Now.Month;
            int nowYear  = compareDate.Year;
            int nowMonth = compareDate.Month;

            int val = 0;

            if (year == nowYear)
            {
                val = month - nowMonth;
            }
            else if (year > nowYear)
            {
                val = month + (12 - nowMonth);
            }

            switch (val)
            {
            case 1:
                monthType = Types.QHCFPositionMonthType.OnDeliAgoMonth;
                break;

            case 2:
                monthType = Types.QHCFPositionMonthType.OnDeliAgoTwoMonth;
                break;

            case 3:
                monthType = Types.QHCFPositionMonthType.OnDeliAgoThreeMonth;
                break;
            }

            return(monthType);
        }
Пример #4
0
        /// <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;
        }
Пример #5
0
        /// <summary>
        /// 根据交割月份类型来获取对应的保证金比例列表
        /// </summary>
        /// <param name="values">保证金比例列表</param>
        /// <param name="monthType">交割月份类型</param>
        /// <returns>对应交割月份类型的保证金比例列表</returns>
        private static IList <QH_CFBailScaleValue> FindScaleValuesByMonthType(IList <QH_CFBailScaleValue> values, Types.QHCFPositionMonthType monthType)
        {
            IList <QH_CFBailScaleValue> scaleValues = new List <QH_CFBailScaleValue>();

            foreach (QH_CFBailScaleValue value in values)
            {
                if (value.DeliveryMonthType.Value == (int)monthType)
                {
                    scaleValues.Add(value);
                }
            }
            LogHelper.WriteDebug("Debug_Test_Bail_03:根据交割月份类型来获取对应的保证金比例列表" + monthType.ToString() + "获取列表" + scaleValues.Count);
            return(scaleValues);
        }
        /// <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);
        }
        /// <summary>
        /// 根据交割月份类型来获取对应的持仓限制列表
        /// </summary>
        /// <param name="values">持仓限制列表</param>
        /// <param name="monthType">交割月份类型</param>
        /// <returns>对应交割月份类型的持仓限制列表</returns>
        private static IList <QH_PositionLimitValue> FindLimitValuesByMonthType(IList <QH_PositionLimitValue> values, Types.QHCFPositionMonthType monthType)
        {
            IList <QH_PositionLimitValue> limitValues = new List <QH_PositionLimitValue>();

            foreach (QH_PositionLimitValue value in values)
            {
                if (value.DeliveryMonthType == (int)monthType)
                {
                    limitValues.Add(value);
                }
            }

            return(limitValues);
        }