private void AddParRateForTaibor(DateTime startDate, ParRateElf parRateInfo)
        {
            (DateTime endDate, double days, double daysAct) = GetEndDate(startDate, parRateInfo);
            double zero = 0; //# 零息利率

            #region 取零息利率
            zero = RateAx.零息利率_T_R(parRateInfo.Rate, daysAct);
            #endregion 取零息利率
            this.ParRateList.Add(new ParRateElfEx(parRateInfo, this.TradeDate, endDate, days, daysAct, zero));
        }
        public void AddParRate(ParRateElf parRateInfo)
        {
            switch (parRateInfo.Market)
            {
            case EnumRateMarket.Interbank:
                AddParRateForInterbank(this.TradeDate, parRateInfo);     //# 啟算日從交易日
                break;

            case EnumRateMarket.Taibor:
                AddParRateForTaibor(this.TradeDate, parRateInfo);     //# 啟算日從交易日
                break;

            case EnumRateMarket.COSMOS:
                AddParRateForCOSMOS(this.SpotDate, parRateInfo);     //# 啟算日從即期日
                break;
            }
        }
        private (DateTime, double, double) GetEndDate(DateTime startDate, ParRateElf parRateInfo)
        {
            DateTime endDate = default(DateTime); //# 到期的實際日期
            double   days    = 0;                 //# 從交易日至到期日總天數
            double   daysAct = 0;                 //# 總天數 / Actual

            //# 表示驗證用, 會改寫days及daysAct
            if (parRateInfo.FakeDays > 0)
            {
                days    = parRateInfo.FakeDays;
                daysAct = days / ACTUAL;
                endDate = m_tradeDateAx.AdjustTradeDate(startDate.AddDays(parRateInfo.FakeDays));
            }
            else
            {
                #region 取到期日
                if (parRateInfo.Unit == EnumTenorUnit.Day)
                {
                    if (parRateInfo.Tenor == 1 || parRateInfo.Tenor == 2) //# O/N, T/N
                    {
                        endDate = m_tradeDateAx.AddTradeDate(startDate, parRateInfo.Tenor);
                    }
                    else
                    {
                        endDate = m_tradeDateAx.AdjustTradeDate(startDate.AddDays(parRateInfo.Tenor));
                    }
                }
                if (parRateInfo.Unit == EnumTenorUnit.Month)
                {
                    endDate = m_tradeDateAx.AdjustTradeDate(startDate.AddMonths(parRateInfo.Tenor));
                }
                if (parRateInfo.Unit == EnumTenorUnit.Year)
                {
                    endDate = m_tradeDateAx.AdjustTradeDate(startDate.AddYears(parRateInfo.Tenor));
                }
                #endregion 取到期日
                days    = (endDate - this.TradeDate).TotalDays;
                daysAct = days / ACTUAL;
            }
            return(endDate, days, daysAct);
        }
        private void AddParRateForCOSMOS(DateTime startDate, ParRateElf parRateInfo)
        {
            (DateTime endDate, double days, double daysAct) = GetEndDate(startDate, parRateInfo);
            double zero = 1;

            #region 取零息利率
            //# 先加入新的COSMOS利率, zero先預設為1
            this.ParRateList.Add(new ParRateElfEx(parRateInfo, this.TradeDate, endDate, days, daysAct, zero));
            //# 先取出已經存在的COSMOS利率資料重算
            List <ParRateElfEx> cosmosList = this.ParRateList.Where(p => p.Market == EnumRateMarket.COSMOS).ToList();
            //# 為防萬一先排序一下
            cosmosList = (from item in cosmosList
                          orderby item.Days
                          select item).ToList();

            //# 取最後的Taibor利率
            var maxTaibor = (from item in this.ParRateList
                             where item.Market == EnumRateMarket.Taibor
                             orderby item.Days descending
                             select item).First();
            GetZero(maxTaibor, cosmosList);
            logger.Info("ParRateExList={@parRateExList}", this.ParRateList);
            #endregion
        }
        private void AddParRateForInterbank(DateTime startDate, ParRateElf parRateInfo)
        {
            //# 一定是ON或TN, 央行沒有報TN, 所以會用ON的利率帶進來
            (DateTime endDate, double days, double daysAct) = GetEndDate(startDate, parRateInfo);
            double zero = 0; //# 零息利率

            #region 取零息利率
            if (parRateInfo.Unit == EnumTenorUnit.Day && parRateInfo.Tenor == 2) //# TN
            {
                ParRateElfEx ON = ParRateList.SingleOrDefault(p => p.Tenor == 1 && p.Unit == EnumTenorUnit.Day);
                if (ON == null)
                {
                    throw new Exception("沒有O/N無法計算T/N的零息利率");
                }
                double s = days - ON.Days;
                zero = RateAx.TN零息利率(ON.DF, parRateInfo.Rate, days, s);
            }
            else
            {
                zero = RateAx.零息利率_T_R(parRateInfo.Rate, daysAct);
            }
            #endregion 取零息利率
            this.ParRateList.Add(new ParRateElfEx(parRateInfo, this.TradeDate, endDate, days, daysAct, zero));
        }