コード例 #1
0
ファイル: Conversion.cs プロジェクト: RefX64/PegaTrade
        private static CoinDisplay ToCoinDisplay(this CryptoCoin item, Types.CoinCurrency currency)
        {
            // Why manually and not auto-mapper? Tons of data, and most used method. So Mapster can get slow.
            // Also, You cannot cast a child object into a parent object. Need to create a new instance of it or use reflection.

            return(new CoinDisplay
            {
                CoinId = item.CoinId,
                Symbol = item.Symbol,
                Shares = item.Shares,
                OrderDate = item.OrderDate,
                PricePerUnit = item.PricePerUnit,
                CoinCurrency = item.CoinCurrency,
                TotalPricePaidUSD = item.TotalPricePaidUSD,
                OrderType = item.OrderType,
                Notes = item.Notes,
                Exchange = item.Exchange,
                SoldCoinCurrency = item.SoldCoinCurrency,
                SoldPricePerUnit = item.SoldPricePerUnit,
                TotalSoldPricePaidUSD = item.TotalSoldPricePaidUSD,
                PortfolioId = item.PortfolioId,
                MarketCoin = item.MarketCoin,
                GeneratedPricePerUnitETH = item.GeneratedPricePerUnitETH,
                CurrentUSDPriceOfBTC = item.CurrentUSDPriceOfBTC,
                CurrentUSDPriceOfETH = item.CurrentUSDPriceOfETH,
                OrderedDateUSDPriceOfBTC = item.OrderedDateUSDPriceOfBTC,
                OrderedDateUSDPriceOfETH = item.OrderedDateUSDPriceOfETH,
                DisplayCurrency = currency,
                IsCurrentlyCombined = item.IsCurrentlyCombined
            });
        }
コード例 #2
0
        public void GetAllCoinsAndTestProfitLoss()
        {
            Types.CoinCurrency currency = Types.CoinCurrency.USD;

            List <CryptoCoin> coins           = Deserialize <List <CryptoCoin> >(TestUtilities.File_ReadAllLinesSingle(TestUtilities.GeneratePath(@"TestFiles\Coins\Portfolio_Ref_12-13-17_BitTrexOnly.json")));
            List <MarketCoin> apiFetchedCoins = Deserialize <List <MarketCoin> >(TestUtilities.File_ReadAllLinesSingle(TestUtilities.GeneratePath(@"TestFiles\Coins\CoinMarketCap_12-13-17_getall_coins.json")));

            // Todo: for non CoinCurrency.USD items.
            // Dictionary<int, HistoricCoinPrice> historicPrices = new Dictionary<int, HistoricCoinPrice>();
            // if ((currency == Types.CoinCurrency.BTC || currency == Types.CoinCurrency.ETH) && coins.Any(x => x.OrderDate > DateTime.MinValue)) { historicPrices = await GetAllHistoricCoinPrices(); }

            List <CryptoCoin> updatedCoins = CryptoLogic.UpdateCoinsCurrentPrice(coins, apiFetchedCoins, new Dictionary <int, HistoricCoinPrice>(), useCombinedDisplay: true);

            List <CoinDisplay> displayModeCoins = updatedCoins.ToCoinDisplay(currency);

            CoinsVM vm = new CoinsVM(displayModeCoins)
            {
                DisplayCurrency = currency
            };

            //vm.CalculateCurrentHoldingProfit();
            //vm.CalculateSoldProfit();

            //Console.WriteLine(vm.CurrentHoldingMarketValue());
        }
コード例 #3
0
ファイル: Utilities.cs プロジェクト: RefX64/PegaTrade
 public static string ToWholeNumberByCurrency(this decimal dec, Types.CoinCurrency displayType)
 {
     if (displayType == Types.CoinCurrency.BTC || displayType == Types.CoinCurrency.ETH)
     {
         return(dec.ToString(new CultureInfo("en-US")));
     }
     return(dec.ToRoundedWholeNumber().ToString(new CultureInfo("en-US")));
 }
コード例 #4
0
ファイル: Conversion.cs プロジェクト: RefX64/PegaTrade
 public static List <CoinDisplay> ToCoinDisplay(this List <CryptoCoin> items, Types.CoinCurrency currency)
 {
     if (items.IsNullOrEmpty())
     {
         return(new List <CoinDisplay>());
     }
     return(items.Select(x => x.ToCoinDisplay(currency)).ToList());
 }
コード例 #5
0
 /// <summary>
 /// Gets the latest price of Coin Currency.  For example, if we want the current price of BTC, we pass in BTC as coin currency.
 /// </summary>
 public static decimal GetLatestPriceOfCurrency(Types.CoinCurrency coinCurrency, List <MarketCoin> marketCoins)
 {
     if (coinCurrency == Types.CoinCurrency.BTC)
     {
         return(marketCoins.FirstOrDefault(x => x.Symbol == "BTC").CurrentSymbolPriceUSD);
     }
     if (coinCurrency == Types.CoinCurrency.ETH)
     {
         return(marketCoins.FirstOrDefault(x => x.Symbol == "ETH").CurrentSymbolPriceUSD);
     }
     return(0);
 }
コード例 #6
0
ファイル: Utilities.cs プロジェクト: RefX64/PegaTrade
        private static string GetCurrencySymbol(Types.CoinCurrency currency)
        {
            switch (currency)
            {
            case Types.CoinCurrency.USD: return("$");

            case Types.CoinCurrency.BTC: return("฿");

            case Types.CoinCurrency.ETH: return("ξ");

            case Types.CoinCurrency.EUR: return("£");

            default: return("$");
            }
        }
コード例 #7
0
 /// <summary>
 /// Gets the price per unit of the coin based on currency. For example, Coin-USD: $500, Coin-BTC: .1
 /// </summary>
 public static decimal GetPricePerUnitOfCoin(CryptoCoin coin, Types.CoinCurrency currency)
 {
     if (currency == Types.CoinCurrency.BTC)
     {
         return(coin.MarketCoin.CurrentSymbolPriceBTC);
     }
     if (currency == Types.CoinCurrency.USD)
     {
         return(coin.MarketCoin.CurrentSymbolPriceUSD);
     }
     if (currency == Types.CoinCurrency.ETH)
     {
         return(coin.CurrentSymbolPriceETH);
     }
     return(0);
 }
コード例 #8
0
        public async Task <decimal> GetCurrentCoinPrice(string symbol)
        {
            Types.CoinCurrency predictedCurrency = CryptoLogic.GenerateCoinCurrencyFromSymbol(symbol);
            if (predictedCurrency == Types.CoinCurrency.Unknown)
            {
                return(0);
            }

            CryptoCoin coin = (await UpdateCoinsCurrentPrice(new List <CryptoCoin> {
                new CryptoCoin {
                    Symbol = symbol.ToUpperInvariant()
                }
            }, false)).First();

            return(CryptoLogic.GetPricePerUnitOfCoin(coin, predictedCurrency));
        }
コード例 #9
0
        public async Task <JsonResult> GetGeneratedWatchOnlyDetails(string symbol)
        {
            Types.CoinCurrency predictedCurrency = CryptoLogic.GenerateCoinCurrencyFromSymbol(symbol);
            if (predictedCurrency == Types.CoinCurrency.Unknown)
            {
                return(Json(ResultsItem.Error("Unknown currency type. Please use USD-, BTC-, or ETH-")));
            }

            CryptoCoin coin = (await UpdateCoinsCurrentPrice(new List <CryptoCoin> {
                new CryptoCoin {
                    Symbol = symbol.ToUpperInvariant()
                }
            }, false)).First();

            if (coin.MarketCoin?.CurrentSymbolPriceUSD <= 0)
            {
                return(Json(ResultsItem.Error("This coin/symbol was not found. Did you use the correct format? E.g. BTC-XRP")));
            }

            decimal pricePerUnit = CryptoLogic.GetPricePerUnitOfCoin(coin, predictedCurrency);
            decimal quantity     = decimal.Round(100 / coin.MarketCoin.CurrentSymbolPriceUSD, 5);

            return(Json(new { pricePerUnit, quantity }));
        }
コード例 #10
0
ファイル: Utilities.cs プロジェクト: RefX64/PegaTrade
 public static string Symbol(this Types.CoinCurrency currency)
 {
     return(GetCurrencySymbol(currency));
 }
コード例 #11
0
        /// <summary>
        /// Gets the latest price of Coin Currency.  For example, if we want the current price of BTC, we pass in BTC as coin currency.
        /// </summary>
        public static decimal GetLatestPriceOfSymbol(string symbol, List <MarketCoin> marketCoins, Types.CoinCurrency currency = Types.CoinCurrency.USD)
        {
            MarketCoin marketCoin = marketCoins.FirstOrDefault(x => x.Symbol == symbol.Split('-')[1].ToUpperInvariant());

            if (marketCoin == null)
            {
                return(0);
            }

            if (currency == Types.CoinCurrency.USD)
            {
                return(marketCoin.CurrentSymbolPriceUSD);
            }
            if (currency == Types.CoinCurrency.BTC)
            {
                return(marketCoin.CurrentSymbolPriceBTC);
            }
            if (currency == Types.CoinCurrency.ETH)
            {
                MarketCoin ethCoin = marketCoins.FirstOrDefault(x => x.Symbol == "ETH");
                return(marketCoin.CurrentSymbolPriceUSD / ethCoin.CurrentSymbolPriceUSD);
            }
            return(0);
        }
コード例 #12
0
        /// <summary>
        /// Get's the price of BTC or ETH at the specified date. For example, how much was BTC on 6/1/2017?
        /// Epoch time must be at 12am. Use: DateTime.ToEpochDayAt12am()
        /// </summary>
        public static decimal GetPriceOfETHorBTCOnSpecificDate(Dictionary <int, HistoricCoinPrice> historicData, int epochTimeInt, Types.CoinCurrency currency)
        {
            if (historicData.ContainsKey(epochTimeInt))
            {
                return(currency == Types.CoinCurrency.ETH ? (decimal)historicData[epochTimeInt].USD_ETH_Price : (decimal)historicData[epochTimeInt].USD_BTH_Price);
            }

            return(0);
        }
コード例 #13
0
        /// <summary>
        /// Calculates the total price paid of a trade. When you place a buy/sell order, you do not know the actual USD price paid/sold.
        /// This method will calculate that based on the coin's order date & historic data on BTC/ETH.
        /// </summary>
        /// <param name="coin">The coin to generate price for</param>
        /// <param name="historicData">Historic prices of BTC/ETH</param>
        /// <param name="forceUseCurrency">Ignore coin's default currency, and use the forced currency.</param>
        /// <returns>Total Price paid USD</returns>
        public static decimal GenerateTotalPricePaidUSD(CryptoCoin coin, Dictionary <int, HistoricCoinPrice> historicData, Types.CoinCurrency forceUseCurrency = Types.CoinCurrency.Unknown)
        {
            // E.g. USDT-BTC -> PricePerUnit (one whole unit): $5000, TotalShares: .5. TotalPricePaidUSD: $2500
            if (coin.CoinCurrency == Types.CoinCurrency.USD)
            {
                return(coin.PricePerUnit * coin.Shares);
            }

            int epochTimeInt = coin.OrderDate.ToEpochDayAt12am();

            if (historicData.ContainsKey(epochTimeInt))
            {
                // E.g. ETH-GNT -> Currency:ETH. June 1st, 2017, ETH Price: $300. PricePerUnit: .0008, Shares: 5000. CurrentETH: $320, CurrentPPU: .0009
                // Total Price Paid: ((.0008*5000)*300)=$1200... CurrentPriceWorth: ((.0009*5000)*320)=$1440. Profit: $240
                decimal coinCurrencyPriceUSD = (coin.CoinCurrency == Types.CoinCurrency.ETH || forceUseCurrency == Types.CoinCurrency.ETH)
                                                                     ? (decimal)historicData[epochTimeInt].USD_ETH_Price : (decimal)historicData[epochTimeInt].USD_BTH_Price;

                return((coin.PricePerUnit * coin.Shares) * coinCurrencyPriceUSD);
            }

            return(0);
        }
コード例 #14
0
        public static List <CryptoCoin> UpdateCoinsCurrentPrice(List <CryptoCoin> coins, List <MarketCoin> apiFetchedCoins, Dictionary <int, HistoricCoinPrice> historicPrices, bool useCombinedDisplay = true, Types.CoinCurrency currency = Types.CoinCurrency.USD)
        {
            MarketCoin btcCoin = apiFetchedCoins.FirstOrDefault(x => x.Symbol == "BTC");
            MarketCoin ethCoin = apiFetchedCoins.FirstOrDefault(x => x.Symbol == "ETH");

            if (btcCoin == null || ethCoin == null)
            {
                return(coins);
            }

            coins = CorrectCryptoCoinSymbols(coins);

            if (useCombinedDisplay)
            {
                coins = ToCoinsCombinedMode(coins);
            }

            foreach (CryptoCoin coin in coins)
            {
                string[] supportedSymbolPrefix = { "BTC-", "ETH-", "USDT-", "USD-" };
                if (!supportedSymbolPrefix.Any(x => coin.Symbol.StartsWith(x)))
                {
                    continue;
                }                                                                             // We do not support anything other than BTC, ETH, USD

                string[] symbol = coin.Symbol.Contains("-") ? coin.Symbol.Split('-') : new[] { "", coin.Symbol };

                coin.CurrentUSDPriceOfBTC = btcCoin.CurrentSymbolPriceUSD;
                coin.CurrentUSDPriceOfETH = ethCoin.CurrentSymbolPriceUSD;

                if (coin.OrderDate != DateTime.MinValue)
                {
                    coin.OrderedDateUSDPriceOfBTC = GetPriceOfETHorBTCOnSpecificDate(historicPrices, coin.OrderDate.ToEpochDayAt12am(), Types.CoinCurrency.BTC);
                    if (currency == Types.CoinCurrency.ETH)
                    {
                        coin.OrderedDateUSDPriceOfETH = GetPriceOfETHorBTCOnSpecificDate(historicPrices, coin.OrderDate.ToEpochDayAt12am(), Types.CoinCurrency.ETH);
                        if (coin.OrderedDateUSDPriceOfETH > 0)
                        {
                            coin.GeneratedPricePerUnitETH = (coin.TotalPricePaidUSD.GetValueOrDefault() / coin.Shares) / coin.OrderedDateUSDPriceOfETH;
                        }
                    }
                }

                MarketCoin fetchedCoin = apiFetchedCoins.FirstOrDefault(x => x.Symbol.Contains(symbol[1]));
                if (fetchedCoin == null)
                {
                    continue;
                }

                coin.MarketCoin.CurrentSymbolPriceBTC = fetchedCoin.CurrentSymbolPriceBTC;
                coin.MarketCoin.CurrentSymbolPriceUSD = fetchedCoin.CurrentSymbolPriceUSD;
                coin.MarketCoin.Name            = fetchedCoin.Name;
                coin.MarketCoin.CoinMarketCapID = fetchedCoin.CoinMarketCapID;
            }

            return(coins);
        }
コード例 #15
0
        private async Task <List <CryptoCoin> > UpdateCoinsCurrentPrice(List <CryptoCoin> coins, bool useCombinedDisplay = true, Types.CoinCurrency currency = Types.CoinCurrency.USD)
        {
            // Get all API coins that has the latest price, and etc. (CoinMarketCap price get)
            List <MarketCoin> apiFetchedCoins = await GetAllCoinsMarketDetailsAPI();

            Dictionary <int, HistoricCoinPrice> historicPrices = new Dictionary <int, HistoricCoinPrice>();

            if ((currency == Types.CoinCurrency.BTC || currency == Types.CoinCurrency.ETH) && coins.Any(x => x.OrderDate > DateTime.MinValue))
            {
                historicPrices = await GetAllHistoricCoinPrices();
            }

            return(CryptoLogic.UpdateCoinsCurrentPrice(coins, apiFetchedCoins, historicPrices, useCombinedDisplay, currency));
        }