コード例 #1
0
            /// <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);
                    }
                }
                    );
            }
コード例 #2
0
            /// <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);
            }
コード例 #3
0
            /// <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);
            }