Ejemplo n.º 1
0
        private static PresentValue ReadPresentValue(EntryObject o)
        {
            foreach (String property in s_Properties.Except(s_PropertiesAmount.Union(s_PropertiesCommon).Union(s_PropertiesTrade).Union(s_PropertiesModel)))
            {
                if (!String.IsNullOrEmpty((String)o.GetType().GetProperty(property)?.GetValue(o)))
                {
                    throw new InvalidDataException($"The CRIF file cannot specify the {property} property for PV entries.");
                }
            }

            if (!Enum.TryParse(o.ProductClass, out Schedule.Product product))
            {
                throw new InvalidDataException("The CRIF file contains a PV entry with an invalid ProductClass property.");
            }

            Amount          amount          = ReadAmount(o);
            RegulationsInfo regulationsInfo = ReadRegulationsInfo(o);
            TradeInfo       tradeInfo       = ReadTradeInfo(o);

            return(PresentValue.OfUnchecked(product, amount, regulationsInfo, tradeInfo));
        }
        private bool ReValidate(RegulationsInfo regulate)
        {
            bool          result = true;
            StringBuilder errmsg = new StringBuilder();

            if (string.IsNullOrEmpty(regulate.RULESNAME))
            {
                errmsg.Append("名称不能为空! \r");
                result = false;
            }
            if (string.IsNullOrEmpty(regulate.DRAFTPERSON))
            {
                errmsg.Append("起草人不能为空! \r");
                result = false;
            }
            if (!string.IsNullOrEmpty(errmsg.ToString()))
            {
                MessageBox.Show(errmsg.ToString(), "验证失败", MessageBoxButton.OKCancel);
            }
            return(result);
        }
Ejemplo n.º 3
0
        private static AddOnNotional ReadAddOnNotional(EntryObject o)
        {
            foreach (String property in s_Properties.Except(s_PropertiesAmount.Union(s_PropertiesCommon).Union(s_PropertiesTrade)))
            {
                if (!String.IsNullOrEmpty((String)o.GetType().GetProperty(property)?.GetValue(o)))
                {
                    throw new InvalidDataException($"The CRIF file cannot specify the {property} property for Notional entries.");
                }
            }

            if (!DataValidator.IsValidNotionalQualifier(o.Qualifier))
            {
                throw new InvalidDataException("The CRIF file contains a Notional entry with an invalid Qualifier property.");
            }

            Amount          amount          = ReadAmount(o);
            RegulationsInfo regulationsInfo = ReadRegulationsInfo(o);
            TradeInfo       tradeInfo       = ReadTradeInfo(o);

            return(AddOnNotional.OfUnchecked(o.Qualifier, amount, regulationsInfo, tradeInfo));
        }
Ejemplo n.º 4
0
 private void dgList_MouseLeftButtonUp_1(object sender, MouseButtonEventArgs e)
 {
     regulate = dgList.SelectedItem as RegulationsInfo;
     if (regulate == null)
     {
         return;//防止单击空白或标题等触发该事件
     }
     if (regulate.IsChecked == true)
     {
         regulate.IsChecked = false;
         currentRegulateList.Remove(regulate);
     }
     else
     {
         regulate.IsChecked = true;
         currentRegulateList.Add(regulate);
     }
     #region 判断全选和保存状态
     bool checkedState = regulate.IsChecked;
     int  ischeckCount = (dgList.ItemsSource as List <RegulationsInfo>).Count(p => p.IsChecked == true);
     if (ischeckCount == 1 || ischeckCount == 0)
     {
         btnSave.IsEnabled = true;
     }
     else
     {
         btnSave.IsEnabled = false;
     }
     foreach (RegulationsInfo result in dgList.ItemsSource)
     {
         if (result.IsChecked != checkedState)
         {
             this.chkAll.IsChecked = null;
             return;
         }
     }
     chkAll.IsChecked = checkedState;
     #endregion
 }
Ejemplo n.º 5
0
 private AddOnNotionalFactor(String qualifier, Decimal factor, RegulationsInfo regulationsInfo) : base(factor, regulationsInfo)
 {
     m_Qualifier = qualifier;
 }
Ejemplo n.º 6
0
 private AddOnFixedAmount(Amount amount, RegulationsInfo regulationsInfo) : base(amount, regulationsInfo, TradeInfo.Empty)
 {
 }
        /// <summary>
        /// 保存操作
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            //if (currentFileList == null || currentFileList.Count() == 0)
            //{
            //    MessageBox.Show("请上传附件");
            //    return;
            //}
            RegulationsInfo regulate = new RegulationsInfo();

            if (isAddOrUpdate == 0)
            {
                //新增
                regulate.GUID          = CO_IA.Client.Utility.NewGuid();
                regulate.ACTIVITY_GUID = activityId;//活动id
            }
            else
            {
                //修改
                regulate.GUID          = currentRegulate.GUID.ToString();
                regulate.ACTIVITY_GUID = currentRegulate.ACTIVITY_GUID; //活动id
            }
            regulate.RULESNAME = RuleName.Text;                         //名称
            regulate.SENDSTATE = checkresult;                           //发布状态

            regulate.DRAFTPERSON = drawupPerson.Text;                   //起草人
            if (dpDraft.SelectedDate != null)
            {
                regulate.DRAFTDATE = Convert.ToDateTime(dpDraft.SelectedDate); //起草时间
            }
            regulate.AUDITINGPERSON = Auditing.Text;                           //审核人
            if (dpAuditing.SelectedDate != null)
            {
                regulate.AUDITINGDATE = Convert.ToDateTime(dpAuditing.SelectedDate); //审核时间
            }
            regulate.ISSUEPERSON = Sender.Text;                                      //发布人
            regulate.ISSUEDATE   = Convert.ToDateTime(dpSend.SelectedDate);          //发布时间

            regulate.SUMMARY   = tbSynopsis.Text;                                    //简介
            regulate.RULETYPER = 0;                                                  //规章制度

            regulate.SENDSTATE = checkresult;                                        //发布状态
            regulate.RULESNAME = RuleName.Text;                                      //名称
            regulate.SENDSTATE = checkresult;                                        //发布状态
            regulate.RuleFiles = currentFileList;                                    //附件列表
            currentRegulate    = regulate;
            if (!ReValidate(currentRegulate))
            {
                return;
            }
            PT_BS_Service.Client.Framework.BeOperationInvoker.Invoke <I_CO_IA.RuleAndFileManage.I_CO_IA_RuleAndFile>
                (channel =>
            {
                try
                {
                    if (isAddOrUpdate == 0)
                    {
                        bool isResult = channel.SaveRegulationsInfo(currentRegulate);
                        if (isResult == true)
                        {
                            if (dgList.ItemsSource != null)
                            {
                                foreach (RuleFile rulefile in dgList.ItemsSource)
                                {
                                    rulefile.GUID     = CO_IA.Client.Utility.NewGuid();
                                    rulefile.MAINGUID = currentRegulate.GUID;
                                    bool isaddfile    = channel.SaveRulesFile(rulefile);  //添加附件
                                    if (isaddfile == false)
                                    {
                                        //删除客户端缓存的附件
                                        string savePath = FileManageHelper.GetPath() + rulefile.FILEFORM.ToString();
                                        string xpsPath  = savePath.Substring(0, savePath.LastIndexOf(".")).ToString() + ".xps";
                                        if (System.IO.File.Exists(savePath))
                                        {
                                            System.IO.File.Delete(savePath);
                                            System.IO.File.Delete(xpsPath);
                                        }
                                    }
                                }
                            }
                        }
                    }
                    else
                    {
                        bool isupdateResutl = channel.UpdateRegulationsInfo(currentRegulate);
                        if (isupdateResutl == true)
                        {
                            RuleFile[] rulefiles = FileManageHelper.GetRuleFiles(currentRegulate.GUID);
                            //删除附件
                            if (rulefiles != null && rulefiles.Count() > 0)
                            {
                                //List<RulesFiile> OriginalrulefileList = rulefiles.Where(r => r.MAINGUID == currentRegulate.GUID).ToList();
                                bool deleteServerFils = channel.DeleteRulesFileMainID(currentRegulate.GUID);
                                if (deleteServerFils == true)
                                {
                                    foreach (RuleFile file in rulefiles)
                                    {
                                        //删除客户端缓存的附件
                                        string savePath = FileManageHelper.GetPath() + file.FILEFORM.ToString();
                                        string xpsPath  = savePath.Substring(0, savePath.LastIndexOf(".")).ToString() + ".xps";
                                        if (System.IO.File.Exists(savePath))
                                        {
                                            System.IO.File.Delete(savePath);
                                            System.IO.File.Delete(xpsPath);
                                        }
                                    }
                                }
                            }
                            if (dgList.ItemsSource != null)
                            {
                                foreach (RuleFile rulefile in dgList.ItemsSource)
                                {
                                    rulefile.GUID     = CO_IA.Client.Utility.NewGuid();
                                    rulefile.MAINGUID = currentRegulate.GUID;
                                    channel.SaveRulesFile(rulefile);     //添加附件
                                }
                            }
                            MessageBox.Show("修改成功!", "提示", MessageBoxButton.OK);
                        }
                    }
                }
                catch (Exception ex)
                {
                    //MessageBox.Show(ex.GetExceptionMessage());
                }
            });

            if (AfterSaveEvent != null)
            {
                AfterSaveEvent();
            }
            this.Close();
        }
Ejemplo n.º 8
0
 internal static PresentValue OfUnchecked(Product product, Amount amount, RegulationsInfo regulationsInfo, TradeInfo tradeInfo)
 {
     return(new PresentValue(product, amount, regulationsInfo, tradeInfo));
 }
Ejemplo n.º 9
0
 private AddOnNotional(String qualifier, Amount amount, RegulationsInfo regulationsInfo, TradeInfo tradeInfo) : base(amount, regulationsInfo, tradeInfo)
 {
     m_Qualifier = qualifier;
 }
Ejemplo n.º 10
0
 internal static AddOnProductMultiplier OfUnchecked(Product product, Decimal multiplier, RegulationsInfo regulationsInfo)
 {
     return(new AddOnProductMultiplier(product, multiplier, regulationsInfo));
 }
Ejemplo n.º 11
0
        private static Sensitivity ParseSensitivityCreditQualifying(EntryObject o)
        {
            if (!Enum.TryParse(o.ProductClass, out Model.Product product))
            {
                throw new InvalidDataException($"The CRIF file contains a {o.RiskType} entry with an invalid ProductClass property.");
            }

            if (product != Model.Product.Credit)
            {
                throw new InvalidDataException($"The CRIF file contains a {o.RiskType} entry associated to a product class other than {Model.Product.Credit}.");
            }

            if (!BucketCreditQualifying.TryParse(o.Bucket, out BucketCreditQualifying bucket))
            {
                throw new InvalidDataException($"The CRIF file contains a {o.RiskType} entry with an invalid Bucket property.");
            }

            if (!Tenor.TryParse(o.Label1, out Tenor tenor))
            {
                throw new InvalidDataException($"The CRIF file contains a {o.RiskType} entry with an invalid Label1 property.");
            }

            if (!tenor.IsCreditTenor)
            {
                throw new InvalidDataException($"The CRIF file contains a {o.RiskType} entry associated to an improper tenor (accepted tenors are: {String.Join(", ", Tenor.Values.Where(x => x.IsCreditTenor).Select(x => x.Name))}).");
            }

            Amount          amount          = ReadAmount(o);
            RegulationsInfo regulationsInfo = ReadRegulationsInfo(o);
            TradeInfo       tradeInfo       = ReadTradeInfo(o);

            if (o.RiskType == "Risk_CreditQ")
            {
                if (!DataValidator.IsValidQualifier(o.Qualifier, true))
                {
                    throw new InvalidDataException($"The CRIF file contains a {o.RiskType} entry with an invalid Qualifier property.");
                }

                Boolean securitization;

                if (String.IsNullOrEmpty(o.Label2))
                {
                    securitization = false;
                }
                else if (o.Label2 == "Sec")
                {
                    securitization = true;
                }
                else
                {
                    throw new InvalidDataException("The CRIF file contains a Risk_CreditQ entry with an invalid Label2 property.");
                }

                return(Sensitivity.CreditQualifyingDelta(o.Qualifier, bucket, tenor, securitization, amount, regulationsInfo, tradeInfo));
            }

            if (!String.IsNullOrEmpty(o.Label2))
            {
                throw new InvalidDataException("The CRIF file cannot specify the Label2 property for Risk_CreditVol entries.");
            }

            return(Sensitivity.CreditQualifyingVega(o.Qualifier, bucket, tenor, amount, regulationsInfo, tradeInfo));
        }
Ejemplo n.º 12
0
        private static RegulationsInfo ReadRegulationsInfo(EntryObject o)
        {
            if (o.CollectRegulations == null)
            {
                throw new InvalidDataException($"The CRIF file contains a {o.RiskType} entry with an invalid CollectRegulations property.");
            }

            if (o.PostRegulations == null)
            {
                throw new InvalidDataException($"The CRIF file contains a {o.RiskType} entry with an invalid PostRegulations property.");
            }

            List <Regulation> collectRegulations;

            if (DataValidator.BlankRegulations(o.CollectRegulations))
            {
                collectRegulations = new List <Regulation>(0);
            }
            else if (DataValidator.FilledRegulations(o.CollectRegulations))
            {
                List <String> collectRegulationsTokens = o.CollectRegulations
                                                         .Split(',')
                                                         .Select(x => String.Concat(x.Substring(0, 1), x.Substring(1).ToLowerInvariant()))
                                                         .ToList();

                collectRegulations = new List <Regulation>(collectRegulationsTokens.Count);

                foreach (String collectRegulationsToken in collectRegulationsTokens)
                {
                    if (!Enum.TryParse(collectRegulationsToken, out Regulation regulation))
                    {
                        throw new InvalidDataException($"The CRIF file contains a {o.RiskType} entry with one or more invalid items in the CollectRegulations property.");
                    }

                    if (collectRegulations.Contains(regulation))
                    {
                        throw new InvalidDataException($"The CRIF file contains a {o.RiskType} entry with one or more duplicate items in the CollectRegulations property.");
                    }

                    collectRegulations.Add(regulation);
                }
            }
            else
            {
                throw new InvalidDataException($"The CRIF file contains a {o.RiskType} entry with an invalid CollectRegulations property.");
            }

            List <Regulation> postRegulations;

            if (DataValidator.BlankRegulations(o.PostRegulations))
            {
                postRegulations = new List <Regulation>(0);
            }
            else if (DataValidator.FilledRegulations(o.PostRegulations))
            {
                List <String> postRegulationsTokens = o.PostRegulations
                                                      .Split(',')
                                                      .Select(x => String.Concat(x.Substring(0, 1), x.Substring(1).ToLowerInvariant()))
                                                      .ToList();

                postRegulations = new List <Regulation>(postRegulationsTokens.Count);

                foreach (String postRegulationsToken in postRegulationsTokens)
                {
                    if (!Enum.TryParse(postRegulationsToken, out Regulation regulation))
                    {
                        throw new InvalidDataException($"The CRIF file contains a {o.RiskType} entry with one or more invalid items in the PostRegulations property.");
                    }

                    if (postRegulations.Contains(regulation))
                    {
                        throw new InvalidDataException($"The CRIF file contains a {o.RiskType} entry with one or more duplicate items in the PostRegulations property.");
                    }

                    postRegulations.Add(regulation);
                }
            }
            else
            {
                throw new InvalidDataException($"The CRIF file contains a {o.RiskType} entry with an invalid PostRegulations property.");
            }

            return(RegulationsInfo.OfUnchecked(collectRegulations, postRegulations));
        }
Ejemplo n.º 13
0
 internal static Notional OfUnchecked(Product product, Amount amount, RegulationsInfo regulationsInfo, TradeInfo tradeInfo)
 {
     return(new Notional(product, amount, regulationsInfo, tradeInfo));
 }
Ejemplo n.º 14
0
 private Notional(Product product, Amount amount, RegulationsInfo regulationsInfo, TradeInfo tradeInfo) : base(amount, regulationsInfo, tradeInfo)
 {
     m_Product = product;
 }
Ejemplo n.º 15
0
 internal static AddOnNotionalFactor OfUnchecked(String qualifier, Decimal factor, RegulationsInfo regulationsInfo)
 {
     return(new AddOnNotionalFactor(qualifier, factor, regulationsInfo));
 }
Ejemplo n.º 16
0
 private AddOnProductMultiplier(Product product, Decimal multiplier, RegulationsInfo regulationsInfo) : base(multiplier, regulationsInfo)
 {
     m_Product = product;
 }
Ejemplo n.º 17
0
        private static Sensitivity ReadSensitivityInterestRate(EntryObject o)
        {
            if (!Enum.TryParse(o.ProductClass, out Model.Product product))
            {
                throw new InvalidDataException($"The CRIF file contains a {o.RiskType} entry with an invalid ProductClass property.");
            }

            if (product != Model.Product.RatesFx)
            {
                throw new InvalidDataException($"The CRIF file contains a {o.RiskType} entry associated to a product class other than {Model.Product.RatesFx}.");
            }

            if (!Currency.TryParse(o.Qualifier, out Currency currency))
            {
                throw new InvalidDataException($"The CRIF file contains a {o.RiskType} entry with an invalid Qualifier property.");
            }

            if (!Tenor.TryParse(o.Label1, out Tenor tenor))
            {
                throw new InvalidDataException($"The CRIF file contains a {o.RiskType} entry with an invalid Label1 property.");
            }

            Amount          amount          = ReadAmount(o);
            RegulationsInfo regulationsInfo = ReadRegulationsInfo(o);
            TradeInfo       tradeInfo       = ReadTradeInfo(o);

            if (o.RiskType == "Risk_IRCurve")
            {
                if (String.IsNullOrEmpty(o.Bucket))
                {
                    throw new InvalidDataException("The CRIF file contains a Risk_IRCurve entry with an invalid Bucket property.");
                }

                String currencyVolatility = ((Int32)currency.Volatility + 1).ToString();

                if (o.Bucket != currencyVolatility)
                {
                    throw new InvalidDataException($"The CRIF file contains a Risk_IRCurve entry with mismatching currency volatility and volatility bucket (for {currency} the Bucket property must be set to {currencyVolatility}).");
                }

                o.Label2 = DataValidator.FormatLibor(o.Label2, true);

                if (!Enum.TryParse(o.Label2, out Curve curve))
                {
                    throw new InvalidDataException("The CRIF file contains a Risk_IRCurve entry with an invalid Label2 property.");
                }

                if ((currency != Currency.Usd) && ((curve == Curve.Municipal) || (curve == Curve.Prime)))
                {
                    throw new InvalidDataException($"The CRIF file contains a {o.RiskType} entry with a {curve} curve associated to a currency other than {Currency.Usd}.");
                }

                return(Sensitivity.InterestRateDelta(currency, tenor, curve, amount, regulationsInfo, tradeInfo));
            }

            if (!String.IsNullOrEmpty(o.Bucket) || !String.IsNullOrEmpty(o.Label2))
            {
                throw new InvalidDataException("The CRIF file cannot specify Bucket and Label2 properties for Risk_IRVol entries.");
            }

            return(Sensitivity.InterestRateVega(currency, tenor, amount, regulationsInfo, tradeInfo));
        }
Ejemplo n.º 18
0
 internal static AddOnFixedAmount OfUnchecked(Amount amount, RegulationsInfo regulationsInfo)
 {
     return(new AddOnFixedAmount(amount, regulationsInfo));
 }
Ejemplo n.º 19
0
        private static ReadOnlyCollection <DataEntity> CreateDataEntities()
        {
            DateTime today        = DateTime.Today;
            DateTime todayPlus3M  = today.AddMonths(3);
            DateTime todayPlus4Y  = today.AddYears(4);
            DateTime todayPlus10Y = today.AddYears(10);

            Int32 tradeId = 0;

            RegulationsInfo ri = RegulationsInfo.Of(Regulation.Cftc);

            List <DataEntity> dataEntities = new List <DataEntity>
            {
                // Model - Sensitivities - Base Correlation
                Sensitivity.BaseCorrelation("CDX HY", Amount.Of(Currency.Usd, 200000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.BaseCorrelation("CDX HY", Amount.Of(Currency.Usd, -300000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.BaseCorrelation("CDX IG", Amount.Of(Currency.Usd, 100000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.BaseCorrelation("iTraxx XO", Amount.Of(Currency.Usd, 450000m), ri, CreateTradeInfoModel(++tradeId)),

                // Model - Sensitivities - Delta - Commodity
                Sensitivity.CommodityDelta("Coal Americas", BucketCommodity.Bucket1, Amount.Of(Currency.Usd, 3000000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.CommodityDelta("Coal Europe", BucketCommodity.Bucket1, Amount.Of(Currency.Usd, -5000000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.CommodityDelta("Middle Distillates America", BucketCommodity.Bucket3, Amount.Of(Currency.Usd, 15000000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.CommodityDelta("Middle Distillates Europe", BucketCommodity.Bucket3, Amount.Of(Currency.Usd, -20000000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.CommodityDelta("Middle Distillates Asia", BucketCommodity.Bucket3, Amount.Of(Currency.Usd, 32000000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.CommodityDelta("NA Natural Gas Gulf Coast", BucketCommodity.Bucket6, Amount.Of(Currency.Usd, 6500000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.CommodityDelta("NA Natural Gas West", BucketCommodity.Bucket6, Amount.Of(Currency.Usd, 4000000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.CommodityDelta("Freight Wet", BucketCommodity.Bucket10, Amount.Of(Currency.Usd, 35000000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.CommodityDelta("Freight Dry", BucketCommodity.Bucket10, Amount.Of(Currency.Usd, -10000000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.CommodityDelta("Softs Coffee", BucketCommodity.Bucket14, Amount.Of(Currency.Usd, 2500000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.CommodityDelta("Livestock Feeder Cattle", BucketCommodity.Bucket15, Amount.Of(Currency.Usd, -1200000m), ri, CreateTradeInfoModel(++tradeId)),

                // Model - Sensitivities - Delta - Credit Qualifying
                Sensitivity.CreditQualifyingDelta("ISIN:US3949181045", BucketCreditQualifying.Bucket1, Tenor.Y2, false, Amount.Of(Currency.Usd, 100000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.CreditQualifyingDelta("ISIN:US3949181045", BucketCreditQualifying.Bucket1, Tenor.Y5, false, Amount.Of(Currency.Usd, -1500000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.CreditQualifyingDelta("ISIN:US3949181045", BucketCreditQualifying.Bucket1, Tenor.Y3, false, Amount.Of(Currency.Usd, 1450000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.CreditQualifyingDelta("ISIN:XS1061333921", BucketCreditQualifying.Bucket1, Tenor.Y10, false, Amount.Of(Currency.Usd, 400000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.CreditQualifyingDelta("ISIN:CH0419041295", BucketCreditQualifying.Bucket4, Tenor.Y1, true, Amount.Of(Currency.Usd, -650000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.CreditQualifyingDelta("ISIN:JP1718441K71", BucketCreditQualifying.Bucket4, Tenor.Y1, false, Amount.Of(Currency.Usd, 200000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.CreditQualifyingDelta("ISIN:RU000A100H37", BucketCreditQualifying.Bucket7, Tenor.Y2, false, Amount.Of(Currency.Usd, -100000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.CreditQualifyingDelta("ISIN:RU000A100H37", BucketCreditQualifying.Bucket7, Tenor.Y3, false, Amount.Of(Currency.Usd, 150000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.CreditQualifyingDelta("ISIN:XS1886258598", BucketCreditQualifying.Bucket7, Tenor.Y1, false, Amount.Of(Currency.Usd, -120000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.CreditQualifyingDelta("ISIN:XS1120672716", BucketCreditQualifying.Bucket7, Tenor.Y2, false, Amount.Of(Currency.Usd, 330000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.CreditQualifyingDelta("ISIN:GB0702134646", BucketCreditQualifying.Bucket11, Tenor.Y2, false, Amount.Of(Currency.Usd, 1000000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.CreditQualifyingDelta("ISIN:GB0702134646", BucketCreditQualifying.Bucket11, Tenor.Y10, false, Amount.Of(Currency.Usd, -475000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.CreditQualifyingDelta("ISIN:GB0702134646", BucketCreditQualifying.Bucket11, Tenor.Y3, false, Amount.Of(Currency.Usd, -500000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.CreditQualifyingDelta("ISIN:FR0003504418", BucketCreditQualifying.BucketResidual, Tenor.Y2, false, Amount.Of(Currency.Usd, 400000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.CreditQualifyingDelta("ISIN:XS2023221601", BucketCreditQualifying.BucketResidual, Tenor.Y10, false, Amount.Of(Currency.Usd, -300000m), ri, CreateTradeInfoModel(++tradeId)),

                // Model - Sensitivities - Delta - Credit Non-qualifying
                Sensitivity.CreditNonQualifyingDelta("ISIN:US3949181045", BucketCreditNonQualifying.Bucket1, Tenor.Y3, Amount.Of(Currency.Usd, 300000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.CreditNonQualifyingDelta("ISIN:US3949181045", BucketCreditNonQualifying.Bucket1, Tenor.Y5, Amount.Of(Currency.Usd, 700000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.CreditNonQualifyingDelta("ISIN:XS1061333921", BucketCreditNonQualifying.Bucket1, Tenor.Y2, Amount.Of(Currency.Usd, -500000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.CreditNonQualifyingDelta("ISIN:XS1980681200", BucketCreditNonQualifying.Bucket2, Tenor.Y1, Amount.Of(Currency.Usd, -220000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.CreditNonQualifyingDelta("ISIN:XS1980681200", BucketCreditNonQualifying.Bucket2, Tenor.Y10, Amount.Of(Currency.Usd, 200000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.CreditNonQualifyingDelta("ISIN:DE000HVB34J9", BucketCreditNonQualifying.Bucket2, Tenor.Y2, Amount.Of(Currency.Usd, 800000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.CreditNonQualifyingDelta("ISIN:FR0003507418", BucketCreditNonQualifying.BucketResidual, Tenor.Y5, Amount.Of(Currency.Usd, 300000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.CreditNonQualifyingDelta("ISIN:XS2023221601", BucketCreditNonQualifying.BucketResidual, Tenor.Y3, Amount.Of(Currency.Usd, -270000m), ri, CreateTradeInfoModel(++tradeId)),

                // Model - Sensitivities - Delta - Equity
                Sensitivity.EquityDelta("ISIN:XS1980681200", BucketEquity.Bucket2, Amount.Of(Currency.Usd, 200000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.EquityDelta("ISIN:DE000HVB34J9", BucketEquity.Bucket2, Amount.Of(Currency.Usd, 500000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.EquityDelta("ISIN:DE000TK0T291", BucketEquity.Bucket5, Amount.Of(Currency.Usd, -1000000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.EquityDelta("ISIN:DE000FF2AKA7", BucketEquity.Bucket5, Amount.Of(Currency.Usd, 3300000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.EquityDelta("ISIN:XS1896686544", BucketEquity.Bucket5, Amount.Of(Currency.Usd, 500000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.EquityDelta("ISIN:BE5631439402", BucketEquity.Bucket9, Amount.Of(Currency.Usd, 100000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.EquityDelta("ISIN:XS1006556794", BucketEquity.Bucket10, Amount.Of(Currency.Usd, 50000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.EquityDelta("ISIN:GB02BALKJB79", BucketEquity.Bucket10, Amount.Of(Currency.Usd, -150000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.EquityDelta("FTSE100", BucketEquity.Bucket11, Amount.Of(Currency.Usd, 600000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.EquityDelta("S&P500", BucketEquity.Bucket11, Amount.Of(Currency.Usd, -450000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.EquityDelta("ISIN:FR0003504418", BucketEquity.BucketResidual, Amount.Of(Currency.Usd, -75000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.EquityDelta("ISIN:XS2023221601", BucketEquity.BucketResidual, Amount.Of(Currency.Usd, 56000m), ri, CreateTradeInfoModel(++tradeId)),

                // Model - Sensitivities - Delta - FX
                Sensitivity.FxDelta(Currency.Eur, Amount.Of(Currency.Usd, 10000000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.FxDelta(Currency.Eur, Amount.Of(Currency.Usd, -10000000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.FxDelta(Currency.Nok, Amount.Of(Currency.Usd, 200000000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.FxDelta(Currency.Mru, Amount.Of(Currency.Usd, 60000000m), ri, CreateTradeInfoModel(++tradeId)),

                // Model - Sensitivities - Delta - Rates - Cross-currency Basis
                Sensitivity.CrossCurrencyBasis(Currency.Gbp, Amount.Of(Currency.Usd, -15000000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.CrossCurrencyBasis(Currency.Usd, Amount.Of(Currency.Usd, 10000000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.CrossCurrencyBasis(Currency.Usd, Amount.Of(Currency.Usd, 10000000m), ri, CreateTradeInfoModel(++tradeId)),

                // Sensitivities - Delta - Rates - Inflation
                Sensitivity.InflationDelta(Currency.Cad, Amount.Of(Currency.Usd, 3000000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.InflationDelta(Currency.Gbp, Amount.Of(Currency.Usd, -10000000m), ri, CreateTradeInfoModel(++tradeId)),

                // Model - Sensitivities - Delta - Rates - Interest Rate
                Sensitivity.InterestRateDelta(Currency.Gbp, Tenor.Y5, Curve.Libor6M, Amount.Of(Currency.Usd, -5000000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.InterestRateDelta(Currency.Gbp, Tenor.M6, Curve.Ois, Amount.Of(Currency.Usd, 20000000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.InterestRateDelta(Currency.Gbp, Tenor.Y2, Curve.Ois, Amount.Of(Currency.Usd, 30000000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.InterestRateDelta(Currency.Jpy, Tenor.Y10, Curve.Libor3M, Amount.Of(Currency.Usd, 9000000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.InterestRateDelta(Currency.Jpy, Tenor.Y20, Curve.Libor3M, Amount.Of(Currency.Usd, 1000000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.InterestRateDelta(Currency.Inr, Tenor.W2, Curve.Ois, Amount.Of(Currency.Usd, -2000000m), ri, CreateTradeInfoModel(++tradeId)),

                // Model - Sensitivities - Vega - Commodity
                Sensitivity.CommodityVega("Precious Metals Silver", BucketCommodity.Bucket12, Tenor.W2, Amount.Of(Currency.Usd, 3500000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.CommodityVega("Precious Metals Silver", BucketCommodity.Bucket12, Tenor.Y5, Amount.Of(Currency.Usd, -3200000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.CommodityVega("Precious Metals Gold", BucketCommodity.Bucket12, Tenor.M6, Amount.Of(Currency.Usd, 1500000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.CommodityVega("EU Power Germany", BucketCommodity.Bucket9, Tenor.Y1, Amount.Of(Currency.Usd, 1000000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.CommodityVega("EU Power Germany", BucketCommodity.Bucket9, Tenor.W2, Amount.Of(Currency.Usd, 4500000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.CommodityVega("Crude Oil Americas", BucketCommodity.Bucket2, Tenor.Y15, Amount.Of(Currency.Usd, -1500000m), ri, CreateTradeInfoModel(++tradeId)),

                // Model - Sensitivities - Vega - Credit Qualifying
                Sensitivity.CreditQualifyingVega("EU.HY", BucketCreditQualifying.BucketResidual, Tenor.Y5, Amount.Of(Currency.Usd, -4000000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.CreditQualifyingVega("EU.IG", BucketCreditQualifying.BucketResidual, Tenor.Y1, Amount.Of(Currency.Usd, 1500000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.CreditQualifyingVega("EU.IG", BucketCreditQualifying.Bucket2, Tenor.Y2, Amount.Of(Currency.Usd, 3000000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.CreditQualifyingVega("EU.IG", BucketCreditQualifying.Bucket2, Tenor.Y2, Amount.Of(Currency.Usd, -2000000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.CreditQualifyingVega("US.HY", BucketCreditQualifying.Bucket7, Tenor.Y10, Amount.Of(Currency.Usd, 3500000m), ri, CreateTradeInfoModel(++tradeId)),

                // Model - Sensitivities - Vega - Credit Non-qualifying
                Sensitivity.CreditNonQualifyingVega("EU.HY", BucketCreditNonQualifying.BucketResidual, Tenor.Y3, Amount.Of(Currency.Usd, 1200000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.CreditNonQualifyingVega("EU.IG", BucketCreditNonQualifying.Bucket1, Tenor.Y2, Amount.Of(Currency.Usd, -2300000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.CreditNonQualifyingVega("EU.IG", BucketCreditNonQualifying.BucketResidual, Tenor.Y3, Amount.Of(Currency.Usd, 4000000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.CreditNonQualifyingVega("EU.IG", BucketCreditNonQualifying.BucketResidual, Tenor.Y1, Amount.Of(Currency.Usd, -3500000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.CreditNonQualifyingVega("US.HY", BucketCreditNonQualifying.BucketResidual, Tenor.Y10, Amount.Of(Currency.Usd, -2600000m), ri, CreateTradeInfoModel(++tradeId)),

                // Model - Sensitivities - Vega - Equity
                Sensitivity.EquityVega("ISIN:US3949181045", BucketEquity.Bucket1, Tenor.Y5, Amount.Of(Currency.Usd, 2000000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.EquityVega("ISIN:US3949181045", BucketEquity.Bucket1, Tenor.Y2, Amount.Of(Currency.Usd, -1800000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.EquityVega("ISIN:US3949181045", BucketEquity.Bucket1, Tenor.W2, Amount.Of(Currency.Usd, 6000000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.EquityVega("ISIN:CH0419041295", BucketEquity.Bucket4, Tenor.Y3, Amount.Of(Currency.Usd, 5000000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.EquityVega("ISIN:DE000HVB34J9", BucketEquity.Bucket4, Tenor.Y10, Amount.Of(Currency.Usd, -4500000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.EquityVega("ISIN:RU000A100H37", BucketEquity.Bucket7, Tenor.Y20, Amount.Of(Currency.Usd, -2700000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.EquityVega("VIX", BucketEquity.Bucket12, Tenor.Y15, Amount.Of(Currency.Usd, -1500000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.EquityVega("ISIN:FR0003504418", BucketEquity.BucketResidual, Tenor.M6, Amount.Of(Currency.Usd, 3000000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.EquityVega("ISIN:FR0003504418", BucketEquity.BucketResidual, Tenor.M1, Amount.Of(Currency.Usd, -3200000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.EquityVega("ISIN:XS2023221601", BucketEquity.BucketResidual, Tenor.M3, Amount.Of(Currency.Usd, 4400000m), ri, CreateTradeInfoModel(++tradeId)),

                // Model - Sensitivities - Vega - FX
                Sensitivity.FxVega(CurrencyPair.Of(Currency.Usd, Currency.Eur), Tenor.M6, Amount.Of(Currency.Usd, 2500000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.FxVega(CurrencyPair.Of(Currency.Eur, Currency.Usd), Tenor.Y3, Amount.Of(Currency.Usd, 8500000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.FxVega(CurrencyPair.Of(Currency.Usd, Currency.Eur), Tenor.Y20, Amount.Of(Currency.Usd, -10000000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.FxVega(CurrencyPair.Of(Currency.Brl, Currency.Cny), Tenor.Y2, Amount.Of(Currency.Usd, 6500000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.FxVega(CurrencyPair.Of(Currency.Jpy, Currency.Sgd), Tenor.M6, Amount.Of(Currency.Usd, -2500000m), ri, CreateTradeInfoModel(++tradeId)),

                // Sensitivities - Delta - Vega - Inflation
                Sensitivity.InflationVega(Currency.Eur, Tenor.Y5, Amount.Of(Currency.Usd, 15000000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.InflationVega(Currency.Eur, Tenor.Y15, Amount.Of(Currency.Usd, -50000000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.InflationVega(Currency.Usd, Tenor.Y20, Amount.Of(Currency.Usd, 100000000m), ri, CreateTradeInfoModel(++tradeId)),

                // Model - Sensitivities - Vega - Rates - Interest Rate
                Sensitivity.InterestRateVega(Currency.Usd, Tenor.M3, Amount.Of(Currency.Usd, 20000000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.InterestRateVega(Currency.Usd, Tenor.Y1, Amount.Of(Currency.Usd, -30000000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.InterestRateVega(Currency.Aud, Tenor.W2, Amount.Of(Currency.Usd, -13000000m), ri, CreateTradeInfoModel(++tradeId)),
                Sensitivity.InterestRateVega(Currency.Aud, Tenor.Y2, Amount.Of(Currency.Usd, -2500000m), ri, CreateTradeInfoModel(++tradeId)),

                // Model - Add-on - Fixed Amounts
                AddOnFixedAmount.Of(Amount.Of(Currency.Usd, 1650000m), ri),
                AddOnFixedAmount.Of(Amount.Of(Currency.Usd, 2000000m), ri),

                // Model - Add-on - Notionals
                AddOnNotional.Of("FlexiCallOption", Amount.Of(Currency.Usd, 1000000m), ri, CreateTradeInfoModel(++tradeId)),
                AddOnNotional.Of("FlexiCallOption", Amount.Of(Currency.Usd, -2000000m), ri, CreateTradeInfoModel(++tradeId)),
                AddOnNotional.Of("FlexiCallOption", Amount.Of(Currency.Usd, 1500000m), ri, CreateTradeInfoModel(++tradeId)),
                AddOnNotional.Of("FlexiPutOption", Amount.Of(Currency.Usd, -800000m), ri, CreateTradeInfoModel(++tradeId)),
                AddOnNotional.Of("FlexiPutOption", Amount.Of(Currency.Usd, -2200000m), ri, CreateTradeInfoModel(++tradeId)),

                // Model - Add-on - Notional Factors
                AddOnNotionalFactor.Of("FlexiCallOption", 0.06105m, ri),
                AddOnNotionalFactor.Of("FlexiPutOption", 0.02055m, ri),

                // Model - Add-on - Product Multipliers
                AddOnProductMultiplier.Of(Model.Product.Commodity, 0.075m, ri),
                AddOnProductMultiplier.Of(Model.Product.Credit, 0.11m, ri),
                AddOnProductMultiplier.Of(Model.Product.Equity, 0.015m, ri),
                AddOnProductMultiplier.Of(Model.Product.RatesFx, 0.205m, ri),

                // Schedule - Notionals
                Notional.Of(Schedule.Product.Commodity, Amount.Of(Currency.Cad, 1850000m), ri, CreateTradeInfoSchedule(1, todayPlus3M)),
                Notional.Of(Schedule.Product.Credit, Amount.Of(Currency.Usd, 2300000m), ri, CreateTradeInfoSchedule(2, todayPlus3M)),
                Notional.Of(Schedule.Product.Credit, Amount.Of(Currency.Usd, -900000m), ri, CreateTradeInfoSchedule(3, todayPlus10Y)),
                Notional.Of(Schedule.Product.Fx, Amount.Of(Currency.Usd, -5200000m), ri, CreateTradeInfoSchedule(4, todayPlus3M)),
                Notional.Of(Schedule.Product.Equity, Amount.Of(Currency.Usd, 1200000m), ri, CreateTradeInfoSchedule(5, todayPlus4Y)),
                Notional.Of(Schedule.Product.Rates, Amount.Of(Currency.Usd, 3700000m), ri, CreateTradeInfoSchedule(6, todayPlus3M)),
                Notional.Of(Schedule.Product.Rates, Amount.Of(Currency.Usd, -2000000m), ri, CreateTradeInfoSchedule(7, todayPlus4Y)),
                Notional.Of(Schedule.Product.Rates, Amount.Of(Currency.Gbp, -1750000m), ri, CreateTradeInfoSchedule(8, todayPlus10Y)),
                Notional.Of(Schedule.Product.Rates, Amount.Of(Currency.Eur, 1620000m), ri, CreateTradeInfoSchedule(8, todayPlus10Y)),
                Notional.Of(Schedule.Product.Other, Amount.Of(Currency.Usd, -120000m), ri, CreateTradeInfoSchedule(9, todayPlus3M)),
                Notional.Of(Schedule.Product.Other, Amount.Of(Currency.Usd, 2140000m), ri, CreateTradeInfoSchedule(9, todayPlus3M)),
                Notional.Of(Schedule.Product.Other, Amount.Of(Currency.Usd, 4350000m), ri, CreateTradeInfoSchedule(10, todayPlus4Y)),
                Notional.Of(Schedule.Product.Other, Amount.Of(Currency.Usd, 4100000m), ri, CreateTradeInfoSchedule(11, todayPlus10Y)),
                Notional.Of(Schedule.Product.Other, Amount.Of(Currency.Usd, -5120000m), ri, CreateTradeInfoSchedule(11, todayPlus10Y)),

                // Schedule - Present Values
                PresentValue.Of(Schedule.Product.Commodity, Amount.Of(Currency.Usd, 490000m), ri, CreateTradeInfoSchedule(1, todayPlus3M)),
                PresentValue.Of(Schedule.Product.Credit, Amount.Of(Currency.Usd, -60000m), ri, CreateTradeInfoSchedule(2, todayPlus3M)),
                PresentValue.Of(Schedule.Product.Credit, Amount.Of(Currency.Usd, 610000m), ri, CreateTradeInfoSchedule(3, todayPlus10Y)),
                PresentValue.Of(Schedule.Product.Fx, Amount.Of(Currency.Usd, 320000m), ri, CreateTradeInfoSchedule(4, todayPlus3M)),
                PresentValue.Of(Schedule.Product.Equity, Amount.Of(Currency.Usd, -230000m), ri, CreateTradeInfoSchedule(5, todayPlus4Y)),
                PresentValue.Of(Schedule.Product.Rates, Amount.Of(Currency.Usd, 1850000m), ri, CreateTradeInfoSchedule(6, todayPlus3M)),
                PresentValue.Of(Schedule.Product.Rates, Amount.Of(Currency.Usd, -450000m), ri, CreateTradeInfoSchedule(7, todayPlus4Y)),
                PresentValue.Of(Schedule.Product.Rates, Amount.Of(Currency.Gbp, -170000m), ri, CreateTradeInfoSchedule(8, todayPlus10Y)),
                PresentValue.Of(Schedule.Product.Rates, Amount.Of(Currency.Eur, 260000m), ri, CreateTradeInfoSchedule(8, todayPlus10Y)),
                PresentValue.Of(Schedule.Product.Other, Amount.Of(Currency.Usd, -60000m), ri, CreateTradeInfoSchedule(9, todayPlus3M)),
                PresentValue.Of(Schedule.Product.Other, Amount.Of(Currency.Usd, -240000m), ri, CreateTradeInfoSchedule(11, todayPlus10Y)),
            };

            return(dataEntities.AsReadOnly());
        }
Ejemplo n.º 20
0
 internal static AddOnNotional OfUnchecked(String qualifier, Amount amount, RegulationsInfo regulationsInfo, TradeInfo tradeInfo)
 {
     return(new AddOnNotional(qualifier, amount, regulationsInfo, tradeInfo));
 }
Ejemplo n.º 21
0
 private PresentValue(Product product, Amount amount, RegulationsInfo regulationsInfo, TradeInfo tradeInfo) : base(amount, regulationsInfo, tradeInfo)
 {
     m_Product = product;
 }