// konstruktor, wywoływany spod BosPapers.Update()
 internal BosPaper(BosAccount account, DTO.Paper data)
 {
     Account     = account;
     Instrument  = BosInstrument.Create(data.Instrument);
     Quantity110 = data.Account110;
     Quantity120 = data.Account120;
 }
		// konstruktor, wywoływany spod BosPapers.Update()
		internal BosPaper(BosAccount account, DTO.Paper data)
		{
			Account = account;
			Instrument = BosInstrument.Create(data.Instrument);
			Quantity110 = data.Account110;
			Quantity120 = data.Account120;
		}
        /// <summary>
        /// Wysłanie do systemu nowego zlecenia z podanymi parametrami.
        /// <para>Zobacz też metody klasy BosInstrument: Order, Buy, Sell - które od razu określają,
        /// którego instrumentu dane zlecenie ma dotyczyć i ewentualnie prezyzują też stronę transakcji (kupno/sprzedaż)</para>
        /// </summary>
        /// <param name="account">Rachunek, na który zostaje przeznaczone to zlecenie.</param>
        /// <param name="instrument">Instrument, którego walory chcemy kupić/sprzedać.</param>
        /// <param name="side">Zlecenie kupna (BosOrderSide.Buy) czy sprzedaży (BosOrderSide.Sell).</param>
        /// <param name="price">Limit ceny, jaki wstawiamy do zlecenia (BosPrice.PKC/PCR/PCRO... lub po prostu kwota).</param>
        /// <param name="activationPrice">Ewentualny limit aktywacji zlecenia (null, jeśli aktywowane od razu, bez stop'a).</param>
        /// <param name="quantity">Liczba walorów, jaką zamierzamy kupić/sprzedać.</param>
        /// <param name="minimumQuantity">Minimalna liczba walorów, jaka musi się zrealizować, albo zlecenie będzie anulowane.
        /// Podając tutaj to samo, co w polu "quantity", uzyskujemy zlecenie typu "WuA".</param>
        /// <param name="visibleQuantity">Liczba walorów ujawniana w arkuszu ofert ("WUJ").</param>
        /// <param name="immediateOrCancel">Czy to zlecenie typu "WiA" (to, co nie wykona się natychmiast, jest od razu anulowane).</param>
        /// <param name="expirationDate">Data ważności zlecenia (null, jeśli tylko na bieżącą sesję).</param>
        public static void Create(BosAccount account, BosInstrument instrument,
                                  BosOrderSide side, BosPrice price, decimal?activationPrice,
                                  uint quantity, uint?minimumQuantity, uint?visibleQuantity, bool immediateOrCancel, DateTime?expirationDate)
        {
            var data = new OrderData();

            data.AccountNumber              = account.Number;
            data.MainData                   = new OrderMainData();
            data.MainData.CreateTime        = DateTime.Now;
            data.MainData.Instrument        = instrument.Convert();
            data.MainData.Side              = side;
            data.MainData.PriceType         = price.Type;
            data.MainData.PriceLimit        = price.NumValue;
            data.MainData.ActivationPrice   = activationPrice;
            data.MainData.Quantity          = quantity;
            data.MainData.MinimumQuantity   = minimumQuantity;
            data.MainData.VisibleQuantity   = visibleQuantity;
            data.MainData.ImmediateOrCancel = immediateOrCancel;
            data.MainData.ExpirationDate    = expirationDate;
            account.api.Connection.OrderCreate(data);
            // TODO: Zastanawiam się jeszczcze m.in. co z ClientId, TradeDate... i czy w ogóle byłby sens
            // od razu tworzyć taki nowy obiekt BosOrder (zamiast zaczekać aż sam się doda przy OrderUpdate).
        }
		private ListViewGroup GetAccountGroup(BosAccount account)
		{
			var group = accountsView.Groups[account.Number];
			if (group == null)
			{
				group = new ListViewGroup(account.Number, "Account: " + account.Number);
				accountsView.Groups.Add(group);
			}
			else
			{
				var oldItems = group.Items.OfType<ListViewItem>().ToArray();
				foreach (var item in oldItems)
					accountsView.Items.Remove(item);
			}
			return group;
		}
		// ----- ustawianie listview z informacjami o rachunkach ----- 

		private void UpdateAccountInfo(BosAccount account)
		{
			accountsView.BeginUpdate();
			try
			{
				var group = GetAccountGroup(account);
				foreach (var paper in account.Papers)
					AddAccountPaperItem(group, paper);
				foreach (var order in account.Orders)
					if (order.IsActive) AddAccountOrderItem(group, order);
				AddAccountFundItem(group, "Total", account.PortfolioValue, null, null);
				AddAccountFundItem(group, "Deposit", account.DepositBlocked, "deficit", account.DepositDeficit);
				AddAccountFundItem(group, "Available", account.AvailableFunds, "cash", account.AvailableCash);
			}
			finally
			{
				accountsView.EndUpdate();
			}
		}
 // konstruktor wywoływany w klasie BosOrders, gdy pojawia się nowy numer zlecenia
 internal BosOrder(BosAccount account, OrderData data)
 {
     Account = account;
     Id      = data.BrokerId;
     Update(data);
 }
 // konstruktor, wywoływany z samej klasy BosAccount
 internal BosPapers(BosAccount account)
 {
     Account = account;
 }
 // konstruktor, wywoływany z samej klasy BosAccount
 internal BosOrders(BosAccount account)
 {
     Account = account;
 }
		/// <summary>
		/// Wysłanie do systemu nowego zlecenia z podanymi parametrami. 
		/// <para>Zobacz też metody klasy BosInstrument: Order, Buy, Sell - które od razu określają, 
		/// którego instrumentu dane zlecenie ma dotyczyć i ewentualnie prezyzują też stronę transakcji (kupno/sprzedaż)</para>
		/// </summary>
		/// <param name="account">Rachunek, na który zostaje przeznaczone to zlecenie.</param>
		/// <param name="instrument">Instrument, którego walory chcemy kupić/sprzedać.</param>
		/// <param name="side">Zlecenie kupna (BosOrderSide.Buy) czy sprzedaży (BosOrderSide.Sell).</param>
		/// <param name="price">Limit ceny, jaki wstawiamy do zlecenia (BosPrice.PKC/PCR/PCRO... lub po prostu kwota).</param>
		/// <param name="activationPrice">Ewentualny limit aktywacji zlecenia (null, jeśli aktywowane od razu, bez stop'a).</param>
		/// <param name="quantity">Liczba walorów, jaką zamierzamy kupić/sprzedać.</param>
		/// <param name="minimumQuantity">Minimalna liczba walorów, jaka musi się zrealizować, albo zlecenie będzie anulowane.
		/// Podając tutaj to samo, co w polu "quantity", uzyskujemy zlecenie typu "WuA".</param>
		/// <param name="visibleQuantity">Liczba walorów ujawniana w arkuszu ofert ("WUJ").</param>
		/// <param name="immediateOrCancel">Czy to zlecenie typu "WiA" (to, co nie wykona się natychmiast, jest od razu anulowane).</param>
		/// <param name="expirationDate">Data ważności zlecenia (null, jeśli tylko na bieżącą sesję).</param>
		public static void Create(BosAccount account, BosInstrument instrument, 
			BosOrderSide side, BosPrice price, decimal? activationPrice,
			uint quantity, uint? minimumQuantity, uint? visibleQuantity, bool immediateOrCancel, DateTime? expirationDate)
		{
			var data = new OrderData();
			data.AccountNumber = account.Number;
			data.MainData = new OrderMainData();
			data.MainData.CreateTime = DateTime.Now;
			data.MainData.Instrument = instrument.Convert();
			data.MainData.Side = side;
			data.MainData.PriceType = price.Type;
			data.MainData.PriceLimit = price.NumValue;
			data.MainData.ActivationPrice = activationPrice;
			data.MainData.Quantity = quantity;
			data.MainData.MinimumQuantity = minimumQuantity;
			data.MainData.VisibleQuantity = visibleQuantity;
			data.MainData.ImmediateOrCancel = immediateOrCancel;
			data.MainData.ExpirationDate = expirationDate;
			account.api.Connection.OrderCreate(data);
			// TODO: Zastanawiam się jeszczcze m.in. co z ClientId, TradeDate... i czy w ogóle byłby sens
			// od razu tworzyć taki nowy obiekt BosOrder (zamiast zaczekać aż sam się doda przy OrderUpdate).
		}
		// konstruktor wywoływany w klasie BosOrders, gdy pojawia się nowy numer zlecenia
		internal BosOrder(BosAccount account, OrderData data)
		{
			Account = account;
			Id = data.BrokerId;
			Update(data);
		}