public void SettlementDateEvent(PostingEngineEnvironment env, Transaction element) { // On Settlement Date we backout the Tax Lot for FORWARDS if (env.TaxLotStatus.ContainsKey(element.LpOrderId)) { var taxlotStatus = env.TaxLotStatus[element.LpOrderId]; var split = element.Symbol.Split(new char[] { '/', ' ' }); var baseCurrency = split[0]; var riskCurrency = split[1]; var accountBuy = new AccountUtils().CreateAccount(atSettledCash, new List <string> { element.SecurityType, element.CustodianCode, baseCurrency }); var accountSell = new AccountUtils().CreateAccount(atSettledCash, new List <string> { element.SecurityType, element.CustodianCode, riskCurrency }); new AccountUtils().SaveAccountDetails(env, accountBuy); new AccountUtils().SaveAccountDetails(env, accountSell); var fxCurrency = riskCurrency; var tradePrice = taxlotStatus.TradePrice; var baseQuantity = element.Quantity; var eodPrice = MarketPrices.GetPrice(env, env.ValueDate, element).Price; var fxRate = FxRates.Find(env.ValueDate, fxCurrency).Rate; var buyValue = baseQuantity * tradePrice * fxRate; var sellValue = baseQuantity * eodPrice * fxRate; if (element.IsBuy()) // BUY { var realizedPnl = sellValue - buyValue; var debit = new Journal(accountBuy, Event.SETTLED_CASH, env.ValueDate) { Source = element.LpOrderId, Fund = env.GetFund(element), FxCurrency = baseCurrency, Symbol = element.Symbol, SecurityId = element.SecurityId, Quantity = Convert.ToDouble(element.Quantity), FxRate = tradePrice, StartPrice = tradePrice, EndPrice = eodPrice, Value = env.SignedValue(accountBuy, accountSell, true, buyValue), CreditDebit = env.DebitOrCredit(accountBuy, buyValue), }; var credit = new Journal(accountSell, Event.SETTLED_CASH, env.ValueDate) { Source = element.LpOrderId, Fund = env.GetFund(element), FxCurrency = riskCurrency, Symbol = element.Symbol, SecurityId = element.SecurityId, Quantity = Convert.ToDouble(element.Quantity), FxRate = tradePrice, StartPrice = 0, EndPrice = 0, Value = env.SignedValue(accountBuy, accountSell, true, sellValue * -1), CreditDebit = env.DebitOrCredit(accountSell, sellValue), }; env.Journals.AddRange(new[] { credit, debit }); var originalAccount = AccountUtils.GetDerivativeAccountType(realizedPnl); // Realized Pnl to go along with the Settled Cash CommonRules.GenerateJournalEntry(env, element, listOfTags, realizedAccountType, Event.REALIZED_PNL, realizedPnl); CommonRules.GenerateJournalEntries(env, element, listOfTags, originalAccount, "Change in Unrealized Derivatives Contracts at Fair Value", realizedPnl * -1); } else // SELL { var realizedPnl = buyValue - sellValue; var debit = new Journal(accountBuy, Event.SETTLED_CASH, env.ValueDate) { Source = element.LpOrderId, Fund = env.GetFund(element), FxCurrency = baseCurrency, Symbol = element.Symbol, SecurityId = element.SecurityId, Quantity = Convert.ToDouble(element.Quantity), FxRate = tradePrice, StartPrice = 0, EndPrice = 0, Value = env.SignedValue(accountBuy, accountSell, true, sellValue), CreditDebit = env.DebitOrCredit(accountBuy, element.Quantity), }; var credit = new Journal(accountSell, Event.SETTLED_CASH, env.ValueDate) { Source = element.LpOrderId, Fund = env.GetFund(element), FxCurrency = riskCurrency, Symbol = element.Symbol, SecurityId = element.SecurityId, Quantity = Convert.ToDouble(element.Quantity), FxRate = tradePrice, StartPrice = 0, EndPrice = 0, Value = env.SignedValue(accountBuy, accountSell, true, buyValue * -1), CreditDebit = env.DebitOrCredit(accountSell, element.Quantity), }; env.Journals.AddRange(new[] { credit, debit }); var originalAccount = AccountUtils.GetDerivativeAccountType(realizedPnl); // Realized Pnl to go along with the Settled Cash CommonRules.GenerateJournalEntry(env, element, listOfTags, realizedAccountType, Event.REALIZED_PNL, realizedPnl); CommonRules.GenerateJournalEntries(env, element, listOfTags, originalAccount, "Change in Unrealized Derivatives Contracts at Fair Value", realizedPnl * -1); } if (taxlotStatus.Quantity != 0) { var buyTrade = env.FindTrade(taxlotStatus.OpenId); var taxlot = CommonRules.RelieveTaxLot(env, buyTrade, element, taxlotStatus.Quantity * -1, true); taxlotStatus.Quantity = 0; taxlotStatus.Status = "Closed"; } } }
public void SettlementDateEvent(PostingEngineEnvironment env, Transaction element) { if (env.TaxLotStatus.ContainsKey(element.LpOrderId)) { var taxlot = env.TaxLotStatus[element.LpOrderId]; var tradeCurrency = element.TradeCurrency; var settleCurrency = element.SettleCurrency; var allocations = env.FindTradeAllocations(element); var buy = allocations.Where(i => i.SecurityType.Equals("SPOT") && i.Side.Equals("BUY")).FirstOrDefault(); var sell = allocations.Where(i => i.SecurityType.Equals("SPOT") && i.Side.Equals("SELL")).FirstOrDefault(); if (buy == null || sell == null) { Logger.Error($"Unable to process {element.SecurityType}::{element.LpOrderId}"); return; } var accountSell = new AccountUtils().CreateAccount(atSettledCash, listOfTradeTags, sell); var accountBuy = new AccountUtils().CreateAccount(atSettledCash, listOfTradeTags, buy); new AccountUtils().SaveAccountDetails(env, accountSell); new AccountUtils().SaveAccountDetails(env, accountBuy); var sellFx = FxRates.Find(env.ValueDate, sell.TradeCurrency); var buyFx = FxRates.Find(env.ValueDate, buy.TradeCurrency); var sellValue = sell.Quantity * sellFx.Rate; var buyValue = buy.Quantity * buyFx.Rate; if (element.IsBuy()) // BUY { var realizedPnl = buyValue + sellValue; var debit = new Journal(accountBuy, Event.SETTLED_CASH, env.ValueDate) { Source = element.LpOrderId, Fund = env.GetFund(element), FxCurrency = element.TradeCurrency, Symbol = element.Symbol, SecurityId = element.SecurityId, Quantity = Convert.ToDouble(buy.Quantity), FxRate = buyFx.Rate, StartPrice = 0, EndPrice = 0, Value = env.SignedValue(accountBuy, accountSell, true, buyValue), CreditDebit = env.DebitOrCredit(accountBuy, buy.Quantity), }; var credit = new Journal(accountSell, Event.SETTLED_CASH, env.ValueDate) { Source = element.LpOrderId, Fund = env.GetFund(element), FxCurrency = element.SettleCurrency, Symbol = element.Symbol, SecurityId = element.SecurityId, Quantity = Convert.ToDouble(sell.Quantity), FxRate = sellFx.Rate, StartPrice = 0, EndPrice = 0, Value = env.SignedValue(accountBuy, accountSell, true, sellValue), CreditDebit = env.DebitOrCredit(accountSell, sell.Quantity), }; env.Journals.AddRange(new[] { credit, debit }); var originalAccount = AccountUtils.GetDerivativeAccountType(realizedPnl); // Realized Pnl to go along with the Settled Cash CommonRules.GenerateJournalEntry(env, element, listOfTags, realizedAccountType, Event.REALIZED_PNL, realizedPnl); CommonRules.GenerateJournalEntries(env, element, listOfTags, originalAccount, "Change in Unrealized Derivatives Contracts at Fair Value", realizedPnl * -1); } else // SELL { var realizedPnl = buyValue + sellValue; var debit = new Journal(accountBuy, Event.SETTLED_CASH, env.ValueDate) { Source = element.LpOrderId, Fund = env.GetFund(element), FxCurrency = element.TradeCurrency, Symbol = element.Symbol, SecurityId = element.SecurityId, Quantity = Convert.ToDouble(buy.Quantity), FxRate = buyFx.Rate, StartPrice = 0, EndPrice = 0, Value = env.SignedValue(accountBuy, accountSell, true, buy.Quantity * buyFx.Rate), CreditDebit = env.DebitOrCredit(accountBuy, buy.Quantity), }; var credit = new Journal(accountSell, Event.SETTLED_CASH, env.ValueDate) { Source = element.LpOrderId, Fund = env.GetFund(element), FxCurrency = element.SettleCurrency, Symbol = element.Symbol, SecurityId = element.SecurityId, Quantity = Convert.ToDouble(sell.Quantity), FxRate = sellFx.Rate, StartPrice = 0, EndPrice = 0, Value = env.SignedValue(accountBuy, accountSell, true, sell.Quantity * sellFx.Rate), CreditDebit = env.DebitOrCredit(accountSell, sell.Quantity), }; env.Journals.AddRange(new[] { credit, debit }); var originalAccount = AccountUtils.GetDerivativeAccountType(realizedPnl); // Realized Pnl to go along with the Settled Cash CommonRules.GenerateJournalEntry(env, element, listOfTags, realizedAccountType, Event.REALIZED_PNL, realizedPnl); CommonRules.GenerateJournalEntries(env, element, listOfTags, originalAccount, "Change in Unrealized Derivatives Contracts at Fair Value", realizedPnl * -1); } if (taxlot.Quantity != 0) { var buyTrade = env.FindTrade(taxlot.OpenId); CommonRules.RelieveTaxLot(env, buyTrade, element, taxlot.Quantity * -1, true); taxlot.Quantity = 0; taxlot.Status = "Closed"; //Now we have Realized Pnl } } }