/// <summary>
 /// Initializes a new instance of the <see cref="PriceableEquitySpot"/> class.
 /// </summary>
 /// <param name="baseDate">The base date.</param>
 /// <param name="position">The underlysing prosiiotn.</param>
 /// <param name="equity">The equity</param>
 /// <param name="settlementCalendar">The settlement Calendar.</param>
 /// <param name="marketQuote">The market quote.</param>
 public PriceableEquitySpot(DateTime baseDate, int position, EquityNodeStruct equity,
                            IBusinessCalendar settlementCalendar, BasicQuotation marketQuote)
     : base(baseDate, position, equity.SettlementDate, settlementCalendar, marketQuote)
 {
     //Issuer = equity.Equity.id;
     IsXD = IsExDiv();
     //EquityCurveName = CurveNameHelpers.GetEquityCurveName(Currency.Value, Issuer);
 }
Example #2
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="logger"></param>
        /// <param name="cache"></param>
        /// <param name="nameSpace"></param>
        /// <param name="tradeDate"></param>
        /// <param name="effectiveDate"></param>
        /// <param name="referenceEquity"></param>
        /// <param name="settlementCalendar"></param>
        /// <param name="equityFpML"></param>
        /// <param name="basePartyReference"></param>
        /// <param name="forecastRateInterpolation"></param>
        public EquityTransactionPricer(ILogger logger, ICoreCache cache, string nameSpace, DateTime tradeDate, DateTime effectiveDate,
                                       String referenceEquity, IBusinessCalendar settlementCalendar, EquityTransaction equityFpML, string basePartyReference, Boolean forecastRateInterpolation)
        {
            logger.LogInfo("EquityType set. Commence to build a equity transaction.");
            if (equityFpML == null)
            {
                return;
            }
            SettlementDate    = effectiveDate;
            TradeDate         = tradeDate;
            Multiplier        = 1.0m;
            BuyerReference    = equityFpML.buyerPartyReference.href;
            PaymentCurrencies = new List <string> {
                equityFpML.unitPrice.currency.Value
            };
            SellerReference           = equityFpML.sellerPartyReference.href;
            BasePartyBuyer            = basePartyReference == equityFpML.buyerPartyReference.href;
            ForecastRateInterpolation = forecastRateInterpolation;
            SettlementCalendar        = settlementCalendar;
            ReferenceEquity           = referenceEquity;
            NumberOfShares            = Convert.ToInt16(equityFpML.numberOfUnits);
            PurchasePrice             = MoneyHelper.GetAmount(equityFpML.unitPrice.amount, equityFpML.unitPrice.currency.Value);
            PaymentCurrencies         = new List <string> {
                equityFpML.unitPrice.currency.Value
            };
            var exchangeMIC     = equityFpML.equity.exchangeId;
            var exchangeMICData = InstrumentDataHelper.CreateEquityExchangeKey(nameSpace, exchangeMIC.Value);
            var exchangeData    = cache.LoadItem <ExchangeConfigData>(exchangeMICData);

            if (exchangeData?.Data is ExchangeConfigData)
            {
                var exchange       = (ExchangeConfigData)exchangeData.Data;
                var equityTypeInfo = new EquityNodeStruct {
                    SettlementDate = exchange.SettlementDate
                };
                if (equityFpML.equity != null)
                {
                    if (SettlementCalendar == null)
                    {
                        SettlementCalendar = BusinessCenterHelper.ToBusinessCalendar(cache,
                                                                                     equityTypeInfo.SettlementDate
                                                                                     .businessCenters,
                                                                                     nameSpace);
                    }
                    if (PaymentCalendar == null)
                    {
                        PaymentCalendar = SettlementCalendar;
                    }
                    var equity = XmlSerializerHelper.Clone(equityFpML.equity);
                    EquityTypeInfo        = XmlSerializerHelper.Clone(equityTypeInfo);
                    EquityTypeInfo.Equity = equity;;
                    RiskMaturityDate      = SettlementDate;
                    MaturityDate          = SettlementDate;
                    if (!PaymentCurrencies.Contains(equityFpML.equity.currency.Value))
                    {
                        PaymentCurrencies.Add(equityFpML.equity.currency.Value);
                    }
                    logger.LogInfo("Equity transaction has been successfully created.");
                }
            }
            else
            {
                logger.LogInfo("Equity type data not available.");
            }
            //Add payments like the settlement price
            if (PurchasePrice == null || !PurchasePrice.amountSpecified)
            {
                return;
            }
            var amount            = PurchasePrice.amount * NumberOfShares;
            var settlementPayment = PaymentHelper.Create("EquitySettlemetAmount", BuyerReference, SellerReference, amount, SettlementDate);

            AdditionalPayments = PriceableInstrumentsFactory.CreatePriceablePayments(basePartyReference, new[] { settlementPayment }, PaymentCalendar);
            if (!PaymentCurrencies.Contains(settlementPayment.paymentAmount.currency.Value))
            {
                PaymentCurrencies.Add(settlementPayment.paymentAmount.currency.Value);
            }
        }
        /// <summary>
        /// Gets the instrument config data.
        /// </summary>
        /// <param name="cache">The cache.</param>
        /// <param name="nameSpace">The client namespace</param>
        /// <param name="parts">The AssetId or the parts of the AssetId.</param>
        /// <returns></returns>
        public static Instrument GetInstrumentConfigurationData(ICoreCache cache, string nameSpace, params string[] parts)
        {
            bool simplifiable = true;

            if (parts.Length == 1)
            {
                parts = parts[0].Split('-');
            }
            string     uniqueName;
            var        assetType            = (AssetTypesEnum)Enum.Parse(typeof(AssetTypesEnum), parts[1], true);
            var        swapTypes            = new[] { AssetTypesEnum.IRSwap, AssetTypesEnum.BasisSwap, AssetTypesEnum.XccyBasisSwap, AssetTypesEnum.XccySwap };
            var        fxTypes              = new[] { AssetTypesEnum.FxSpot, AssetTypesEnum.FxForward };
            var        bondTypes            = new[] { AssetTypesEnum.Bond };
            var        commodityTypes       = new[] { AssetTypesEnum.CommoditySpread, AssetTypesEnum.CommodityForward };
            var        equityTypes          = new[] { AssetTypesEnum.Equity, AssetTypesEnum.EquityForward, AssetTypesEnum.EquitySpread };
            var        irfuturesOptionTypes = new[] { AssetTypesEnum.IRFutureOption, AssetTypesEnum.IRCallFutureOption, AssetTypesEnum.IRPutFutureOption };
            var        otherTypes           = new[] { AssetTypesEnum.BondForward, AssetTypesEnum.BondSpot };
            ICoreItem  loadedItem;
            Instrument instrument;
            string     exchangeMIC = null;

            if (swapTypes.Contains(assetType) && parts.Length > 3)
            {
                uniqueName = CreateKey(nameSpace, parts[1], parts[0], parts[2], parts[3]);
            }
            else if (irfuturesOptionTypes.Contains(assetType) && parts.Length > 2)
            {
                uniqueName = CreateKey(nameSpace, AssetTypesEnum.IRFutureOption.ToString(), parts[0], parts[2]);
            }
            else if (commodityTypes.Contains(assetType) && parts.Length > 3)
            {
                uniqueName = CreateKey(nameSpace, parts[1], parts[0], parts[2], parts[3]);
            }
            else if (fxTypes.Contains(assetType))
            {
                return(GetFxInstrumentConfigurationData(cache, nameSpace, parts));
            }
            else if (bondTypes.Contains(assetType) && parts[2].Split('.').Length > 4)
            {
                uniqueName = CreateBondKey(nameSpace, parts[2]);
                var extraData = cache.LoadItem <Bond>(uniqueName);
                var bondType  = extraData.AppProps.GetValue <string>(BondProp.BondType, true);
                uniqueName = CreateKey(nameSpace, parts[1], parts[0], bondType);
                loadedItem = cache.LoadItem <Instrument>(uniqueName);
                instrument = loadedItem.Data as Instrument;
                if (instrument != null)
                {
                    var newInstrument = XmlSerializerHelper.Clone(instrument);
                    ((BondNodeStruct)newInstrument.InstrumentNodeItem).Bond = extraData.Data as Bond;
                    return(newInstrument);
                }
            }
            else if (equityTypes.Contains(assetType))
            {
                var         assetCode   = parts[2].Split('.');
                EquityAsset equityAsset = null;
                if (assetCode.Length == 2)
                {
                    uniqueName = CreateEquityAssetKey(nameSpace, parts[2]);
                    var equity = cache.LoadItem <EquityAsset>(uniqueName);
                    exchangeMIC = equity.AppProps.GetValue <string>(EquityProp.ExchangeMIC, true);
                    equityAsset = equity.Data as EquityAsset;
                }
                if (assetCode.Length == 1)
                {
                    exchangeMIC = assetCode[0];
                }
                uniqueName = CreateEquityExchangeKey(nameSpace, exchangeMIC);
                loadedItem = cache.LoadItem <ExchangeConfigData>(uniqueName);
                if (assetType == AssetTypesEnum.Equity && loadedItem.Data is ExchangeConfigData exchange)
                {
                    instrument = new Instrument();
                    var equityNode = new EquityNodeStruct
                    {
                        Equity         = equityAsset,
                        Exchange       = exchange.ExchangeData,
                        SettlementDate = exchange.SettlementDate
                    };
                    instrument.AssetType          = parts[1];
                    instrument.InstrumentNodeItem = equityNode;
                    instrument.Currency           = CurrencyHelper.Parse(parts[0]);
                    instrument.ExtraItem          = equityNode.Exchange.MIC;
                    return(instrument);
                }
                if (parts.Length > 3)
                {
                    uniqueName = CreateKey(nameSpace, parts[1], parts[0], exchangeMIC, parts[3]);
                }
                else
                {
                    uniqueName   = CreateKey(nameSpace, parts[1], parts[0], exchangeMIC);
                    simplifiable = false;
                }
            }
            else if (otherTypes.Contains(assetType) && parts.Length > 3)
            {
                //This is to simplify the configuration data and no bond forward is required
                uniqueName = CreateKey(nameSpace, parts[1], parts[0], parts[2], parts[3]);
            }
            //Default Area that sweeps all the standard keys structures.
            else if (parts.Length > 2)
            {
                uniqueName = CreateKey(nameSpace, parts[1], parts[0], parts[2]);
            }
            else
            {
                uniqueName   = CreateKey(nameSpace, parts[1], parts[0]);
                simplifiable = false;
            }
            loadedItem = cache.LoadItem <Instrument>(uniqueName);
            if (loadedItem == null && simplifiable)
            {
                if (swapTypes.Contains(assetType) && parts.Length > 3)
                {
                    //This handles the special case of IRSwaps, where the underlying maturity should use the default.
                    uniqueName = CreateKey(nameSpace, parts[1], parts[0], "Default", parts[3]);
                }
                else if (commodityTypes.Contains(assetType) && parts.Length > 3)
                {
                    uniqueName = CreateKey(nameSpace, parts[1], parts[0], parts[2]);
                }
                else if (equityTypes.Contains(assetType) && parts.Length > 3)
                {
                    //Orion.V5r3.Configuration.Instrument.EquityForward.AUD-EquityForward.AU.0D
                    uniqueName = CreateKey(nameSpace, parts[1], parts[0], exchangeMIC);
                }
                else if (otherTypes.Contains(assetType))
                {
                    //This is to simplify the configuration data and no bond forward is required
                    uniqueName = CreateKey(nameSpace, AssetTypesEnum.Bond.ToString(), parts[0], parts[2]);
                }
                else
                {
                    uniqueName = CreateKey(nameSpace, parts[1], parts[0]);
                }
                loadedItem = cache.LoadItem <Instrument>(uniqueName);
            }
            instrument = loadedItem?.Data as Instrument;
            return(instrument);
        }
 /// <summary>
 /// Initializes a new instance of the <see cref="PriceableEquityForward"/> class.
 /// </summary>
 /// <param name="baseDate">The base date.</param>
 /// <param name="position">The underlysing prosiiotn.</param>
 /// <param name="equity">The equity</param>
 /// <param name="settlementCalendar">The settlement Calendar.</param>
 /// <param name="marketQuote">The market quote.</param>
 public PriceableEquityForward(DateTime baseDate, int position, EquityNodeStruct equity,
                               IBusinessCalendar settlementCalendar, BasicQuotation marketQuote)
     : base(baseDate, position, equity.SettlementDate, settlementCalendar, marketQuote)
 {
     IsXD = IsExDiv();
 }