联系
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace RiskVarComputeDescription { class Program { static void Main(string[] args) { #region 第0步 (界面数据 输入)数据准备 //Dictionary<string, int> progressList = new Dictionary<string, int>(); //Dictionary<string, object> dic = SpringCache.Get("RiskBookComputeModel") as Dictionary<string, object>; //Risk_Group_Type riskGroupType = Risk_Group_Type.Risk_Group_Type; ////模拟天数 //int timeHorizon = 1; ////计算天数 //int periodLength = 1; ////时间间隔 //int dateTimeSpan = 1; ////样本长度 //int windowSize = 30; ////模拟次数 //int simulationNumber = 100; ////直方图分隔次数 //int tickNumber = 30; ////好像是调用蒙特卡罗的结果次数 //int resultNumber = 5; //IList list = Dao.FindList(new QueryInfo("RskBook")); //int riskBookId = int.Parse((list[1] as RskBook).Id); ////风险模型 蒙特卡罗,方差协方差等等 //int riskModelTypeID = (int)((Dao.FindById(typeof(RskBook), dic["riskBookId"].ToString(), null, null) as RskBook).RSKModelType); ////当使用蒙特卡罗模型时 模拟次数需>=1 //if (riskModelTypeID == (int)Risk_Model_Type.Risk_Model_Type_Monte_Carlo && simulationNumber == 0) //{ // Utility.JSUtil.ExecuteScript(string.Format(" $.messager.alert('操作提示', '{0}')", "蒙特卡罗模拟法至少需要模拟一次!输入参数有误!")); // return; //} ////当使用方差协方差模型时 模拟次数置为0 //if (riskModelTypeID == (int)Risk_Model_Type.Risk_Model_Type_Parametric) //{ // if (dic != null && dic.Keys.Count > 0) // { // dic["simulationNumber"] = 0; // } // simulationNumber = 0; //} ////衰减因子 //double decayFactor = 1.0; ////时间步长 //double timeStepLength = 1; //DateTime computeDate = dic == null ? DateTime.Now : (DateTime)dic["computeDate"]; //ShockInputData shockInputData = new ShockInputData(); ////是否进行压力测试 //shockInputData.ShockFlag = false; ////价格变化类型 默认值 //shockInputData.ShockTypeID = Constants.DefaultSetting.ShockType; ////压力测试数值类型 绝对值/百分比 //shockInputData.ShockValueTypeID = Constants.DefaultSetting.ShockValueType; ////价格变化模式 加上、减去、乘上等等 //shockInputData.ShockModeID = Constants.DefaultSetting.ShockMode; ////压力测试 冲击值 //shockInputData.ShockValue = Constants.DefaultSetting.ShockValue; ////获取计算参数 其实就是要算哪几个步骤和进度条的步骤相关 //List<string> RskBookConfigParameterList = (List<string>)SpringCache.Get("RskBookConfigParameterList"); #endregion #region 第1步 CashflowGenerationService.GenerateTransactionCashflowByDatesWithShock(computeDate, computeDate, computeDate, computeDate, shockInputData, Result_Use_Type.Result_Use_Type_EOD_Process); //1.计算当天的现金流(CashflowGenerationService)(从TranBond,TranForward,TranSwap构造新的现金流 ) //传入条件 close_date,投资组合PortfolioIds(从BasPortfolio的全部记录来) #region 定义 ShockInputData //定义 ShockInputData //shockInputData = new ShockInputData(); ////是否进行压力测试 //shockInputData.ShockFlag = false; ////价格变化类型 默认值 //shockInputData.ShockTypeID = Constants.DefaultSetting.ShockType; ////压力测试数值类型 绝对值/百分比 //shockInputData.ShockValueTypeID = Constants.DefaultSetting.ShockValueType; ////价格变化模式 加上、减去、乘上等等 //shockInputData.ShockModeID = Constants.DefaultSetting.ShockMode; ////压力测试 冲击值 //shockInputData.ShockValue = Constants.DefaultSetting.ShockValue; #endregion #region 从TranBond,TranForward,TranSwap构造新的现金流sql // select // st.transaction_id // ,st.transaction_side_id // ,st.transaction_leg_id // ,st.transaction_reset_id // ,bondd.bond_sub_id transaction_sub_id // , bond.internal_legal_entity_id int_legal_entity_id // , bond.internal_business_unit_id int_business_unit_id // , bond.portfolio_id portfolio_id // , bond.counterparty_id // ,bond.instrument_type_id // ,bond.trader_id // ,bond.direction // ,nvl(bond.payment_currency, 'CNY') payment_currency // ,bondd.notional_volume trade_quantity // , nvl(bondd.volume_measure_unit, 0) volume_measure_unit // ,ipc.index_price_curve_id // ,ipf.index_price_factor_id // ,ipf.index_price_factor_id fx_rate_curve_id // , rf.risk_factor_id // ,rf.factor_type factor_type_id // ,1.0 index_scale_factor // ,1.0 conversion_factor // ,0 index_spread // ,'CNY' index_spread_currency // ,0 index_spread_measure_unit // ,0 fixed_price_rate // ,'CNY' fixed_price_currency // ,0 fixed_price_measure_unit // ,0 charge // ,'CNY' charge_currency // ,bond.pricing_model_id // ,ipc.yield_rate_curve_id // ,bond.transaction_date trade_date // , st.reset_date // ,st.payment_date // ,st.settlement_start_date settle_date // , st.accrual_start_date value_date // , st.accrual_start_date start_date // , st.averaging_end_date end_date // , nvl(ipmd.middle_price_value, 0) middle_price_value // --,nvl(yrcd.zero_rate_value, 0.05) zero_rate_value // ,0.05 zero_rate_value // ,1.0 fx_rate_value // --,nvl(yrcd.discount_factor, 1) discount_factor // ,1.0 discount_factor // from tran_structure st inner join tran_bond bond on bond.bond_id = st.transaction_id // inner join tran_bond_detail bondd on bondd.bond_id = bond.bond_id and bondd.bond_sub_id = st.transaction_sub_id // inner join bas_product_group bpg on bpg.source_product_id = bondd.rate_curve_id // inner join rsk_factor_product_mapping rfpm on rfpm.product_group_id = bpg.product_group_id // inner join mkt_index_price_factor ipf on ipf.index_price_factor_id = rfpm.index_price_factor_id // inner join rsk_factor rf on rf.index_price_factor_id = ipf.index_price_factor_id and rfpm.risk_factor_id = rf.risk_factor_id // inner join mkt_index_price_curve ipc on ipc.index_price_curve_id = ipf.index_price_curve_id // inner join mkt_yield_rate_curve yrc on yrc.yield_rate_curve_id = ipc.yield_rate_curve_id // inner join mkt_price_market_data ipmd on ipmd.index_price_factor_id = ipf.index_price_factor_id // and bond.portfolio_id in(2515,2516,2517,2518,2519,2520,2521,2522,2523,2524,4418,7000084) and ipmd.close_date = to_date('2016/4/29', 'yyyy/mm/dd') union all // select // st.transaction_id // ,st.transaction_side_id // ,st.transaction_leg_id // ,st.transaction_reset_id // ,swapd.swap_sub_id transaction_sub_id // , swap.internal_legal_entity_id int_legal_entity_id // , swap.internal_business_unit_id int_business_unit_id // , swap.portfolio_id portfolio_id // , swap.counterparty_id // ,swap.instrument_type_id // ,swap.trader_id // ,swap.direction // ,nvl(swap.payment_currency, 'CNY') payment_currency // ,swapd.trade_quantity // ,nvl(swapd.volume_measure_unit, 0) volume_measure_unit // ,ipc.index_price_curve_id // ,ipf.index_price_factor_id // ,ipf.index_price_factor_id fx_rate_curve_id // , rf.risk_factor_id // ,rf.factor_type factor_type_id // , nvl(swapd.index_scale_factor, 1.0) index_scale_factor // ,nvl(swapd.conversion_factor, 1.0) conversion_factor // ,nvl(swapd.index_spread, 0) index_spread // , nvl(swapd.index_spread_currency, 'CNY') index_spread_currency // , nvl(swapd.index_spread_measure_unit, 0) index_spread_measure_unit // , swapd.fixed_price_rate // , nvl(swapd.fixed_price_currency, 'CNY') fixed_price_currency // , nvl(swapd.fixed_price_measure_unit, 0) fixed_price_measure_unit // , nvl(swap.charge, 0) charge // , nvl(swap.charge_currency, 'CNY') charge_currency // , swap.pricing_model_id // , ipc.yield_rate_curve_id // , swap.transaction_date trade_date // , st.reset_date // , st.payment_date // , st.settlement_start_date settle_date // , st.accrual_start_date value_date // , st.accrual_start_date start_date // , st.averaging_end_date end_date // , nvl(ipmd.middle_price_value, 0) middle_price_value // --, nvl(yrcd.zero_rate_value, 0.05) zero_rate_value // , 0.05 zero_rate_value // , 1.0 fx_rate_value // --, nvl(yrcd.discount_factor, 1) discount_factor // , 1.0 discount_factor // from tran_structure st inner // join tran_swap swap on swap.swap_id = st.transaction_id //inner // join tran_swap_detail swapd on swapd.swap_id = swap.swap_id and swapd.swap_sub_id = st.transaction_sub_id // inner join mkt_index_price_factor ipf on ipf.index_price_factor_id = swapd.index_price_curve_id // inner join mkt_index_price_curve ipc on ipc.index_price_curve_id = ipf.index_price_curve_id // inner join mkt_yield_rate_curve yrc on yrc.yield_rate_curve_id = ipc.yield_rate_curve_id // inner join rsk_factor rf on ipf.index_price_factor_id = rf.index_price_factor_id // inner join mkt_price_market_data ipmd on ipmd.index_price_factor_id = ipf.index_price_factor_id // and swap.portfolio_id in(2515, 2516, 2517, 2518, 2519, 2520, 2521, 2522, 2523, 2524, 4418, 7000084) and ipmd.close_date = to_date('2016/4/29', 'yyyy/mm/dd') union all // select // st.transaction_id // ,st.transaction_side_id // ,st.transaction_leg_id // ,st.transaction_reset_id // ,fwdd.forward_sub_id transaction_sub_id // , fwd.internal_legal_entity_id int_legal_entity_id // , fwd.internal_business_unit_id int_business_unit_id // , fwd.portfolio_id portfolio_id // , fwd.counterparty_id // ,fwd.instrument_type_id // ,fwd.trader_id // ,fwd.direction // ,nvl(fwd.payment_currency, 'CNY') payment_currency // ,fwdd.trade_quantity // ,nvl(fwdd.volume_measure_unit, 0) volume_measure_unit // ,ipc.index_price_curve_id // ,ipf.index_price_factor_id // ,ipf.index_price_factor_id fx_rate_curve_id // , rf.risk_factor_id // ,rf.factor_type factor_type_id // , nvl(fwdd.index_scale_factor, 1.0) index_scale_factor // ,nvl(fwdd.conversion_factor, 1.0) conversion_factor // ,nvl(fwdd.index_spread, 0) index_spread // ,nvl(fwdd.index_spread_currency, 'CNY') index_spread_currency // ,nvl(fwdd.index_spread_measure_unit, 0) index_spread_measure_unit // ,fwdd.fixed_price_rate // ,nvl(fwdd.fixed_price_currency, 'CNY') fixed_price_currency // ,nvl(fwdd.fixed_price_measure_unit, 0) fixed_price_measure_unit // ,nvl(fwd.charge, 0) charge // ,nvl(fwd.charge_currency, 'CNY') charge_currency // ,fwd.pricing_model_id // ,ipc.yield_rate_curve_id // ,fwd.transaction_date trade_date // , st.reset_date // ,st.payment_date // ,st.settlement_start_date settle_date // , st.accrual_start_date value_date // , st.accrual_start_date start_date // , st.averaging_end_date end_date // , nvl(ipmd.middle_price_value, 0) middle_price_value // --,nvl(yrcd.zero_rate_value, 0.05) zero_rate_value // ,0.05 zero_rate_value // ,1.0 fx_rate_value // --,nvl(yrcd.discount_factor, 1) discount_factor // ,1.0 discount_factor // from tran_structure st inner join tran_forward fwd on fwd.forward_id = st.transaction_id // inner join tran_forward_detail fwdd on fwdd.forward_id = fwd.forward_id and fwdd.forward_sub_id = st.transaction_sub_id // inner join mkt_index_price_factor ipf on ipf.index_price_factor_id = fwdd.index_price_curve_id // inner join mkt_index_price_curve ipc on ipc.index_price_curve_id = ipf.index_price_curve_id // inner join mkt_yield_rate_curve yrc on yrc.yield_rate_curve_id = ipc.yield_rate_curve_id // inner join rsk_factor rf on ipf.index_price_factor_id = rf.index_price_factor_id // inner join mkt_price_market_data ipmd on ipmd.index_price_factor_id = ipf.index_price_factor_id // and fwd.portfolio_id in(2515,2516,2517,2518,2519,2520,2521,2522,2523,2524,4418,7000084) and ipmd.close_date = to_date('2016/4/29', 'yyyy/mm/dd') #endregion #region 上面sql结果映射到下面的list中去 //上面sql结果映射到下面的list中去 // IList<TransactionBaseCashflowView> cashFlowVwList = tranCashFlowService.GetBaseListByDatesPortfolioIDsWithSpringDao(asOfDate1, asOfDate2, asOfDate3, portfolioIDs); #endregion #region 然后按照投资组合PortfolioIds进行分组 // 然后按照投资组合PortfolioIds进行分组 // var transBaseVws = from tv in transactionBaseCashflowViewList // group tv by tv.PortfolioID into g // select new { portfolioID = g.Key, transBaseViewList = g }; #endregion #region 定义 trancashflowHashtable, transensitivehastable, riskdletapositionHashtable // var trancashflowHashtable = new hashtable(); // var transensitivehastable = new hastable(); // var riskdletapositionHashtable = new hashtable(); //} #endregion #region 每种投资组合的现金数据分配到 trancashflowHashtable, transensitivehastable, riskdletapositionHashtable // foreach (var transBaseVw in transBaseVws) // { // //transBaseVwList代表每一个投资组合的市场数据情况 // List<TransactionBaseCashflowView> transBaseVwList = = transBaseVw.transBaseViewList.ToList<TransactionBaseCashflowView>(); // 循环中调用下面这个方法的(GenerateTransactionCashflowFromBaseByDateWithShock1((computeDate, transBaseVwList, shockInputData, resultUseType, ref dics))), // 产生每个投资组合的tranCashflowList, tranSensitivityList, riskDeltaPositionList 进行返回放到三个hashtable 中 // Trancashflowhashtable.add(trancahsflowlist); // Transensitivehashtable.add(transensitivelist); // Riskdeltapostionhastable.add(riskdeltapositionlist); // #region GenerateTransactionCashflowFromBaseByDateWithShock1方法 //public void GenerateTransactionCashflowFromBaseByDateWithShock1(DateTime computeDate, // List<TransactionBaseCashflowView> tranBaseCashflowViewList, // ShockInputData shockInputData, // Result_Use_Type resultUseType, // ref Dictionary<string, IList> dics) // { // IList<TranCashFlow> tranCashflowList = new List<TranCashFlow>(); // IList<TranSensitivity> tranSensitivityList = new List<TranSensitivity>(); // TranCashFlow tranCashflow = new TranCashFlow(); // IList<RskDeltaPosition> riskDeltaPositionList = new List<RskDeltaPosition>(); // //RskDeltaPosition riskDeltaPosition = new RskDeltaPosition(); // //寻找离到期日最近的交易日日期 (其实就是上一次的交易日期) // 方法的定义如下 #region GetBestPriorBusinessDate 方法 // public DateTime GetBestPriorBusinessDate(DateTime asOfDate, int periodLength) // { // DateTime bestPriorBusinessDate = DateTime.Today; // for (int i = 1; i < periodLength + 1; i++) // { // if (IsBusinessDate(asOfDate.AddDays(-i))) // { // bestPriorBusinessDate = asOfDate.AddDays(-i); // break; // } // } // return bestPriorBusinessDate; // } #endregion // DateTime bestPriorBusinessDate = businessDateService.GetBestPriorBusinessDate(computeDate, Constants.DAYS_BACK_FOR_BUSINESS_DATE); // DateTime startDate = computeDate; // if (resultUseType == Result_Use_Type.Result_Use_Type_Price_Impact_Analysis // || resultUseType == Result_Use_Type.Result_Use_Type_IR_Rate_Impact_Analysis // || resultUseType == Result_Use_Type.Result_Use_Type_FX_Rate_Impact_Analysis) // { // startDate = bestPriorBusinessDate; // } // decimal numberOfYear = 0.0m; // decimal sumOfCashflowPeriod = 0.0m; // decimal bondPrice = 0.0m; // decimal duration = 0.0m; // decimal deltaVolume = 0.0m; // decimal deltaPosition = 0.0m; // decimal deltaPositionForIR = 0.0m; // decimal deltaPositionForFX = 0.0m; // decimal deltaPositionForEQ = 0.0m; // decimal deltaPositionForCOM = 0.0m; // int k = 0; // foreach (TransactionBaseCashflowView tranBaseCashflowView in tranBaseCashflowViewList) // { // RskDeltaPosition riskDeltaPosition = new RskDeltaPosition(); // CashflowDataInputDO cashflowInputData = new CashflowDataInputDO(); // cashflowInputData.TransactionSideID = tranBaseCashflowView.TransactionSideID; // cashflowInputData.Derivative_Type = tranBaseCashflowView.Derivative_Type; // cashflowInputData.InstrumentTypeID = (int)tranBaseCashflowView.InstrumentTypeID; // cashflowInputData.DirectionID = tranBaseCashflowView.DirectionID; // cashflowInputData.TradeQuantity = (double)tranBaseCashflowView.TradeQuantity; // cashflowInputData.IndexPriceRate = (double)tranBaseCashflowView.IndexPriceRate; // cashflowInputData.ZeroRateValue = (double)tranBaseCashflowView.ZeroRateValue; // cashflowInputData.FXRateValue = (double)tranBaseCashflowView.FXRateValue; // cashflowInputData.IndexSpread = (double)tranBaseCashflowView.IndexSpread; // cashflowInputData.IndexScaleFactor = (double)tranBaseCashflowView.IndexScaleFactor; // cashflowInputData.ConversionFactor = (double)tranBaseCashflowView.ConversionFactor; // cashflowInputData.FixedPriceRate = (double)tranBaseCashflowView.FixedPriceRate; // // 从现在到支付日的天数 // cashflowInputData.DaysToPayment = (int)tranBaseCashflowView.PaymentDate.Subtract(startDate).Days; // //如果daystopayment<0说明已经到期,不进行计算 // if (cashflowInputData.DaysToPayment <= 0) // { // continue; // } //tranCashflow = ComputeCashflowBySideIDWithShock(cashflowInputData, shockInputData, resultUseType); #region ComputCashflowBySideIDWithShock方法的定义 产生trancashflow ////ComputCashflowBySideIDWithShock方法的定义 start //private TranCashFlow ComputeCashflowBySideIDWithShock(CashflowDataInputDO cashflowInputData, // //int transactionSideID, // //int directionLookupID, // //double tradeQuantity, // //double indexPriceRate, // //double zeroRateValue, // //double fxRateValue, // //double indexSpread, // //double indexScaleFactor, // //double conversionFactor, // //double fixedPriceRate, // //int daysToPayment, // ShockInputData shockInputData, // Result_Use_Type resultUseType) //{ // //LOG.Warn(string.Format("In ComputeCashflowBySideIDWithShock() , {0}", DateTime.Now)); // TranCashFlow tranCashflow = new TranCashFlow(); // ; // string BUY = ConstEnum.BuyOrSell.买.ToString(); // string SELL = ConstEnum.BuyOrSell.卖.ToString(); // string FLOAT = ConstEnum.fixedOrfloat.浮动.ToString(); // string FIXED = ConstEnum.fixedOrfloat.固定.ToString(); // string RECEIVE = ConstEnum.PayOrReceive.收款.ToString(); // string PAY = ConstEnum.PayOrReceive.付款.ToString(); // string LONG = ConstEnum.LongOrShort.多头.ToString(); // string SHORT = ConstEnum.LongOrShort.空头.ToString(); // int directionSign = 1; // //int buyOrSellLookupID = BUY; // //int fixedOrFloatLookupID = FLOAT; // //int payOrReceiveLookupID = RECEIVE; // //int longOrShortLookupID = LONG; // string buyOrSell = BUY; // string fixedOrFloat = FLOAT; // string payOrReceive = RECEIVE; // string longOrShort = LONG; // double discountFactor = Constants.DefaultSetting.BaseDiscountFactorValue; // double unsettledVolume = 0; // double resetPriceRate = 0; // double cashflowValue = 0; // double discountedCashflow = 0; // double riskPosition = 0; // double interestRateRiskPosition = 0; // double fxRateRiskPosition = 0; // int transactionSideID = cashflowInputData.TransactionSideID; // int directionID = cashflowInputData.DirectionID; // double tradeQuantity = cashflowInputData.TradeQuantity; // double indexPriceRate = cashflowInputData.IndexPriceRate; // double zeroRateValue = cashflowInputData.ZeroRateValue; // double fxRateValue = cashflowInputData.FXRateValue; // double indexSpread = cashflowInputData.IndexSpread; // double indexScaleFactor = cashflowInputData.IndexScaleFactor; // double conversionFactor = cashflowInputData.ConversionFactor; // double fixedPriceRate = cashflowInputData.FixedPriceRate; // int daysToPayment = cashflowInputData.DaysToPayment; // double shockValue = shockInputData.ShockValue; // resetPriceRate = (indexPriceRate * indexScaleFactor + indexSpread) * conversionFactor; // if (transactionSideID == 0) // { // fixedOrFloat = FLOAT; // if (directionID == (int)Direction.Direction_Buy) // { // directionSign = 1; // buyOrSell = Direction.Direction_Buy.GetEnumDefaultName(); // payOrReceive = Pay_Or_Receive.Pay_Or_Receive_Receive.GetEnumDefaultName(); // longOrShort = Long_Or_Short.Long_Or_Short_Long.GetEnumDefaultName(); // } // else if (directionID == (int)Direction.Direction_Sale) // { // directionSign = -1; // buyOrSell = Direction.Direction_Sale.GetEnumDefaultName(); // payOrReceive = Pay_Or_Receive.Pay_Or_Receive_Pay.GetEnumDefaultName(); ; // longOrShort = Long_Or_Short.Long_Or_Short_Short.GetEnumDefaultName(); // } // } // else if (transactionSideID == 1) // { // fixedOrFloat = FIXED; //To be updated, e.g., for float/float swap, it could by float; // discountFactor = 1.0; // if (directionID == (int)Direction.Direction_Buy) // { // directionSign = -1; // buyOrSell = Direction.Direction_Sale.GetEnumDefaultName(); // payOrReceive = Pay_Or_Receive.Pay_Or_Receive_Pay.GetEnumDefaultName(); ; // longOrShort = Long_Or_Short.Long_Or_Short_Short.GetEnumDefaultName(); // } // else if (directionID == (int)Direction.Direction_Sale) // { // directionSign = 1; // buyOrSell = Direction.Direction_Buy.GetEnumDefaultName(); // payOrReceive = Pay_Or_Receive.Pay_Or_Receive_Receive.GetEnumDefaultName(); // longOrShort = Long_Or_Short.Long_Or_Short_Long.GetEnumDefaultName(); // } // if (fixedOrFloat == FIXED) // { // resetPriceRate = fixedPriceRate; // } // } // if (shockInputData.ShockFlag) // { // if (fixedOrFloat == FLOAT) // { // if (shockInputData.ShockValueType == Shock_Value_Type.Shock_Value_Type_Absolute) // { // if (shockInputData.ShockMode == Shock_Mode.Shock_Mode_Add) // { // indexPriceRate = indexPriceRate + shockValue; // } // else if (shockInputData.ShockMode == Shock_Mode.Shock_Mode_Subtract) // { // indexPriceRate = indexPriceRate - shockValue; // } // else if (shockInputData.ShockMode == Shock_Mode.Shock_Mode_Multiply) // { // indexPriceRate = indexPriceRate * shockValue; // } // } // else if (shockInputData.ShockValueType == Shock_Value_Type.Shock_Value_Type_Per) // { // if (shockInputData.ShockMode == Shock_Mode.Shock_Mode_Add) // { // indexPriceRate = indexPriceRate * (1.0 + shockValue / 100.0); // } // else if (shockInputData.ShockMode == Shock_Mode.Shock_Mode_Subtract) // { // indexPriceRate = indexPriceRate * (1.0 - shockValue / 100.0); // if (shockValue / 100.0 >= 1.0) // { // indexPriceRate = 0.0; // //Throw Warning Here !! // } // } // } // resetPriceRate = (indexScaleFactor * indexPriceRate + indexSpread) * conversionFactor; // } // } // //if (resultUseTypeID != (int)SysEnum.Result_Use_Type_Time_Impact_Analysis) // //{ // // daysToPayment = daysToPayment + 1; // //} // discountFactor = Math.Exp(-zeroRateValue * daysToPayment / Constants.DefaultSetting.YearDays); // need to consider time to pay at payment date // unsettledVolume = directionSign * Math.Abs(tradeQuantity); // cashflowValue = unsettledVolume * resetPriceRate * fxRateValue; // discountedCashflow = cashflowValue * discountFactor; // riskPosition = unsettledVolume * resetPriceRate; // interestRateRiskPosition = unsettledVolume * resetPriceRate * fxRateValue; // fxRateRiskPosition = unsettledVolume * resetPriceRate * discountFactor; // //volatilityRiskPosition = unsettledVolume * discountFactor * indexScaleFactor * conversionFactor; // tranCashflow.TransactionSideId = transactionSideID; // tranCashflow.BuyOrSell = buyOrSell; // tranCashflow.PayOrReceive = payOrReceive; // tranCashflow.LongOrShort = longOrShort; // tranCashflow.FixedOrFloat = fixedOrFloat; // tranCashflow.UnsettledVolume = (decimal)unsettledVolume; // if (fixedOrFloat == FLOAT) // { // tranCashflow.IndexPriceRate = (decimal)indexPriceRate; // } // else // { // tranCashflow.IndexPriceRate = 0.0m; // } // tranCashflow.ResetPriceRate = (decimal)resetPriceRate; // if (fixedOrFloat == FIXED) // { // tranCashflow.FixedPriceRate = (decimal)fixedPriceRate; // } // else // { // tranCashflow.FixedPriceRate = 0.0m; // } // tranCashflow.ZeroRateValue = (decimal)zeroRateValue; // tranCashflow.DiscountFactor = (decimal)discountFactor; // tranCashflow.CashflowValue = (decimal)cashflowValue; // tranCashflow.DiscountedCashflow = (decimal)discountedCashflow; // tranCashflow.PriceRiskPosition = (decimal)riskPosition; // tranCashflow.IRRiskPosition = (decimal)interestRateRiskPosition; // tranCashflow.FXRiskPosition = (decimal)fxRateRiskPosition; // //LOG.Warn(string.Format("Finish ComputeCashflowBySideIDWithShock() , {0}", DateTime.Now)); // return tranCashflow; //} ////ComputeCashflowBySideIDWithShock 方法的定义 end #endregion // if (shockInputData.ShockFlag) // { // tranCashflow.ScenarioId = shockInputData.ScenarioId; // tranCashflow.IsWithShock = "YES"; // } // else // { // tranCashflow.IsWithShock = "NO"; // } // tranCashflow.AsOfDate = computeDate; // tranCashflow.TransactionId = tranBaseCashflowView.TransactionID; // tranCashflow.TransactionSubId = tranBaseCashflowView.TransactionSubID; // tranCashflow.TransactionLegId = tranBaseCashflowView.TransactionLegID; // tranCashflow.TransactionResetId = tranBaseCashflowView.TransactionResetID; // tranCashflow.IntLegalEntityId = tranBaseCashflowView.IntLegalEntityID; // tranCashflow.IntBusUnitId = tranBaseCashflowView.IntBusinessUnitID; // tranCashflow.PortfolioId = tranBaseCashflowView.PortfolioID; // //tranCashflow.Portfolio = tranBaseCashflowView.Portfolio; // tranCashflow.InstTypeId = tranBaseCashflowView.InstrumentTypeID; // tranCashflow.CounterpartyId = tranBaseCashflowView.CounterpartyID; // tranCashflow.TraderId = tranBaseCashflowView.TraderID; // //tranCashflow.BuyOrSell = tranBaseCashflowView.Direction; // tranCashflow.VolumeMeasureUnit = tranBaseCashflowView.VolumeMeasureUnit; // tranCashflow.SettledVolume = 0; // tranCashflow.SettledAvgPrice = 0; // tranCashflow.IndexPriceFactorId = tranBaseCashflowView.IndexPriceFactorID; // tranCashflow.ValueCurrency = tranBaseCashflowView.PaymentCurrency; // tranCashflow.IndexScaleFactor = tranBaseCashflowView.IndexScaleFactor; // tranCashflow.IndexSpread = tranBaseCashflowView.IndexSpread; // tranCashflow.ConversionFactor = tranBaseCashflowView.ConversionFactor; // tranCashflow.YieldRateCurveId = tranBaseCashflowView.YieldRateCurveID; // tranCashflow.FXRateCurveId = tranBaseCashflowView.FXRateCurveID; // tranCashflow.PricingModelId = tranBaseCashflowView.PricingModelID; // tranCashflow.TradeDate = tranBaseCashflowView.TradeDate; // tranCashflow.ResetDate = tranBaseCashflowView.ResetDate; // tranCashflow.PaymentDate = tranBaseCashflowView.PaymentDate; // tranCashflow.SettleDate = tranBaseCashflowView.SettleDate; // tranCashflow.ValueDate = tranBaseCashflowView.ValueDate; // tranCashflow.StartDate = tranBaseCashflowView.StartDate; // tranCashflow.EndDate = tranBaseCashflowView.EndDate; // tranCashflow.RiskFactorId = tranBaseCashflowView.RiskFactorID; // tranCashflow.RiskSourceType = Risk_Type.Risk_Type_Total; // tranCashflow.RiskType = Risk_Type.Risk_Type_Total;// tranCashflow.ResultUseType = resultUseType; // tranCashflow.CreateUid = CurrentUser.UserId; // tranCashflow.CreateDate = DateTime.Now; // tranCashflowList.Add(tranCashflow); // if (tranCashflow.ResultUseType == Result_Use_Type.Result_Use_Type_EOD_Process) // { // deltaVolume = tranCashflow.UnsettledVolume* tranBaseCashflowView.DiscountFactor; //deltaPosition = tranCashflow.DiscountedCashflow; // if (tranCashflow.InstTypeId == Inst_Type.Inst_Type_IR_FRA // || tranCashflow.InstTypeId == Inst_Type.Inst_Type_IR_Swap // || tranCashflow.InstTypeId == Inst_Type.Inst_Type_IR_Basis_Swap // || tranCashflow.InstTypeId == Inst_Type.Inst_Type_IR_Futures // || tranCashflow.InstTypeId == Inst_Type.Inst_Type_Bond_Coupon // || tranCashflow.InstTypeId == Inst_Type.Inst_Type_Bond_FRN // || tranCashflow.InstTypeId == Inst_Type.Inst_Type_Bond_Callable // || tranCashflow.InstTypeId == Inst_Type.Inst_Type_Bond_Putable // || tranCashflow.InstTypeId == Inst_Type.Inst_Type_Bond_Convertible // || tranCashflow.InstTypeId == Inst_Type.Inst_Type_FX_Currency_Swap // ) // { // deltaPosition = tranCashflow.DiscountedCashflow; // deltaPositionForIR = tranCashflow.DiscountedCashflow; // deltaPositionForFX = 0.0m; // deltaPositionForEQ = 0.0m; // deltaPositionForCOM = 0.0m; // } // else if (tranCashflow.InstTypeId == Inst_Type.Inst_Type_FX_Spot // || tranCashflow.InstTypeId == Inst_Type.Inst_Type_FX_Forward // || tranCashflow.InstTypeId == Inst_Type.Inst_Type_FX_Swap // || tranCashflow.InstTypeId == Inst_Type.Inst_Type_FX_Currency_Futures // || tranCashflow.InstTypeId == Inst_Type.Inst_Type_FX_Currency_Swap // || tranCashflow.InstTypeId == Inst_Type.Inst_Type_FX_CIR_Swap) // { // deltaPosition = tranCashflow.DiscountedCashflow; // deltaPositionForIR = 0.0m; // deltaPositionForFX = tranCashflow.DiscountedCashflow; // deltaPositionForEQ = 0.0m; // deltaPositionForCOM = 0.0m; // } // riskDeltaPosition.AsOfDate = computeDate; // riskDeltaPosition.PortfolioId = tranBaseCashflowView.PortfolioID; // riskDeltaPosition.TransactionId = tranBaseCashflowView.TransactionID; // riskDeltaPosition.TransactionSubId = tranBaseCashflowView.TransactionSubID; // riskDeltaPosition.TransactionLegId = tranBaseCashflowView.TransactionLegID; // riskDeltaPosition.TransactionResetId = tranBaseCashflowView.TransactionResetID; // riskDeltaPosition.IntLegalEntityId = tranBaseCashflowView.IntLegalEntityID; // //riskDeltaPosition.IntLegalEntity = tranBaseCashflowView.IntLegalEntity; // riskDeltaPosition.IntBusUnitId = tranBaseCashflowView.IntBusinessUnitID; // //riskDeltaPosition.IntBusUnit = tranBaseCashflowView.IntBusinessUnit; // riskDeltaPosition.PortfolioId = tranBaseCashflowView.PortfolioID; // //riskDeltaPosition.Portfolio = tranBaseCashflowView.Portfolio; // riskDeltaPosition.InstTypeId = tranBaseCashflowView.InstrumentTypeID; // //riskDeltaPosition.InstType = tranBaseCashflowView.InstrumentType; // riskDeltaPosition.CounterpartyId = tranBaseCashflowView.CounterpartyID; // //riskDeltaPosition.Counterparty = tranBaseCashflowView.Counterparty; // riskDeltaPosition.IndexPriceRate = tranBaseCashflowView.IndexPriceRate;//原本是trancashflow.IndexPriceRate // riskDeltaPosition.TraderId = tranBaseCashflowView.TraderID; // //riskDeltaPosition.Trader = tranBaseCashflowView.Trader; // riskDeltaPosition.IndexPriceFactorId = tranBaseCashflowView.IndexPriceFactorID; // riskDeltaPosition.Currency = tranBaseCashflowView.PaymentCurrency; // riskDeltaPosition.DeltaVolume = deltaVolume; // riskDeltaPosition.DeltaPosition = deltaPosition; // riskDeltaPosition.DeltaPositionForIR = deltaPositionForIR; // riskDeltaPosition.DeltaPositionForFX = deltaPositionForFX; // riskDeltaPosition.DeltaPositionForEQ = deltaPositionForEQ; // riskDeltaPosition.DeltaPositionForCOM = deltaPositionForCOM; // riskDeltaPosition.RiskFactorId = tranBaseCashflowView.RiskFactorID; // riskDeltaPosition.RiskType = Risk_Type.Risk_Type_Total;// Risk_Type.Risk_Type.GetEnumName(); // riskDeltaPosition.CreateUid = CurrentUser.UserId; // riskDeltaPosition.CreateDate = DateTime.Now; // riskDeltaPositionList.Add(riskDeltaPosition); // } // numberOfYear = tranBaseCashflowView.DaysInUntilPeriod / Constants.DefaultSetting.YearDays; // sumOfCashflowPeriod += tranCashflow.DiscountedCashflow* numberOfYear; //bondPrice += tranCashflow.DiscountedCashflow; // if (k == tranBaseCashflowViewList.Count - 1) // { // duration = sumOfCashflowPeriod / bondPrice; // } // TranSensitivity tranSensitivity = new TranSensitivity(); //tranSensitivity.ComputeDate = tranCashflow.AsOfDate; // tranSensitivity.ComputeMethod = "Test Method"; // tranSensitivity.TransactionId = (int)tranCashflow.TransactionId; // tranSensitivity.TransactionSubId = (int)tranCashflow.TransactionSubId; // tranSensitivity.TransactionSideId = (int)tranCashflow.TransactionSideId; // tranSensitivity.TransactionLegId = (int)tranCashflow.TransactionLegId; // tranSensitivity.IndexPriceFactorId = (int)tranCashflow.IndexPriceFactorId; // tranSensitivity.UnitDeltaValue = tranBaseCashflowView.DiscountFactor; // tranSensitivity.UnitGammaValue = 0.0m; // tranSensitivity.UnitVegaValue = 0.0m; // tranSensitivity.UnitThetaValue = 0.0m; // tranSensitivity.UnitRhoValue = 0.0m; // tranSensitivity.UnitEtaValue = 0.0m; // tranSensitivity.DeltaPosition = tranCashflow.DiscountedCashflow; // tranSensitivity.GammaPosition = 0.0m; // tranSensitivity.VegaPosition = 0.0m; // tranSensitivity.ThetaPosition = 0.0m; // tranSensitivity.RhoPosition = 0.0m; // tranSensitivity.EtaPosition = 0.0m; // tranSensitivity.CreateUid = CurrentUser.UserId; // tranSensitivity.CreateDate = DateTime.Now; // tranSensitivityList.Add(tranSensitivity); // } // dics["TranCashFlow"] = (IList)tranCashflowList; // dics["TranSensitivity"] = (IList)tranSensitivityList; // dics["RiskDeltaPosition"] = (IList)riskDeltaPositionList; // } #endregion #endregion //SaveTransactionCashflow(computeDate, resultUseType, tranCashflowTable); #region SaveTransactionCashflow具体实现 // SaveTransactionCashflow具体实现 // private void SaveTransactionCashflow(DateTime computeDate, Result_Use_Type resultUseType, Hashtable tranCashflowTable) // { // //LOG.Warn(string.Format("In SaveTransactionCashflow() , {0}", DateTime.Now)); // if (tranCashflowTable != null && tranCashflowTable.Count > 0) // { // ICollection portfoliIDKeys = tranCashflowTable.Keys; // int[] portfolioIDs = new int[portfoliIDKeys.Count]; // int i = 0; // foreach (int portfolioID in portfoliIDKeys) // { // //portfolioIDs[i] = int.Parse(s); // portfolioIDs[i] = portfolioID; // i++; // } // portfoliIDKeys.CopyTo(portfolioIDs, 0); // 要保存新的,先删除旧的数据 // int result = tranCashFlowService.DeleteByDatePortfolioIDsUseTypeID(computeDate, portfolioIDs, resultUseType); #region DeleteByDatePortfolioIDsUseTypeID(computeDate, portfolioIDs, resultUseType);实现sql // DeleteByDatePortfolioIDsUseTypeID start // string deleteByDatePortfolioIDsUseTypeIDSQL = "Delete from TranCashFlow " + // " WHERE AsOfDate = :AsOfDate " + // " AND PortfolioId in (:PortfolioIDs ) " + // " AND ResultUseType = :ResultUseType "; // QueryInfo info = new QueryInfo(); // info.CustomSQL = deleteByDatePortfolioIDsUseTypeIDSQL; // info.Parameters.Add("AsOfDate", asOfDate); // info.Parameters.Add("ResultUseType", (int)resultUseType); // info.Parameters.Add("PortfolioIDs", portfolioIDs); // return Dao.ExecuteUpdate(info); #endregion // IList<TranCashFlow> list = new List<TranCashFlow>(); // foreach (int portfolioID in portfoliIDKeys) // { // IList<TranCashFlow> tranCashflowList = (IList<TranCashFlow>)tranCashflowTable[portfolioID]; // foreach (TranCashFlow tranCashflow in tranCashflowList) // { // tranCashflow.Id = string.Empty; // tranCashflow.State.MarkNew(); // list.Add(tranCashflow); // //保存需要更改 // //result = tranCashFlowService.SaveBySpringDAO(tranCashflow); // } // } // Dao.SaveOrUpdateAll<TranCashFlow>(list); // } #endregion //SaveTranSensitivity(computeDate, resultUseType, tranSensitivityTable); #region SaveTranSensitivity(computeDate, resultUseType, tranSensitivityTable);实现代码 //private void SaveTranSensitivity(DateTime computeDate, Result_Use_Type resultUseType, Hashtable tranSensitivityTable) //{ // if (tranSensitivityTable != null && tranSensitivityTable.Count > 0) // { // ICollection portfoliIDKeys = tranSensitivityTable.Keys; // int[] portfolioIDs = new int[portfoliIDKeys.Count]; // int i = 0; // foreach (int portfolioID in portfoliIDKeys) // { // //portfolioIDs[i] = int.Parse(s); // portfolioIDs[i] = portfolioID; // i++; // } // // portfoliIDKeys.CopyTo(portfolioIDs, 0); // 要保存先删除 // int result = tranSensitivityService.DeleteByDate(computeDate); // 删除的实现代码sql #region tranSensitivityService.DeleteByDate(computeDate) 删除sql //public int DeleteByDate(DateTime computeDate) //{ // // new RskDeltaPosition().PortfolioId.AsOfDate // string deleteByDatePortfolioIDsUseTypeIDSQL = "Delete from TranSensitivity " + // " WHERE ComputeDate = :ComputeDate "; // //" AND PortfolioId in (:PortfolioIDs ) "; // QueryInfo info = new QueryInfo(); // info.CustomSQL = deleteByDatePortfolioIDsUseTypeIDSQL; // info.Parameters.Add("ComputeDate", computeDate); // //info.Parameters.Add("PortfolioIDs", portfolioIDs); // return Dao.ExecuteUpdate(info); //} #endregion // IList<TranSensitivity> list = new List<TranSensitivity>(); // foreach (int portfolioID in portfoliIDKeys) // { // IList<TranSensitivity> tranSensitivityList = (IList<TranSensitivity>)tranSensitivityTable[portfolioID]; // foreach (TranSensitivity tranSensitivity in tranSensitivityList) // { // tranSensitivity.Id = string.Empty; // tranSensitivity.State.MarkNew(); // list.Add(tranSensitivity); // } // } // Dao.SaveOrUpdateAll<TranSensitivity>(list); // } //} #endregion //SaveRiskDeltaPosition(computeDate, resultUseType, riskPositionTable); #region SaveRiskDeltaPosition(computeDate, resultUseType, riskPositionTable);实现代码 //private void SaveRiskDeltaPosition(DateTime computeDate, Result_Use_Type resultUseType, Hashtable riskPositionTable) //{ // if (riskPositionTable != null && riskPositionTable.Count > 0) // { // ICollection portfoliIDKeys = riskPositionTable.Keys; // int[] portfolioIDs = new int[portfoliIDKeys.Count]; // int i = 0; // foreach (int portfolioID in portfoliIDKeys) // { // //portfolioIDs[i] = int.Parse(s); // portfolioIDs[i] = portfolioID; // i++; // } // // portfoliIDKeys.CopyTo(portfolioIDs, 0); // int result = riskDeltaPositionService.DeleteByDatePortfolioIDsUseTypeID(computeDate, portfolioIDs); #region 删除sql实现 //public int DeleteByDatePortfolioIDsUseTypeID(DateTime asOfDate, int[] portfolioIDs) //{ // // new RskDeltaPosition().PortfolioId.AsOfDate // string deleteByDatePortfolioIDsUseTypeIDSQL = "Delete from RskDeltaPosition " + // " WHERE AsOfDate = :AsOfDate " + // " AND PortfolioId in (:PortfolioIDs ) "; // QueryInfo info = new QueryInfo(); // info.CustomSQL = deleteByDatePortfolioIDsUseTypeIDSQL; // info.Parameters.Add("AsOfDate", asOfDate); // info.Parameters.Add("PortfolioIDs", portfolioIDs); // return Dao.ExecuteUpdate(info); //} #endregion // IList<RskDeltaPosition> list = new List<RskDeltaPosition>(); // foreach (int portfolioID in portfoliIDKeys) // { // IList<RskDeltaPosition> riskDeltaPositionList = (IList<RskDeltaPosition>)riskPositionTable[portfolioID]; // foreach (RskDeltaPosition riskDeltaPosition in riskDeltaPositionList) // { // riskDeltaPosition.Id = string.Empty; // riskDeltaPosition.State.MarkNew(); // list.Add(riskDeltaPosition); // //保存需要更改 // //result = tranCashFlowService.SaveBySpringDAO(tranCashflow); // } // } // Dao.SaveOrUpdateAll<RskDeltaPosition>(list); // } #endregion #endregion #region 第2步 PayoffComputationService.ComputeTransactionPayoffByDate(computeDate, Result_Use_Type.Result_Use_Type_EOD_Process); //public void ComputeTransactionPayoffByDate(DateTime computeDate, Result_Use_Type resultUseType) //{ // IList<TranBasePayoffView> transactionBasePayoffViews = GetAllTransactionBasePayoffView(computeDate, resultUseType); #region GetAllTransactionBasePayOffView 实现 //private IList<TranBasePayoffView> GetAllTransactionBasePayoffView(DateTime computeDate, Result_Use_Type resultUseType) //{ // //LOG.Warn(string.Format("In GetAllTransactionBasePayoffView() , {0}", DateTime.Now)); // string[] portfolioIDs = GetAllPortfolioIDsByDate(computeDate); #region GetAllPortfolioIDsByDate 实现 //private string[] GetAllPortfolioIDsByDate(DateTime asOfDate) //{ // IList<BasPortfolio> portfolioList = tranCashFlowService.GetAllPortfilioFromCashflow(asOfDate); #region tranCashFlowService.GetAllPortfilioFromCashflow(asOfDate)实现 //public IList<BasPortfolio> GetAllPortfilioFromCashflow(System.DateTime asOfDate) //{ // Framework.QueryInfo info = new QueryInfo(); // info.QueryObject = "BasPortfolio p"; // info.Where.Add("kk", " and exists(select 1 from TranCashFlow t where p.Id=t.PortfolioId and t.AsOfDate=:AsOfDate )"); // info.Parameters.Add("AsOfDate", asOfDate); // IList resultList = Dao.FindList(info); // IList<BasPortfolio> BasPortfolioList = new List<BasPortfolio>(); // foreach (var basPortfolio in resultList) // { // BasPortfolioList.Add(basPortfolio as BasPortfolio); // } // return BasPortfolioList; // //return Holworth.Utility.Utility.ListToT<BasPortfolio>(resultList); //} #endregion // if (portfolioList == null || portfolioList.Count == 0) // { // return null; // } // IEnumerable<BasPortfolio> portList = portfolioList.Cast<BasPortfolio>(); // var portfIDs = from p in portList // select p.Id; // return portfIDs.ToArray<string>(); //} #endregion // if (portfolioIDs == null || portfolioIDs.Length == 0) // { // //LOG.Error("ERROR: - PortfolioID array is empty in ValuationEODProcessService.GetAllTransactionBasePayoffView() "); // //throw new Exception("ERROR: - PortfolioID array is empty in ValuationEODProcessService.GetAllTransactionBasePayoffView() "); // } // int result = tranPayoffService.DeleteByDatePortfolioIDsUseTypeID(computeDate, portfolioIDs, resultUseType); #region tranPayoffService.DeleteByDatePortfolioIDsUseTypeID(computeDate, portfolioIDs, resultUseType) 实现 //public int DeleteByDatePortfolioIDsUseTypeID(DateTime computeDate, string[] portfolioIDs, Result_Use_Type resultUseType) //{ // if (portfolioIDs != null && portfolioIDs.Length > 0) // { // StringBuilder buf = new StringBuilder(); // string allIDsParam = ""; // foreach (string id in portfolioIDs) // { // buf.Append(id).Append(", "); // } // if (buf.Length > 0) // { // allIDsParam = buf.ToString(); // int lastCamma = allIDsParam.LastIndexOf(","); // allIDsParam = allIDsParam.Substring(0, lastCamma); // } // QueryInfo info = new QueryInfo(); // info.CustomSQL = "delete from " + typeof(TranPayoff).Name + ""; // info.AddParam("AsOfDate", computeDate); // info.AddParam("ResultUseType", (int)resultUseType); // info.Where.Add(":PortfolioID", " and PortfolioId in(" + allIDsParam + ")"); // int query = Dao.ExecuteUpdate(info); // return query; // } // else // { // //LOG.Warn("Error - IndexPriceFactorID array is empty in TransactionPayoffSpringDao.DeleteByDatePortfolioIDs()"); // return 0; // } //} #endregion // IList<TranBasePayoffView> payoffVwList = tranPayoffService.GetBaseListByDatePortfolioIDsUseTypeIDWithSpringDao(computeDate, portfolioIDs, resultUseType); #region tranPayoffService.GetBaseListByDatePortfolioIDsUseTypeIDWithSpringDao(computeDate, portfolioIDs, resultUseType) 实现 //public IList<TranBasePayoffView> GetBaseListByDatePortfolioIDsUseTypeIDWithSpringDao(DateTime asOfdate, string[] portfolioIDs, Result_Use_Type resultUseType) //{ // StringBuilder buf = new StringBuilder(); // string allIDsParam = ""; // IList<TranBasePayoffView> returnList = new List<TranBasePayoffView>(); // if (portfolioIDs != null) // { // foreach (string id in portfolioIDs) // { // buf.Append(id).Append(", "); // } // if (buf.Length > 0) // { // allIDsParam = buf.ToString(); // int lastCamma = allIDsParam.LastIndexOf(","); // allIDsParam = allIDsParam.Substring(0, lastCamma); // } // string[] PortfolioIds = allIDsParam.Split(','); // QueryInfo info = new QueryInfo(); // info.CustomSQL = @" // SELECT As_Of_Date AsOfDate //, Transaction_ID TransactionId //, Transaction_Sub_Id TransactionSubId //, TransactionLegID TransactionLegId //, Portfolio_Id PortfolioId //, ValueCurrency ValueCurrency //, SUM(SettledPayoffValue)SettledPayoffValue //, SUM(UnsettledPayoffValue) UnsettledPayoffValue //, SUM(UnitPayoffValue) UnitPayoffValue //, SUM(SettledPayoffValue + UnsettledPayoffValue) TotalPayoffValue //, VolumeMeasureUnitID VolumeMeasureUnit //, SUM(SETTLEDVOLUME) SettledVolume //, SUM(UNSETTLEDVOLUME) UnsettledVolume //, SUM(CostValue) CostValue //, SUM(SettledPayoffValue + UnsettledPayoffValue - CostValue) MarkToMarketValue //, Result_Use_Type ResultUseType //FROM( //SELECT TCF.As_Of_Date //, TCF.Transaction_Id //, TCF.Transaction_Sub_Id //, TCF.Transaction_Side_Id //, 0 TransactionLegID //, TCF.Portfolio_Id //, TCF.Value_Currency ValueCurrency //, (TCF.SETTLED_VOLUME * TCf.Settled_Avg_Price) SettledPayoffValue--SettledAvgPrice //, tcf.discounted_cashflow UnsettledPayoffValue--DiscountedCashflow UnsettledPayoffValue //, 0.0 UnitPayoffValue //, 0.0 TotalPayoffValue //, TCF.Volume_Measure_Unit VolumeMeasureUnitID //, TCF.SETTLED_VOLUME SETTLEDVOLUME //, TCF.UNSETTLED_VOLUME UNSETTLEDVOLUME //, 0.0 CostValue //, 0.0 MarkToMarketValue //, TCF.Result_Use_Type //FROM tran_cash_flow TCF //WHERE TCF.As_Of_Date =:AsOfDate //AND TCF.Portfolio_Id in (:PortfolioIds) //AND TCF.Result_Use_Type =:ResultUseType //) COMBO //GROUP BY as_of_date //, Transaction_ID //, Transaction_Sub_Id //, TransactionLegID //, Portfolio_Id //, ValueCurrency //, VolumeMeasureUnitID //, Result_Use_Type //ORDER BY as_of_date //, Transaction_ID //, Transaction_Sub_Id //, TransactionLegID //, Portfolio_Id //, ValueCurrency //, VolumeMeasureUnitID //, Result_Use_Type // " // info.CustomSQL = info.CustomSQL.Replace(":AsOfDate", string.Format("to_date('{0}','yyyy/mm/dd')", asOfdate.ToString("yyyy/MM/dd"))).Replace(":ResultUseType", "'" + (int)resultUseType + "'").Replace(":PortfolioIds", // allIDsParam); // // info.Parameters.Add("AsOfDate", asOfdate); // //info.Parameters.Add("ResultUseType", resultUseTypeID); // //info.Parameters.Add("PortfolioIds", allIDsParam); // DataSet ds = Dao.ExecuteDataSet(info); //Holworth.Utility.Utility.EntityRowMapper.ExcuteDataSet("selectBaseforTranPayoffSQL", info); // // IList<TranBasePayoffView> returnList = Holworth.Utility.Utility.EntityRowMapper.ExcuteRowMapperT<TranBasePayoffView>("selectBaseforTranPayoffSQL", info, System.Web.HttpContext.Current.Server.MapPath("~/Config/Sql.xml")); // //info.Where.Add("PortfolioID", " and PortfolioId in(" + allIDsParam + ")"); // //IList resultList = Dao.FindList(info); // //IList<TranBasePayoffView> returnList = new List<TranBasePayoffView>(); // if (ds != null && ds.Tables[0].Rows.Count > 0) // { // returnList = DataSet2List(ds); // //foreach (TranCashFlow tranBasePayoffView in resultList) // //{ // // returnList.Add(new TranBasePayoffView() // // { // // Id = tranBasePayoffView.Id, // // AsOfDate = (DateTime) tranBasePayoffView.AsOfDate, // // TransactionId = tranBasePayoffView.TransactionId, // // TransactionSubId = tranBasePayoffView.TransactionSubId, // // TransactionLegId = tranBasePayoffView.TransactionLegId, // // PortfolioId = tranBasePayoffView.PortfolioId, // // ValueCurrency =tranBasePayoffView.ValueCurrency, // // SettledPayoffValue =0, // // UnsettledPayoffValue = 0, // // UnitPayoffValue = 0, // // TotalPayoffValue =0, // // VolumeMeasureUnit = tranBasePayoffView.VolumeMeasureUnit, // // SettledVolume = (decimal) (tranBasePayoffView.SettledVolume==null?0:tranBasePayoffView.SettledVolume), // // UnsettledVolume = (decimal)(tranBasePayoffView.UnsettledVolume == null ? 0 : tranBasePayoffView.UnsettledVolume), // // CostValue = 0, // // MarkToMarketValue = 0, // // ResultUseType = tranBasePayoffView.ResultUseType // // }); // //} // //foreach (TranBasePayoffView indexPrice in resultList) // //{ // // returnList.Add(indexPrice); // //} // } // } // return returnList; //} #endregion // //LOG.Warn(string.Format("Finish GetAllTransactionBasePayoffView() , {0}", DateTime.Now)); // return payoffVwList; //} #endregion // Hashtable tranPayoffTable = new Hashtable(); // var transBaseVws = from tv in transactionBasePayoffViews // group tv by tv.PortfolioId into g // select new { portfolioID = g.Key, transBaseViewList = g }; // if (transBaseVws != null) // { // DateTime now = DateTime.Now; // //被我暂时改了 // string userName = CurrentUser.UserName; // foreach (var transBaseVw in transBaseVws) // { // //Hashtable tranPayoffTable = new Hashtable(); // //TranPayoff tranPayoff = new TranPayoff(); // // at each portfolo level // IList<TranPayoff> tranPayoffPortfolioList = new List<TranPayoff>(); // IList<TranPayoff> tranPayoffTransactionList = new List<TranPayoff>(); // List<TranBasePayoffView> transBaseVwList = transBaseVw.transBaseViewList.ToList<TranBasePayoffView>(); // //if (transBaseVw.portfolioID > 10001) // //{ // int total = transBaseVwList.Count(); // for (var i = 0; i < total; i++) // { // TranBasePayoffView tranBasePayoff = transBaseVwList[i]; // TranPayoff tranPayoff = new TranPayoff(); // tranPayoff.AsOfDate = computeDate; // tranPayoff.TransactionId = tranBasePayoff.TransactionId; // tranPayoff.TransactionSubId = tranBasePayoff.TransactionSubId; // tranPayoff.TransactionLegId = tranBasePayoff.TransactionLegId; // tranPayoff.PortfolioId = tranBasePayoff.PortfolioId; // tranPayoff.ValueCurrency = tranBasePayoff.ValueCurrency; // tranPayoff.SettledPayoffValue = tranBasePayoff.SettledPayoffValue; // tranPayoff.UnsettledPayoffValue = tranBasePayoff.UnsettledPayoffValue; // tranPayoff.UnitPayoffValue = tranBasePayoff.UnitPayoffValue; // tranPayoff.TotalPayoffValue = tranBasePayoff.TotalPayoffValue; // tranPayoff.VolumeMeasureUnit = tranBasePayoff.VolumeMeasureUnit; // tranPayoff.SettledVolume = tranBasePayoff.SettledVolume; // tranPayoff.UnsettledVolume = tranBasePayoff.UnsettledVolume; // tranPayoff.CostValue = tranBasePayoff.CostValue; // tranPayoff.MarkToMarketValue = tranBasePayoff.MarkToMarketValue; // tranPayoff.ResultUseType = tranBasePayoff.ResultUseType; // tranPayoff.CreateUid = CurrentUser.UserId; // tranPayoff.CreateUname = CurrentUser.UserName; // tranPayoff.CreateDate = DateTime.Now; // tranPayoffPortfolioList.Add(tranPayoff); // } // tranPayoffTable.Add(transBaseVw.portfolioID, tranPayoffPortfolioList); // } // SaveTransactionPayOffsByTemp(computeDate, resultUseType, tranPayoffTable); // } //} #endregion #region 第3步 ProfitLossComputationService.ComputeTransactionProfitLossByDate(computeDate, Result_Use_Type.Result_Use_Type_EOD_Process); // public void ComputeTransactionProfitLossByDate(DateTime computeDate, Result_Use_Type resultUseType) //{ // //LOG.Warn(string.Format("In ComputeTransactionProfitLossByDate() , {0}", DateTime.Now)); // Hashtable transactionProfitLossTable = new Hashtable(); // IList<BasPortfolio> portfolioList = tranCasfhlowService.GetAllPortfilioFromCashflow(computeDate); #region tranCasfhlowService.GetAllPortfilioFromCashflow(computeDate)实现这里存在重复调用(上面第2步的时候去数据库查过一次了) 可以优化为一次 // public IList<BasPortfolio> GetAllPortfilioFromCashflow(System.DateTime asOfDate) //{ // Framework.QueryInfo info = new QueryInfo(); // info.QueryObject = "BasPortfolio p"; // info.Where.Add("kk", " and exists(select 1 from TranCashFlow t where p.Id=t.PortfolioId and t.AsOfDate=:AsOfDate )"); // info.Parameters.Add("AsOfDate", asOfDate); // IList resultList = Dao.FindList(info); // IList<BasPortfolio> BasPortfolioList = new List<BasPortfolio>(); // foreach (var basPortfolio in resultList) // { // BasPortfolioList.Add(basPortfolio as BasPortfolio); // } // return BasPortfolioList; // //return Holworth.Utility.Utility.ListToT<BasPortfolio>(resultList); //} #endregion // DateTime currentDate = computeDate; // DateTime bestPriorBusinessDate = businessDateService.GetBestPriorBusinessDate(computeDate, Constants.DAYS_BACK_FOR_BUSINESS_DATE); // foreach (BasPortfolio portfolio in portfolioList) // { // IList<TranProfitloss> tranProfitLossList = ComputeTransactionProfitLossByPortfolioID(currentDate, bestPriorBusinessDate, int.Parse(portfolio.Id), resultUseType); #region ComputeTransactionProfitLossByPortfolioID(currentDate, bestPriorBusinessDate, int.Parse(portfolio.Id), resultUseType)实现 // private IList<TranProfitloss> ComputeTransactionProfitLossByPortfolioID(DateTime currentDate, DateTime priorDate, int portfolioID, Result_Use_Type resultUseType) //{ // IList<TranProfitloss> tranProfitLossList = new List<TranProfitloss>(); // IList<TransactionBaseProfitLossView> tranBaseProfitLossList = tranProfitLossService.GetBaseListByDatePortfolioIDUseTypeID(currentDate, priorDate, portfolioID, resultUseType); #region tranProfitLossService.GetBaseListByDatePortfolioIDUseTypeID(currentDate, priorDate, portfolioID, resultUseType)实现 // public IList<TransactionBaseProfitLossView> GetBaseListByDatePortfolioIDUseTypeID(DateTime currentDate, DateTime priorDate, int portfolioID, Result_Use_Type resultUseType) //{ // //Convert.ToString((int)LookupItems.USE_TYPE_EOD_PROCESS) // QueryInfo info = new QueryInfo();//typeof(TranProfitloss).Name // info.Parameters.Add("AsOfDate1", priorDate); // info.Parameters.Add("AsOfDate2", currentDate); // info.Parameters.Add("PortfolioID", portfolioID); // info.Parameters.Add("ResultUseType1", (int)resultUseType); // info.Parameters.Add("ResultUseType2", (int)resultUseType); // //底层优化过rowmapper // IList<TransactionBaseProfitLossView> returnList = Holworth.Utility.HraUtility.EntityRowMapper.ExcuteRowMapperT<TransactionBaseProfitLossView>("selectBaseforTranProfitLossSQL", info); #region 执行的sql其实就是 (传入参数 priordate ,currentdate,result_use_type ,portfolid) string sql = @"SELECT As_Of_Date AsOfDate ,Transaction_Id TransactionID ,Transaction_Sub_Id TransactionSubID ,Volume_Measure_Unit VolumeMeasureUnitID ,SUM(RealizedVolume) RealizedVolume ,SUM(UnrealizedVolume) UnrealizedVolume ,SUM(TotalVolume) TotalVolume ,Value_Currency ValueCurrency ,SUM(PriorMarkToMarketValue) PriorMarkToMarketValue ,SUM(Mark_To_Market_Value) MarkToMarketValue ,SUM(PayoffValue) PayoffValue ,SUM(cost_value) CostValue ,SUM(RealizedProfitLossValue) RealizedProfitLossValue ,SUM(UnrealizedProfitLossValue) UnrealizedProfitLossValue ,SUM(ProfitLossValue) ProfitLossValue , Result_Use_Type ResultUseType FROM ( SELECT TP2.As_Of_Date ,TP2.Transaction_Id ,TP2.Transaction_Sub_Id ,TP2.Transaction_Leg_Id ,TP2.Value_Currency ,TP2.Settled_Payoff_Value ,TP2.Total_Payoff_Value PayoffValue ,TP2.Volume_Measure_Unit ,TP2.Settled_Volume RealizedVolume ,TP2.Unsettled_Volume UnrealizedVolume ,(TP2.Settled_Volume + TP2.Unsettled_Volume) TotalVolume ,TP2.Cost_Value ,TP1.Mark_To_Market_Value PriorMarkToMarketValue ,TP2.Mark_To_Market_Value ,(TP2.Settled_Payoff_Value - TP1.Settled_Payoff_Value) RealizedProfitLossValue ,(TP2.Unsettled_Payoff_Value - TP1.Unsettled_Payoff_Value) UnrealizedProfitLossValue ,(TP2.Mark_To_Market_Value - TP1.Mark_To_Market_Value) ProfitLossValue , TP2.Result_Use_Type FROM tran_payoff TP1, tran_payoff TP2 WHERE TP1.As_Of_Date =:AsOfDate1 AND TP2.As_Of_Date =:AsOfDate2 AND TP2.Transaction_Id = TP1.Transaction_Id AND TP2.Transaction_Sub_Id = TP1.Transaction_Sub_Id AND TP2.Transaction_Leg_Id = TP1.Transaction_Leg_Id AND TP2.Portfolio_Id = TP1.Portfolio_Id AND TP2.Portfolio_Id =:PortfolioID AND TP1.Result_Use_Type =:ResultUseType1 AND TP2.Result_Use_Type =:ResultUseType2 ) COMBO GROUP BY As_Of_Date ,Transaction_Id ,Transaction_Sub_Id ,value_currency ,volume_measure_unit , Result_Use_Type ORDER BY As_Of_Date ,Transaction_Id ,Transaction_Sub_Id ,value_currency ,volume_measure_unit , Result_Use_Type "; #endregion // return returnList; //} #endregion // foreach (TransactionBaseProfitLossView tranBaseProfitLoss in tranBaseProfitLossList) // { // TranProfitloss tranProfitLoss = new TranProfitloss(); // tranProfitLoss.AsOfDate = currentDate; // tranProfitLoss.TransactionId = Convert.ToInt32(tranBaseProfitLoss.TransactionID); // tranProfitLoss.TransactionSubId = Convert.ToInt32(tranBaseProfitLoss.TransactionSubID); // tranProfitLoss.PortfolioId = portfolioID; // tranProfitLoss.VolumeMeasureUnit = tranBaseProfitLoss.VolumeMeasureUnitID; // tranProfitLoss.RealizedVolume = tranBaseProfitLoss.RealizedVolume; // tranProfitLoss.UnrealizedVolume = tranBaseProfitLoss.UnrealizedVolume; // tranProfitLoss.TotalVolume = tranBaseProfitLoss.TotalVolume; // tranProfitLoss.ValueCurrency = tranBaseProfitLoss.ValueCurrency; // tranProfitLoss.PriorMarkToMarketValue = tranBaseProfitLoss.PriorMarkToMarketValue; // tranProfitLoss.MarkToMarketValue = tranBaseProfitLoss.MarkToMarketValue; // tranProfitLoss.PayoffValue = tranBaseProfitLoss.PayoffValue; // tranProfitLoss.CostValue = tranBaseProfitLoss.CostValue; // tranProfitLoss.RealizedProfitlossValue = tranBaseProfitLoss.RealizedProfitLossValue; // tranProfitLoss.UnrealizedProfitlossValue = tranBaseProfitLoss.UnrealizedProfitLossValue; // tranProfitLoss.ProfitlossValue = tranBaseProfitLoss.ProfitLossValue; // tranProfitLoss.ResultUseType = tranBaseProfitLoss.ResultUseType; // tranProfitLoss.CreateUid = CurrentUser.UserId; // tranProfitLoss.CreateDate = DateTime.Now; // tranProfitLossList.Add(tranProfitLoss); // } // //LOG.Warn(string.Format("Finish ComputeTransactionProfitLossByPortfolioID() , {0}", DateTime.Now)); // return tranProfitLossList; //} #endregion // transactionProfitLossTable.Add(portfolio.Id, tranProfitLossList); // } // SaveTransactionProfitLossesByTemp(computeDate, resultUseType, transactionProfitLossTable); #region SaveTransactionProfitLossesByTemp(computeDate, resultUseType, transactionProfitLossTable); //private void SaveTransactionProfitLosses(DateTime computeDate, Result_Use_Type resultUseType, Hashtable transactionProfitLossTable) //{ // //LOG.Warn(string.Format("In SaveComputedTransactionProfitLosses() , {0}", DateTime.Now)); // if (transactionProfitLossTable != null && transactionProfitLossTable.Count > 0) // { // ICollection portfoliIDKeys = transactionProfitLossTable.Keys; // //int[] portfolioIDs = new int[portfoliIDKeys.Count]; // //portfoliIDKeys.CopyTo(portfolioIDs, 0); // //int result = transactionPayoffSpringDao.DeleteByDatePortfolioIDsUseTypeID(computeDate, portfolioIDs, resultUseTypeID); // string dateFormat = computeDate.ToString("yyyy-MM-dd"); // string sql = string.Format("DELETE FROM TransactionProfitLosses WHERE AsOfDate='{0}'", dateFormat); // Framework.QueryInfo info = new Framework.QueryInfo(); // info.CustomSQL = sql; // Dao.ExecuteNonQuery(info); // string column = "AsOfDate " // + ", TransactionID " // + ", TransactionSubID " // + ", PortfolioID" // + ", VolumeMeasureUnitID" // + ", RealizedVolume" // + ", UnrealizedVolume" // + ", TotalVolume" // + ", ValueCurrencyID" // + ", PriorMarkToMarketValue" // + ", MarkToMarketValue" // + ", PayoffValue" // + ", CostValue" // + ", RealizedProfitLossValue" // + ", UnrealizedProfitLossValue" // + ", ProfitLossValue" // + ", ResultUseTypeLookupID" // + ",CreatedBy" // + ",CreateDate"; // int iCount = 0; // foreach (int portfolioID in portfoliIDKeys) // { // System.Text.StringBuilder sb = new StringBuilder(); // IList<TranProfitloss> transactionProfitLossList = (IList<TranProfitloss>)transactionProfitLossTable[portfolioID]; // iCount = 0; // if (transactionProfitLossList != null && transactionProfitLossList.Count > 0) // { // for (int i = 0; i < transactionProfitLossList.Count; i++) // { // TranProfitloss transactionProfitLoss = transactionProfitLossList[i]; // sb.Append("INSERT INTO TransactionProfitLosses(" + column + ")"); // sb.Append("VALUES('" + transactionProfitLoss.AsOfDate + "'"); // sb.Append(",'" + transactionProfitLoss.TransactionId + "'"); // sb.Append(",'" + transactionProfitLoss.TransactionSubId + "'"); // sb.Append(",'" + transactionProfitLoss.PortfolioId + "'"); // sb.Append(",'" + transactionProfitLoss.VolumeMeasureUnit + "'"); // sb.Append(",'" + transactionProfitLoss.RealizedVolume + "'"); // sb.Append(",'" + transactionProfitLoss.UnrealizedVolume + "'"); // sb.Append(",'" + transactionProfitLoss.TotalVolume + "'"); // sb.Append(",'" + transactionProfitLoss.ValueCurrency + "'"); // sb.Append(",'" + transactionProfitLoss.PriorMarkToMarketValue + "'"); // sb.Append(",'" + transactionProfitLoss.MarkToMarketValue + "'"); // sb.Append(",'" + transactionProfitLoss.PayoffValue + "'"); // sb.Append(",'" + transactionProfitLoss.CostValue + "'"); // sb.Append(",'" + transactionProfitLoss.RealizedProfitlossValue + "'"); // sb.Append(",'" + transactionProfitLoss.UnrealizedProfitlossValue + "'"); // sb.Append(",'" + transactionProfitLoss.ProfitlossValue + "'"); // sb.Append(",'" + (int)transactionProfitLoss.ResultUseType + "'"); // sb.Append(",'" + transactionProfitLoss.CreateUid + "'"); // sb.Append(",'" + transactionProfitLoss.CreateDate + "')"); // sb.Append("\r\n"); // iCount++; // if (iCount > 2000) // { // try // { // info.CustomSQL = sb.ToString(); // Dao.ExecuteNonQuery(info); // } // catch (Exception ex) // { // //LOG.Error(string.Format("ERROR - Error no Insert 1. Error message: {0}", ex.Message)); // throw; // } // iCount = 0; // sb.Clear(); // } // } // try // { // info.CustomSQL = sb.ToString(); // Dao.ExecuteNonQuery(info); // } // catch (Exception ex) // { // //LOG.Error(string.Format("ERROR - Error no Insert 2. Error message: {0}", ex.Message)); // throw; // } // } // } // transactionProfitLossTable.Clear(); // transactionProfitLossTable = null; // GC.Collect(); // GC.WaitForPendingFinalizers(); // } // //LOG.Warn(string.Format("Finish SaveComputedTransactionPayOffs() , {0}", DateTime.Now)); //} #endregion // //LOG.Warn(string.Format("Finish ComputeTransactionProfitLossByDate() , {0}", DateTime.Now)); //} #endregion #region 第4步 riskReturnComputationService.ProcessPriceReturn(CurrentUser2.UserId, CurrentUser2.UserName, computeDate,dic == null ? periodLength : (int)dic["periodLength"],dic == null ? windowSize : (int)dic["windowSize"], dic == null ? dateTimeSpan : (int)dic["dateTimeSpan"]); #region riskReturnComputationService.ProcessPriceReturn具体实现 //public void ProcessPriceReturn(string SessionId, string SessionName, DateTime computeDate, int periodLength, int windowSize, int dateTimeSpan) //{ // int totalPeriodLength = periodLength + windowSize + dateTimeSpan; // DateTime startCloseDate = computeDate.AddDays(-totalPeriodLength); // DateTime endCloseDate = computeDate; // Hashtable calculatedPriceReturnTable = ComputePriceReturn(SessionId, SessionName, computeDate, periodLength, windowSize, dateTimeSpan); #region ComputePriceReturn实现 //private Hashtable ComputePriceReturn(string SessionId, string SessionName, DateTime computeDate, int periodLength, int windowSize, int dateTimeSpan) //{ // Hashtable marketDataRiskViewTable = GetActiveMarketDataRiskViewList(computeDate, periodLength, windowSize, dateTimeSpan); #region GetActiveMarketDataRiskViewList实现 //private Hashtable GetActiveMarketDataRiskViewList(DateTime computeDate, int periodLength, int windowSize, int dateTimeSpan) //{ // //LOG.Warn(string.Format("In GetActiveMarketDataRiskViewList(), {0}", DateTime.Now)); // int totalPeriodLength = 0; // DateTime startCloseDate = new DateTime(); // DateTime endCloseDate = new DateTime(); // totalPeriodLength = periodLength + windowSize + dateTimeSpan; // startCloseDate = computeDate.AddDays(-totalPeriodLength); // endCloseDate = computeDate; // IList<MktPriceMarketData> indexPriceMarketDataViewList = indexPriceMarketDataViewService.GetActiveListByDates(startCloseDate, endCloseDate); #region indexPriceMarketDataViewService.GetActiveListByDates(startCloseDate, endCloseDate)实现 //public IList<MktPriceMarketData> GetActiveListByDates(DateTime start, DateTime endtime) //{ // Framework.QueryInfo info = new QueryInfo(); // info.Parameters.Add("StartDate", start); // info.Parameters.Add("EndDate", endtime); // var ds = Holworth.Utility.HraUtility.EntityRowMapper.ExcuteDataSet("GetPriceMarketDataSql", info); #region 执行的sql string sql2 = @" SELECT IPMD.Index_Price_Factor_ID, ipmd.index_price_factor_name ,IPMD.Close_Date ,RF.Risk_Factor_ID ,IPMD.PRICE_MARKET_DATA_ID ,IPMD.Data_Type ,ipmd.DATA_TYPE_NAME ,IPMD.Upload_Date ,IPMD.Contract_Type ,ipmd.CONTRACT_TYPE_NAME ,IPMD.Reset_Date ,IPMD.Bid_Price_Value ,IPMD.Middle_Price_Value ,IPMD.Offer_Price_Value ,IPMD. Create_Uid ,ipmd.CREATE_UNAME ,IPMD.Create_Date ,IPMD.Last_Mod_Uname ,IPMD.Last_Mod_Uid ,IPMD.Last_Mod_Datetime FROM RSK_FACTOR RF inner join MKT_INDEX_PRICE_FACTOR ipf on rf.index_price_factor_id=ipf.index_price_factor_id join mkt_price_market_data IPMD on ipmd.index_price_factor_id=ipf.index_price_factor_id WHERE RF.Active_Flag = 1 AND RF.Index_Price_Factor_Id IS NOT NULL and ipmd.close_date between :StartDate and :EndDate"; #endregion // IList<MktPriceMarketData> list = new System.Collections.Generic.List<MktPriceMarketData>(); #region 把上面的表格数据转化 IList<MktPriceMarketData> // for (var i = 0; i < ds.Tables[0].Rows.Count; i++) // { // string s = ""; // var row = ds.Tables[0].Rows[i]; // MktPriceMarketData m = new MktPriceMarketData(); // m.IndexPriceFactorId = int.Parse(row["Index_Price_Factor_ID"].ToString()); // m.IndexPriceFactorName = row["index_price_factor_name"].ToString(); // s = row["Close_Date"].ToString(); // if (!string.IsNullOrEmpty(s)) // { // m.CloseDate = DateTime.Parse(s); // } // m.RiskFactorId = int.Parse(row["Risk_Factor_ID"].ToString()); // m.Id = row["PRICE_MARKET_DATA_ID"].ToString(); // m.DataType = row["Data_Type"].ToString(); // m.DataTypeName = row["DATA_TYPE_NAME"].ToString(); // if (!string.IsNullOrEmpty(row["Upload_Date"].ToString())) // { // m.UploadDate = DateTime.Parse(row["Upload_Date"].ToString()); // } // m.ContractType = row["Contract_Type"].ToString(); // m.ContractTypeName = row["CONTRACT_TYPE_NAME"].ToString(); // if (!string.IsNullOrEmpty(row["Reset_Date"].ToString())) // { // m.ResetDate = DateTime.Parse(row["Reset_Date"].ToString()); // } // decimal a = 0; // decimal.TryParse(row["Bid_Price_Value"].ToString(), out a); // m.BidPriceValue = a; // a = 0; // decimal.TryParse(row["Bid_Price_Value"].ToString(), out a); // m.MiddlePriceValue = a; // a = 0; // decimal.TryParse(row["Offer_Price_Value"].ToString(), out a); // m.OfferPriceValue = a; // a = 0; // decimal.TryParse(row["Bid_Price_Value"].ToString(), out a); // m.BidPriceValue = a; // m.CreateUid = row["Create_Uid"].ToString(); // m.CreateUname = row["CREATE_UNAME"].ToString(); // if (!string.IsNullOrEmpty(row["Last_Mod_Datetime"].ToString())) // { // m.LastModDatetime = DateTime.Parse(row["Last_Mod_Datetime"].ToString()); // } // if (!string.IsNullOrEmpty(row["Create_Date"].ToString())) // { // m.CreateDate = DateTime.Parse(row["Create_Date"].ToString()); // } // m.LastModUid = row["Last_Mod_Uid"].ToString(); // m.LastModUname = row["Last_Mod_Uname"].ToString(); // list.Add(m); // } // return list; //} #endregion #endregion // Hashtable indexPriceDataViewTable = new Hashtable(); // //kxb怀疑此处有问题 // var indexPriceDataViews = from indexP in indexPriceMarketDataViewList // group indexP by indexP.RiskFactorId into g // select new // { // RiskFactorId = g.Key, // dataViews = g // }; // if (indexPriceDataViews != null) // { // foreach (var indexPriceDataView in indexPriceDataViews) // { // //kxb怀疑此处有问题 // List<MktPriceMarketData> indexPriceMarketDataRiskVwList = indexPriceDataView.dataViews.ToList<MktPriceMarketData>(); // indexPriceDataViewTable.Add(indexPriceDataView.RiskFactorId, indexPriceMarketDataRiskVwList); // } // } // // LOG.Warn(string.Format("Finish GetActiveMarketDataRiskViewList(), {0}", DateTime.Now)); // return indexPriceDataViewTable; //} #endregion // Hashtable computedPriceReturnTable = new Hashtable(); // ICollection riskFactorIDKeys = marketDataRiskViewTable.Keys; // foreach (int riskFactorID in riskFactorIDKeys) // { // IList<MktPriceMarketData> marketDataRiskViewList = (IList<MktPriceMarketData>)marketDataRiskViewTable[riskFactorID]; // IList<RskFactorReturnData> riskReturnDataList = ComputeRiskReturnDataByDateID(SessionId, SessionName, marketDataRiskViewList, dateTimeSpan); #region ComputeRiskReturnDataByDateID(SessionId, SessionName, marketDataRiskViewList, dateTimeSpan)实现 //public IList<RskFactorReturnData> ComputeRiskReturnDataByDateID(string SessionId1, string SessionName1, IList<MktPriceMarketData> indexPriceMarketDataRiskViewList, int dateTimeSpan) //{ // //RiskFactorReturnData riskReturn = new RiskFactorReturnData(); // IList<RskFactorReturnData> riskReturnDataList = new List<RskFactorReturnData>(); // int riskFactorID; // DateTime currentCloseDate = new DateTime(); // DateTime priorCloseDate = new DateTime(); // double currentPrice = new double(); // double priorPrice = new double(); // double priceReturn = new double(); // bool isFirstCloseDate = true; // if (indexPriceMarketDataRiskViewList.Count > 1) // { // foreach (MktPriceMarketData indexPriceData in indexPriceMarketDataRiskViewList) // { // RskFactorReturnData riskReturn = new RskFactorReturnData(); // riskFactorID = indexPriceData.RiskFactorId; // currentCloseDate = indexPriceData.CloseDate.Value; // if (!businessDateService.IsBusinessDate(currentCloseDate)) // { // continue; // } // currentPrice = (double)indexPriceData.MiddlePriceValue; // priorCloseDate = currentCloseDate.AddDays(-dateTimeSpan); // if (!isFirstCloseDate) // { // if (currentPrice > 0 && priorPrice > 0) // { // priceReturn = Math.Log(currentPrice) - Math.Log(priorPrice); // } // else // { // // LOG.Warn("There are no price return data for " + riskFactorID.ToString()); // priceReturn = -0.9999; // } // riskReturn.DataType = "1000"; // riskReturn.ComputeDate = currentCloseDate; // riskReturn.PriorCloseDate = priorCloseDate; // riskReturn.RiskReturnValue = (decimal)priceReturn; // riskReturn.RiskFactorId = riskFactorID; // riskReturn.ReturnType = HRAModel.Sys.Enum.Return_Data_Type.Return_Data_Type_Log_Differential; // riskReturn.PeriodType = HRAModel.Sys.Enum.Volume_Period_Type.Volume_Period_Type_Daily; // riskReturn.DateTimeSpan = dateTimeSpan; // riskReturn.CreateUname = SessionName1; // riskReturn.CreateDate = DateTime.Now; // riskReturn.LastModUname = SessionName1; // riskReturn.LastModDatetime = DateTime.Now; // riskReturnDataList.Add(riskReturn); // } // else // { // isFirstCloseDate = false; // } // priorPrice = currentPrice; // } // } // //LOG.Warn(string.Format("Finish ComputeRiskReturnDataByDateID(), {0}", DateTime.Now)); // return riskReturnDataList; //} #endregion // computedPriceReturnTable.Add(riskFactorID, riskReturnDataList); // } // return computedPriceReturnTable; //} #endregion // //改成文件导入形式 // Computed2PriceReturn(calculatedPriceReturnTable, startCloseDate, endCloseDate); #region Computed2PriceReturn(calculatedPriceReturnTable, startCloseDate, endCloseDate); //private void Computed2PriceReturn(Hashtable ComputedPriceReturnTable, DateTime startCloseDate, DateTime endCloseDate) //{ // //LOG.Warn(string.Format("In SaveCalculatedPriceReturn(), {0}", DateTime.Now)); // ICollection riskFactorIdKeys = ComputedPriceReturnTable.Keys; // int[] riskFactorIDArray = riskFactorIdKeys.Cast<int>().ToArray(); // // RiskFactorReturnDataSpringDao riskFactorReturnDataSpringDao = (RiskFactorReturnDataSpringDao)DaoFactory.CreateDao("RiskFactorReturnData"); // Framework.QueryInfo info = new Framework.QueryInfo(); // if (riskFactorIDArray.Length > 0) // { // info.Parameters.Add("RiskFactorID", riskFactorIDArray); // } // else // { // int[] a = { 0 }; // info.Parameters.Add("RiskFactorID", a); // } // info.Parameters.Add("StartDate", startCloseDate); // info.Parameters.Add("EndDate", endCloseDate); // info.CustomSQL = Holworth.Utility.HraUtility.EntityRowMapper.getSql("//data//GetRiskReturnDataSql//deleteByStartDateIDsSQL"); // int result = Dao.ExecuteUpdate(info); // // 1. delete all existing risk factor return data for these riskFactorIDs within the date range // // int result = riskFactorReturnDataSpringDao.DeleteListByStartDateIDs(riskFactorIDArray, startCloseDate, endCloseDate); // // 2. save all the riskfactor return data // System.Collections.ArrayList list = new ArrayList(); // foreach (int indexPriceFactorID in riskFactorIdKeys) // { // IList<RskFactorReturnData> riskReturnDataList = (IList<RskFactorReturnData>)ComputedPriceReturnTable[indexPriceFactorID]; // for (var i = 0; i < riskReturnDataList.Count; i++) // { // RskFactorReturnData riskFactorReturnData = riskReturnDataList[i]; // riskFactorReturnData.Id = ""; // riskFactorReturnData.CreateUname = CurrentUser.UserName; // riskFactorReturnData.CreateUid = CurrentUser.UserId; // riskFactorReturnData.CreateOid = CurrentUser.OfficeId; // riskFactorReturnData.CreateDate = DateTime.Now; // riskFactorReturnData.CreatePid = CurrentUser.PositionId; // riskFactorReturnData.LastModDatetime = DateTime.Now; // riskFactorReturnData.LastModOid = CurrentUser.OfficeId; // riskFactorReturnData.LastModUname = CurrentUser.UserName; // riskFactorReturnData.LastModUid = CurrentUser.UserId; // riskFactorReturnData.LastModOid = CurrentUser.OfficeId; // //riskFactorReturnData.RiskReturnValue = decimal.Round((decimal) riskFactorReturnData.RiskReturnValue, 2); // riskFactorReturnData.State.MarkNew(); // list.Add(riskFactorReturnData); // } // } // if (list.Count > 0) // { // Dao.SaveOrUpdateAll(list); // } //} #endregion //} #endregion #endregion } } }