/// <summary> /// associates specified <paramref name="transaction"/> with this <see cref="PortfolioEntry"/>. /// </summary> /// <param name="transaction"></param> private void addTransaction(Transaction transaction) { PortfolioDatabaseManager.Instance.ExecuteAsOneAction( () => { // add to transaction history stored in database PortfolioDatabaseManager.Instance.AddTransaction(transaction, this.Id); // handel transaction ExchangeCoinHolding affectedExchangeCoinHolding = handleTransaction(transaction, out bool newExchangeCoinHoldingAdded); if (newExchangeCoinHoldingAdded) { PortfolioDatabaseManager.Instance.AddExchangeCoinHolding( affectedExchangeCoinHolding, this.Id); } else { PortfolioDatabaseManager.Instance.UpdateExchangeCoinHolding( affectedExchangeCoinHolding, this.Id); } } ); }
/// <summary> /// returns amount of coins of <see cref="CoinId"/> stored in exchange having /// specified <paramref name="exchangeName"/>. /// </summary> /// <param name="exchangeName"></param> /// <returns> /// amount of coins of <see cref="CoinId"/> stored in exchange having /// specified <paramref name="exchangeName"/> /// </returns> internal double GetCoinHoldings(string exchangeName) { double coinHoldings; if (this.exchangeNameToExchangeCoinHolding.ContainsKey(exchangeName)) { // specified exchange has coin holdings ExchangeCoinHolding exchangeCoinHolding = this.exchangeNameToExchangeCoinHolding[exchangeName]; coinHoldings = exchangeCoinHolding.Amount; } else { // specified exchange has no coin holdings coinHoldings = 0.0; } return(coinHoldings); }
/// <summary> /// handles specified <paramref name="transaction"/> and returns /// <see cref="ExchangeCoinHolding"/> associated with it. /// </summary> /// <param name="transaction"></param> /// <param name="newExchangeCoinHoldingAdded"> /// whether a new <see cref="ExchangeCoinHolding"/> was created in the process of /// handling specified <paramref name="transaction"/>. /// </param> /// <returns> /// <see cref="ExchangeCoinHolding"/> associated with handled <paramref name="transaction"/> /// </returns> private ExchangeCoinHolding handleTransaction( Transaction transaction, out bool newExchangeCoinHoldingAdded) { assertValidPrice(transaction.PricePerCoin); ExchangeCoinHolding affectedExchangeCoinHolding; if (transaction.TransactionType == Transaction.eTransactionType.Buy) // buy transaction { if (this.exchangeNameToExchangeCoinHolding.ContainsKey(transaction.ExchangeName)) { affectedExchangeCoinHolding = this.exchangeNameToExchangeCoinHolding[transaction.ExchangeName]; affectedExchangeCoinHolding.HandleTransaction(transaction); newExchangeCoinHoldingAdded = false; } else { affectedExchangeCoinHolding = new ExchangeCoinHolding( transaction.CoinId, transaction.ExchangeName, transaction.Amount, transaction.PricePerCoin); this.exchangeNameToExchangeCoinHolding.Add( affectedExchangeCoinHolding.ExchangeName, affectedExchangeCoinHolding); newExchangeCoinHoldingAdded = true; } } else // sell transaction { newExchangeCoinHoldingAdded = false; if (this.exchangeNameToExchangeCoinHolding.ContainsKey(transaction.ExchangeName)) { affectedExchangeCoinHolding = this.exchangeNameToExchangeCoinHolding[transaction.ExchangeName]; if (affectedExchangeCoinHolding.Amount >= transaction.Amount) { affectedExchangeCoinHolding.HandleTransaction(transaction); } else { throw new InsufficientFundsException( this.CoinId, transaction.ExchangeName, affectedExchangeCoinHolding.Amount); } } else { throw new InsufficientFundsException( this.CoinId, transaction.ExchangeName, 0.0); } } updateDynamicData(); return(affectedExchangeCoinHolding); }