/// <summary> /// Creates a sector element. /// </summary> /// <param name="appraisalDocument">The parent document.</param> /// <param name="sectorRow">The sector record used to create the Xml element.</param> public SectorElement(AppraisalDocument appraisalDocument, ClientMarketData.SectorRow sectorRow) : base("Sector", appraisalDocument) { // The sector id and name are taken directly from the SectorRow record. AddAttribute("SectorId", sectorRow.SectorId.ToString()); AddAttribute("SortOrder", sectorRow.SortOrder.ToString()); AddAttribute("Name", sectorRow.ObjectRow.Name.ToString()); // If there is a target percentage associated with this sector, add it to the attribute list. ClientMarketData.SectorTargetRow sectorTargetRow = ClientMarketData.SectorTarget.FindByModelIdSectorId(appraisalDocument.ModelRow.ModelId, sectorRow.SectorId); if (sectorTargetRow != null) { AddAttribute("ModelPercent", sectorTargetRow.Percent.ToString()); } // If there is a position record associated with this sector, then add the externally supplied data to the // record. Since the tax lots are always aggregated as we need them into a position, there's no static table // that keeps position data. This information is generally from an outside system that is related to the // position, such as risk metrics or quantitative calculations. ClientMarketData.PositionRow position = ClientMarketData.Position.FindByAccountIdSecurityIdPositionTypeCode( appraisalDocument.AccountRow.AccountId, sectorRow.SectorId, Shadows.Quasar.Common.PositionType.Long); if (position != null) { if (!position.IsUserData0Null()) { AddAttribute("UserData0", position.UserData0.ToString()); } if (!position.IsUserData1Null()) { AddAttribute("UserData1", position.UserData1.ToString()); } if (!position.IsUserData2Null()) { AddAttribute("UserData2", position.UserData2.ToString()); } if (!position.IsUserData3Null()) { AddAttribute("UserData3", position.UserData3.ToString()); } if (!position.IsUserData4Null()) { AddAttribute("UserData4", position.UserData4.ToString()); } if (!position.IsUserData5Null()) { AddAttribute("UserData5", position.UserData5.ToString()); } if (!position.IsUserData6Null()) { AddAttribute("UserData6", position.UserData6.ToString()); } if (!position.IsUserData7Null()) { AddAttribute("UserData7", position.UserData7.ToString()); } } }
/// <summary> /// Creates an 'Unclassified' Sector. /// </summary> /// <param name="appraisalDocument">The parent document.</param> public SectorElement(AppraisalDocument appraisalDocument) : base("Sector", appraisalDocument) { // The sector id and name are taken directly from the SectorRow record. AddAttribute("SectorId", "0"); AddAttribute("SortOrder", "0"); AddAttribute("Name", "Unclassified"); }
/// <summary> /// Creates a common element for the AppraisalDocument. /// </summary> /// <param name="name">The local name of the node.</param> /// <param name="appraisalDocument">The parent document.</param> public AppraisalElement(AppraisalDocument appraisalDocument) : base("Appraisal", appraisalDocument) { // The top level account information is used to add the user data to the top level of the appraisal. ClientMarketData.AccountRow accountRow = appraisalDocument.AccountRow; // Add any top-level data associated with this account (such as aggregate risk, account level quantitative // calculations, etc. if (accountRow != null) { if (!accountRow.IsUserData0Null()) { AddAttribute("UserData0", accountRow.UserData0.ToString()); } if (!accountRow.IsUserData1Null()) { AddAttribute("UserData1", accountRow.UserData1.ToString()); } if (!accountRow.IsUserData2Null()) { AddAttribute("UserData2", accountRow.UserData2.ToString()); } if (!accountRow.IsUserData3Null()) { AddAttribute("UserData3", accountRow.UserData3.ToString()); } if (!accountRow.IsUserData4Null()) { AddAttribute("UserData4", accountRow.UserData4.ToString()); } if (!accountRow.IsUserData5Null()) { AddAttribute("UserData5", accountRow.UserData5.ToString()); } if (!accountRow.IsUserData6Null()) { AddAttribute("UserData6", accountRow.UserData6.ToString()); } if (!accountRow.IsUserData7Null()) { AddAttribute("UserData7", accountRow.UserData7.ToString()); } } }
/// <summary> /// Creates an element in the Appraisal Document that represents a fund's or account's position. /// </summary> /// <param name="appraisalDocument">The parent document.</param> /// <param name="driverAccount">Identifies the individual position at the account/security/position level.</param> public AccountElement(AppraisalDocument appraisalDocument, AppraisalSet.AccountRow driverAccount) : base("Account", appraisalDocument) { // Get the account record from the account id. This record drives most of the data that appears in this element. ClientMarketData.AccountRow accountRow = ClientMarketData.Account.FindByAccountId(driverAccount.AccountId); // Count up the compliance violations int violationCount = 0; foreach (DataRowView dataRowView in ClientMarketData.Violation.UKViolationAccountIdSecurityIdPositionTypeCode.FindRows( new object[] { driverAccount.AccountId, driverAccount.SecurityId, driverAccount.PositionTypeCode })) { ClientMarketData.ViolationRow violationRow = (ClientMarketData.ViolationRow)dataRowView.Row; if (violationRow.RestrictionRow.Severity > 0) { violationCount++; } } AddAttribute("Violation", violationCount); // Add the essential attributes to the element. AddAttribute("AccountId", accountRow.AccountId.ToString()); // Aggregate the tax lot positions and cost. decimal taxLotQuantity = 0.0M; decimal taxLotCost = 0.0M; foreach (ClientMarketData.TaxLotRow taxLotRow in accountRow.GetTaxLotRows()) { if (taxLotRow.SecurityId == driverAccount.SecurityId && taxLotRow.PositionTypeCode == driverAccount.PositionTypeCode) { taxLotQuantity += taxLotRow.Quantity; taxLotCost += taxLotRow.Cost * taxLotRow.Quantity; } } AddAttribute("TaxLotQuantity", taxLotQuantity.ToString()); AddAttribute("TaxLotCost", taxLotCost.ToString()); // Aggregate the proposed orders positions. decimal proposedOrderQuantity = 0.0M; foreach (DataRowView dataRowView in appraisalDocument.proposedOrderView.FindRows(new object[] { driverAccount.AccountId, driverAccount.SecurityId, driverAccount.PositionTypeCode })) { ClientMarketData.ProposedOrderRow proposedOrderRow = (ClientMarketData.ProposedOrderRow)dataRowView.Row; proposedOrderQuantity += proposedOrderRow.Quantity * proposedOrderRow.TransactionTypeRow.QuantitySign; } AddAttribute("ProposedOrderQuantity", proposedOrderQuantity.ToString()); // Aggregate the orders. decimal orderQuantity = 0.0M; foreach (DataRowView dataRowView in appraisalDocument.orderView.FindRows(new object[] { driverAccount.AccountId, driverAccount.SecurityId, driverAccount.PositionTypeCode })) { ClientMarketData.OrderRow orderRow = (ClientMarketData.OrderRow)dataRowView.Row; orderQuantity += orderRow.Quantity * orderRow.TransactionTypeRow.QuantitySign; } AddAttribute("OrderQuantity", orderQuantity.ToString()); // Aggregate the allocations. decimal allocationQuantity = 0.0M; foreach (DataRowView dataRowView in appraisalDocument.allocationView.FindRows(new object[] { driverAccount.AccountId, driverAccount.SecurityId, driverAccount.PositionTypeCode })) { ClientMarketData.AllocationRow allocationRow = (ClientMarketData.AllocationRow)dataRowView.Row; allocationQuantity += allocationRow.Quantity * allocationRow.TransactionTypeRow.QuantitySign; } AddAttribute("AllocationQuantity", allocationQuantity.ToString()); }
/// <summary> /// Creates an Equity Element for an Appriasal Document. /// </summary> /// <param name="appraisalDocument">The parent Xml Document.</param> /// <param name="equityRow">An equity record from the data model.</param> /// <param name="PositionTypeCode">Whether a short or long position.</param> public EquityElement(AppraisalDocument appraisalDocument, ClientMarketData.EquityRow equityRow, AppraisalSet.PositionRow positionRow) : base("Equity", appraisalDocument) { // These records are used to access information held in the ancestors. ClientMarketData.SecurityRow securityRow = equityRow.SecurityRowByFKSecurityEquityEquityId; ClientMarketData.ObjectRow objectRow = securityRow.ObjectRow; // Add the essential attributes for this element. AddAttribute("SecurityId", equityRow.EquityId.ToString()); AddAttribute("PositionTypeCode", positionRow.PositionTypeCode.ToString()); AddAttribute("Name", objectRow.Name.ToString()); AddAttribute("PriceFactor", securityRow.PriceFactor.ToString()); AddAttribute("QuantityFactor", securityRow.QuantityFactor.ToString()); // Find the price based on the default currency found in the equity record. If the security master doesn't // have a price for this security, provide dummy values to insure a market value can be calculated. Zero is a // perfectly reasonable interpretation of a missing price. ClientMarketData.PriceRow securityPrice = ClientMarketData.Price.FindBySecurityIdCurrencyId( securityRow.SecurityId, equityRow.SettlementId); if (securityPrice == null) { AddAttribute("Price", "0.0"); } else { if (ClientPreferences.Pricing == Pricing.Close) { AddAttribute("Price", securityPrice.ClosePrice.ToString()); } if (ClientPreferences.Pricing == Pricing.Last) { AddAttribute("Price", securityPrice.LastPrice.ToString()); } } // Find the crossing price. This is used to convert any local price into the account's base currency. Provide // defaults if the crossing price can be found. While this will lead to wrong values, they will be obvious on // the appraisal. ClientMarketData.PriceRow currencyPrice = ClientMarketData.Price.FindBySecurityIdCurrencyId( equityRow.SettlementId, appraisalDocument.AccountRow.CurrencyRow.CurrencyId); if (currencyPrice == null) { AddAttribute("CloseCrossPrice", "0.0"); AddAttribute("LastCrossPrice", "0.0"); } else { AddAttribute("CloseCrossPrice", currencyPrice.ClosePrice.ToString()); AddAttribute("LastCrossPrice", currencyPrice.LastPrice.ToString()); } // Add a target percentage if one is associated with this security. ClientMarketData.PositionTargetRow positionTargetRow = ClientMarketData.PositionTarget.FindByModelIdSecurityIdPositionTypeCode( appraisalDocument.ModelRow.ModelId, equityRow.EquityId, positionRow.PositionTypeCode); if (positionTargetRow != null) { AddAttribute("ModelPercent", positionTargetRow.Percent.ToString()); } // If there is a position record associated with this, er.. position, then add the externally supplied data // to the record. Since the tax lots are always aggregated as we need them into a position, there's no static // table that keeps position data. This information is generally from an outside system that is related to // the position, such as risk metrics or quantitative calculations. ClientMarketData.PositionRow position = ClientMarketData.Position.FindByAccountIdSecurityIdPositionTypeCode( appraisalDocument.AccountRow.AccountId, positionRow.SecurityId, positionRow.PositionTypeCode); if (position != null) { if (!position.IsUserData0Null()) { AddAttribute("UserData0", position.UserData0.ToString()); } if (!position.IsUserData1Null()) { AddAttribute("UserData1", position.UserData1.ToString()); } if (!position.IsUserData2Null()) { AddAttribute("UserData2", position.UserData2.ToString()); } if (!position.IsUserData3Null()) { AddAttribute("UserData3", position.UserData3.ToString()); } if (!position.IsUserData4Null()) { AddAttribute("UserData4", position.UserData4.ToString()); } if (!position.IsUserData5Null()) { AddAttribute("UserData5", position.UserData5.ToString()); } if (!position.IsUserData6Null()) { AddAttribute("UserData6", position.UserData6.ToString()); } if (!position.IsUserData7Null()) { AddAttribute("UserData7", position.UserData7.ToString()); } } // Add the account level aggregates for this security/position type pair. foreach (AppraisalSet.AccountRow accountRow in positionRow.GetAccountRows()) { this.AppendChild(new AccountElement(appraisalDocument, accountRow)); } }
/// <summary> /// Creates a Currency Element for an Appraisal Document. /// </summary> /// <param name="appraisalDocument">The parent Xml Document.</param> /// <param name="currencyRow">A currency record in the data model.</param> /// <param name="PositionTypeCode">Whether a short or long position.</param> public CurrencyElement(AppraisalDocument appraisalDocument, ClientMarketData.CurrencyRow currencyRow, AppraisalSet.PositionRow positionRow) : base("Currency", appraisalDocument) { // These records are used to access information held in the ancestors. ClientMarketData.SecurityRow securityRow = currencyRow.SecurityRow; ClientMarketData.ObjectRow objectRow = securityRow.ObjectRow; // Add the essential attributes for this element. AddAttribute("SecurityId", currencyRow.CurrencyId.ToString()); AddAttribute("PositionTypeCode", positionRow.PositionTypeCode.ToString()); AddAttribute("Name", objectRow.Name.ToString()); // Add the price info. ClientMarketData.PriceRow priceRow = ClientMarketData.Price.FindBySecurityIdCurrencyId(securityRow.SecurityId, appraisalDocument.AccountRow.CurrencyRow.CurrencyId); if (priceRow == null) { AddAttribute("Price", "0.0"); } else { if (ClientPreferences.Pricing == Pricing.Close) { AddAttribute("Price", priceRow.ClosePrice.ToString()); } if (ClientPreferences.Pricing == Pricing.Last) { AddAttribute("Price", priceRow.LastPrice.ToString()); } } // Add a target percentage if one is associated with this security. ClientMarketData.PositionTargetRow positionTargetRow = ClientMarketData.PositionTarget.FindByModelIdSecurityIdPositionTypeCode( appraisalDocument.ModelRow.ModelId, currencyRow.CurrencyId, positionRow.PositionTypeCode); if (positionTargetRow != null) { AddAttribute("ModelPercent", positionTargetRow.Percent.ToString()); } // If there is a position record associated with this, er.. position, then add the externally supplied data // to the record. Since the tax lots are always aggregated as we need them into a position, there's no static // table that keeps position data. This information is generally from an outside system that is related to // the position, such as risk metrics or quantitative calculations. ClientMarketData.PositionRow position = ClientMarketData.Position.FindByAccountIdSecurityIdPositionTypeCode( appraisalDocument.AccountRow.AccountId, positionRow.SecurityId, positionRow.PositionTypeCode); if (position != null) { if (!position.IsUserData0Null()) { AddAttribute("UserData0", position.UserData0.ToString()); } if (!position.IsUserData1Null()) { AddAttribute("UserData1", position.UserData1.ToString()); } if (!position.IsUserData2Null()) { AddAttribute("UserData2", position.UserData2.ToString()); } if (!position.IsUserData3Null()) { AddAttribute("UserData3", position.UserData3.ToString()); } if (!position.IsUserData4Null()) { AddAttribute("UserData4", position.UserData4.ToString()); } if (!position.IsUserData5Null()) { AddAttribute("UserData5", position.UserData5.ToString()); } if (!position.IsUserData6Null()) { AddAttribute("UserData6", position.UserData6.ToString()); } if (!position.IsUserData7Null()) { AddAttribute("UserData7", position.UserData7.ToString()); } } // Append the account level aggregates to this security/position type element. foreach (AppraisalSet.AccountRow accountRow in positionRow.GetAccountRows()) { this.AppendChild(new AccountElement(appraisalDocument, accountRow)); } }