/// <summary> /// Przykład obsługi odebranego w klasie NolClient komunikatu asynchronicznego. /// </summary> /// <param name="msg">Tutaj - obiekt komunikatu FIXML typu Statement</param> static void nol_StatementMsgHandler(StatementMsg msg) { decimal cash = 0; foreach (var statement in msg.Statements) if (statement.Funds.ContainsKey(StatementFundType.Cash)) cash += statement.Funds[StatementFundType.Cash]; Console.WriteLine("\nCash summary from all accounts = " + cash + "\n"); }
// wewnętrzna obsługa komunikatu "Statement" // - wywołuje zdarzenia "AccountUpdateEvent", po jednym na każdy rachunek private void StatementMsgHandler(StatementMsg msg) { if (AccountUpdateEvent != null) { foreach (var statement in msg.Statements) { var account = new AccountData(); account.Number = statement.AccountNumber; // otwarte pozycje... account.Papers = statement.Positions. Select(p => new Paper { Instrument = p.Key.Convert(), Account110 = p.Value.Acc110, Account120 = p.Value.Acc120, }).ToArray(); // najważniejsze kwoty... account.AvailableCash = statement.Funds[StatementFundType.Cash]; if (!statement.Funds.ContainsKey(StatementFundType.Deposit)) { // rachunek akcyjny account.AvailableFunds = statement.Funds[StatementFundType.CashReceivables]; } else { // rachunek kontraktowy account.AvailableFunds = account.AvailableCash + statement.Funds[StatementFundType.DepositFree]; if (statement.Funds.ContainsKey(StatementFundType.DepositDeficit)) account.DepositDeficit = statement.Funds[StatementFundType.DepositDeficit]; account.DepositBlocked = statement.Funds[StatementFundType.DepositBlocked]; account.DepositValue = statement.Funds[StatementFundType.Deposit]; } account.PortfolioValue = statement.Funds[StatementFundType.PortfolioValue]; // wywołanie zdarzenia z przygotowanymi danymi AccountUpdateEvent(account); } } }