private static void Update(RemoteBatch remoteBatch, RemoteTransaction remoteTransaction, ClientMarketData.ProposedOrderRow parentProposedOrder, decimal quantityInstruction) { // These define the assembly and the types within those assemblies that will be used to create the proposed orders on // the middle tier. RemoteAssembly remoteAssembly = remoteBatch.Assemblies.Add("Service.Core"); RemoteType proposedOrderType = remoteAssembly.Types.Add("Shadows.WebService.Core.ProposedOrder"); ClientMarketData.AccountRow accountRow = parentProposedOrder.AccountRow; ClientMarketData.SecurityRow securityRow = parentProposedOrder.SecurityRowByFKSecurityProposedOrderSecurityId; // This will turn the signed quantity into an absolute quantity and a transaction code (e.g. -1000 is turned into a // SELL of 1000 shares). decimal parentQuantity = Math.Abs(quantityInstruction); int parentTransactionTypeCode = TransactionType.Calculate(securityRow.SecurityTypeCode, parentProposedOrder.PositionTypeCode, quantityInstruction); // The time in force first comes from the user preferences, next, account settings and finally defaults to a day // orders. int timeInForceCode = !ClientPreferences.IsTimeInForceCodeNull() ? ClientPreferences.TimeInForceCode : !accountRow.IsTimeInForceCodeNull() ? accountRow.TimeInForceCode : TimeInForce.DAY; // The destination blotter comes first from the user preferences, second from the account preferences, and finally uses // the auto-routing logic. int blotterId = !ClientPreferences.IsBlotterIdNull() ? ClientPreferences.BlotterId : !accountRow.IsBlotterIdNull() ? accountRow.BlotterId : TradingSupport.AutoRoute(securityRow, parentQuantity); // Create a command to update the proposed order. RemoteMethod updateParent = proposedOrderType.Methods.Add("Update"); updateParent.Transaction = remoteTransaction; updateParent.Parameters.Add("rowVersion", parentProposedOrder.RowVersion); updateParent.Parameters.Add("proposedOrderId", parentProposedOrder.ProposedOrderId); updateParent.Parameters.Add("accountId", parentProposedOrder.AccountId); updateParent.Parameters.Add("securityId", parentProposedOrder.SecurityId); updateParent.Parameters.Add("settlementId", parentProposedOrder.SettlementId); updateParent.Parameters.Add("blotterId", blotterId); updateParent.Parameters.Add("positionTypeCode", parentProposedOrder.PositionTypeCode); updateParent.Parameters.Add("transactionTypeCode", parentTransactionTypeCode); updateParent.Parameters.Add("timeInForceCode", timeInForceCode); updateParent.Parameters.Add("orderTypeCode", OrderType.Market); updateParent.Parameters.Add("quantity", parentQuantity); foreach (ClientMarketData.ProposedOrderTreeRow proposedOrderTree in parentProposedOrder.GetProposedOrderTreeRowsByFKProposedOrderProposedOrderTreeParentId()) { ClientMarketData.ProposedOrderRow childProposedOrder = proposedOrderTree.ProposedOrderRowByFKProposedOrderProposedOrderTreeChildId; // If this is the settlement part of the order, then adjust the quantity. if (childProposedOrder.SecurityId == parentProposedOrder.SettlementId) { // The settlement security is needed for the calculation of the cash impact of this trade. ClientMarketData.CurrencyRow currencyRow = MarketData.Currency.FindByCurrencyId(childProposedOrder.SettlementId); decimal marketValue = parentQuantity * securityRow.QuantityFactor * Price.Security(currencyRow, securityRow) * securityRow.PriceFactor * TransactionType.GetCashSign(parentTransactionTypeCode); decimal childQuantity = Math.Abs(marketValue); int childTransactionTypeCode = TransactionType.Calculate(securityRow.SecurityTypeCode, parentProposedOrder.PositionTypeCode, marketValue); // Create a command to update the proposed order. RemoteMethod updateChild = proposedOrderType.Methods.Add("Update"); updateChild.Transaction = remoteTransaction; updateChild.Parameters.Add("rowVersion", childProposedOrder.RowVersion); updateChild.Parameters.Add("proposedOrderId", childProposedOrder.ProposedOrderId); updateChild.Parameters.Add("accountId", childProposedOrder.AccountId); updateChild.Parameters.Add("securityId", childProposedOrder.SecurityId); updateChild.Parameters.Add("settlementId", childProposedOrder.SettlementId); updateChild.Parameters.Add("blotterId", blotterId); updateChild.Parameters.Add("positionTypeCode", parentProposedOrder.PositionTypeCode); updateChild.Parameters.Add("transactionTypeCode", childTransactionTypeCode); updateChild.Parameters.Add("timeInForceCode", timeInForceCode); updateChild.Parameters.Add("orderTypeCode", OrderType.Market); updateChild.Parameters.Add("quantity", childQuantity); } } }
/// <summary> /// Creates a command in a RemoteBatch structure to insert a proposed order. /// </summary> /// <param name="remoteBatch"></param> /// <param name="remoteTransaction"></param> /// <param name="accountRow"></param> /// <param name="securityRow"></param> /// <param name="positionTypeCode"></param> /// <param name="quantityInstruction"></param> private static void Insert(RemoteBatch remoteBatch, RemoteTransaction remoteTransaction, ClientMarketData.AccountRow accountRow, ClientMarketData.SecurityRow securityRow, int positionTypeCode, decimal quantityInstruction) { // These define the assembly and the types within those assemblies that will be used to create the proposed orders on // the middle tier. RemoteAssembly remoteAssembly = remoteBatch.Assemblies.Add("Service.Core"); RemoteType proposedOrderType = remoteAssembly.Types.Add("Shadows.WebService.Core.ProposedOrder"); RemoteType proposedOrderTreeType = remoteAssembly.Types.Add("Shadows.WebService.Core.ProposedOrderTree"); // Find the default settlement for this order. int settlementId = Shadows.Quasar.Common.Security.GetDefaultSettlementId(securityRow); // As a convention between the rebalancing section and the order generation, the parentQuantity passed into this method // is a signed value where the negative values are treated as 'Sell' instructions and the positive values meaning // 'Buy'. This will adjust the parentQuantity so the trading methods can deal with an unsigned value, which is more // natural for trading. decimal parentQuantity = Math.Abs(quantityInstruction); // This will turn the signed parentQuantity into an absolute parentQuantity and a transaction code (e.g. -1000 is // turned into a SELL of 1000 shares). int parentTransactionTypeCode = TransactionType.Calculate(securityRow.SecurityTypeCode, positionTypeCode, quantityInstruction); // The time in force first comes from the user preferences, next, account settings and finally defaults to a day // orders. int timeInForceCode = !ClientPreferences.IsTimeInForceCodeNull() ? ClientPreferences.TimeInForceCode : !accountRow.IsTimeInForceCodeNull() ? accountRow.TimeInForceCode : TimeInForce.DAY; // The destination blotter comes first from the user preferences, second from the account preferences, and finally uses // the auto-routing logic. int parentBlotterId = ClientPreferences.IsBlotterIdNull() ? (accountRow.IsBlotterIdNull() ? TradingSupport.AutoRoute(securityRow, parentQuantity) : accountRow.BlotterId) : ClientPreferences.BlotterId; // Create a command to delete the relationship between the parent and child. RemoteMethod insertParent = proposedOrderType.Methods.Add("Insert"); insertParent.Transaction = remoteTransaction; insertParent.Parameters.Add("proposedOrderId", DataType.Int, Direction.ReturnValue); insertParent.Parameters.Add("blotterId", parentBlotterId); insertParent.Parameters.Add("accountId", accountRow.AccountId); insertParent.Parameters.Add("securityId", securityRow.SecurityId); insertParent.Parameters.Add("settlementId", settlementId); insertParent.Parameters.Add("positionTypeCode", positionTypeCode); insertParent.Parameters.Add("transactionTypeCode", parentTransactionTypeCode); insertParent.Parameters.Add("timeInForceCode", timeInForceCode); insertParent.Parameters.Add("orderTypeCode", OrderType.Market); insertParent.Parameters.Add("quantity", parentQuantity); // Now it's time to create an order for the settlement currency. if (securityRow.SecurityTypeCode == SecurityType.Equity || securityRow.SecurityTypeCode == SecurityType.Debt) { // The underlying currency is needed for the market value calculations. ClientMarketData.CurrencyRow currencyRow = MarketData.Currency.FindByCurrencyId(settlementId); decimal marketValue = parentQuantity * securityRow.QuantityFactor * Price.Security(currencyRow, securityRow) * securityRow.PriceFactor * TransactionType.GetCashSign(parentTransactionTypeCode); // The stragegy for handling the settlement currency changes is to calculate the old market value, calculate the // new market value, and add the difference to the running total for the settlement currency of this security. The // new market value is the impact of the trade that was just entered. int childTransactionTypeCode = TransactionType.Calculate(securityRow.SecurityTypeCode, positionTypeCode, marketValue); decimal childQuantity = Math.Abs(marketValue); // The destination blotter comes first from the user preferences, second from the account preferences, and finally // uses the auto-routing logic. int childBlotterId = ClientPreferences.IsBlotterIdNull() ? (accountRow.IsBlotterIdNull() ? TradingSupport.AutoRoute(currencyRow.SecurityRow, childQuantity) : accountRow.BlotterId) : ClientPreferences.BlotterId; // Fill in the rest of the fields and the defaulted fields for this order. Create a command to delete the // relationship between the parent and child. RemoteMethod insertChild = proposedOrderType.Methods.Add("Insert"); insertChild.Transaction = remoteTransaction; insertChild.Parameters.Add("proposedOrderId", DataType.Int, Direction.ReturnValue); insertChild.Parameters.Add("blotterId", childBlotterId); insertChild.Parameters.Add("accountId", accountRow.AccountId); insertChild.Parameters.Add("securityId", settlementId); insertChild.Parameters.Add("settlementId", settlementId); insertChild.Parameters.Add("transactionTypeCode", childTransactionTypeCode); insertChild.Parameters.Add("positionTypeCode", positionTypeCode); insertChild.Parameters.Add("timeInForceCode", timeInForceCode); insertChild.Parameters.Add("orderTypeCode", OrderType.Market); insertChild.Parameters.Add("quantity", childQuantity); RemoteMethod insertRelation = proposedOrderTreeType.Methods.Add("Insert"); insertRelation.Transaction = remoteTransaction; insertRelation.Parameters.Add("parentId", insertParent.Parameters["proposedOrderId"]); insertRelation.Parameters.Add("childId", insertChild.Parameters["proposedOrderId"]); } }