/// <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);
				}
			}
		}