private void AddCoin(CoinConfig coin, CoinData downloadedCoin, int index)
        {
            //Store the intial coin price at startup
            if(coin.SetStartupPrice)
                coin.StartupPrice = downloadedCoin.Price;

            //Create the gui line
            CoinGuiLine newLine = new CoinGuiLine(downloadedCoin.ShortName, index);

            //Set the bought and paid amounts
            newLine.BoughtTextBox.Text = coin.bought.ToString();
            newLine.PaidTextBox.Text = coin.paid.ToString();

            //Add the line elements to gui
            MethodInvoker invoke = delegate
            {
                Height += 25;
                Controls.Add(newLine.CoinLabel);
                Controls.Add(newLine.PriceLabel);
                Controls.Add(newLine.BoughtTextBox);
                Controls.Add(newLine.TotalLabel);
                Controls.Add(newLine.PaidTextBox);
                Controls.Add(newLine.ProfitLabel);
                Controls.Add(newLine.ChangeDollarLabel);
                Controls.Add(newLine.ChangePercentLabel);
                Controls.Add(newLine.Change24HrPercentLabel);
            };
            Invoke(invoke);

            //Add line to list
            _coinGuiLines.Add(newLine);
        }
        public void UpdateCoins(string response)
        {
            if (InvokeRequired)
            {
                Invoke(new UpdateCoinDelegates(UpdateCoins), response);
                return;
            }

            //Overall values
            decimal totalPaid = 0;
            decimal overallTotal = 0;
            decimal totalNegativeProfits = 0;
            decimal totalPostivieProfits = 0;

            //Index of coin gui line
            int index = 0;

            List<CoinData> coins = new List<CoinData>();

            //Deserialize settings
            JsonSerializerSettings settings = new JsonSerializerSettings
            {
                NullValueHandling = NullValueHandling.Ignore,
                MissingMemberHandling = MissingMemberHandling.Ignore
            };

            //Deserialize response and map to generic coin
            switch (_api)
            {
                case API_COIN_MARKET_CAP:
                    var coinsCoinMarketCap = JsonConvert.DeserializeObject<List<ApiCoinMarketCap>>(response, settings);
                    coins = coinsCoinMarketCap.Select(c => Mappings.MapCoinMarketCap(c)).ToList();
                    break;
                case API_COIN_CAP:
                    var coinsCoinCap = JsonConvert.DeserializeObject<List<ApiCoinCap>>(response, settings);
                    coins = coinsCoinCap.Select(c => Mappings.MapCoinCap(c)).ToList();
                    break;
            }

            //Create list of coin names
            _coinNames = coins.OrderBy(c => c.ShortName).Select(c => c.ShortName).ToList();

            //Loop through all coins from config
            foreach (CoinConfig coin in _coinConfigs)
            {
                CoinData downloadedCoin;

                //Parse coins, if coin doesnt exist set to 0
                if (coins.Any(c => c.ShortName == coin.coin))
                    downloadedCoin = coins.Single(c => c.ShortName == coin.coin);
                else
                    downloadedCoin = new CoinData { ShortName = coin.coin, Change1HourPercent = 0, Change24HourPercent = 0, Price = 0 };

                //Check if gui lines need to be loaded
                if (_loadGuiLines)
                    AddCoin(coin, downloadedCoin, index);

                //Incremenet coin line index
                index++;
                
                //Check if coinguiline exists for coinConfig
                if (!_coinGuiLines.Any(cg => cg.CoinName.Equals(downloadedCoin.ShortName)))
                {
                    RemoveDelegate remove = new RemoveDelegate(Remove);
                    BeginInvoke(remove);
                    return;
                }

                //Get the gui line for coin
                CoinGuiLine line = (from c in _coinGuiLines where c.CoinName.Equals(downloadedCoin.ShortName) select c).First();

                //Calculate
                decimal bought = Convert.ToDecimal(line.BoughtTextBox.Text);
                decimal paid = Convert.ToDecimal(line.PaidTextBox.Text);
                decimal total = bought * downloadedCoin.Price;
                decimal profit = total - paid;
                decimal changeDollar = downloadedCoin.Price - coin.StartupPrice;
                decimal changePercent = ((downloadedCoin.Price - coin.StartupPrice) / coin.StartupPrice) * 100;

                if (profit >= 0)
                    totalPostivieProfits += profit;
                else
                    totalNegativeProfits += profit;

                //Add to totals
                totalPaid += paid;
                overallTotal += paid + profit;

                //Update gui
                line.CoinLabel.Show();
                line.CoinLabel.Text = downloadedCoin.ShortName;
                line.PriceLabel.Text = $"${downloadedCoin.Price}";
                line.TotalLabel.Text = $"${total:0.00}";
                line.ProfitLabel.Text = $"${profit:0.00}";
                line.ChangeDollarLabel.Text = $"${changeDollar:0.000000}";
                line.ChangePercentLabel.Text = $"{changePercent:0.00}%";
                line.Change24HrPercentLabel.Text = $"{downloadedCoin.Change24HourPercent}%";
            }

            //Update gui
            lblOverallTotal.Text = $"${overallTotal:0.00}";
            lblTotalProfit.ForeColor = overallTotal - totalPaid >= 0 ? Color.Green : Color.Red;
            lblTotalProfit.Text = $"${overallTotal - totalPaid:0.00}";
            lblTotalNegativeProfit.Text = $"${totalNegativeProfits:0.00}";
            lblTotalPositiveProfit.Text = $"${totalPostivieProfits:0.00}";
            lblStatus.Text = "Status: Sleeping";
            _refreshTime = DateTime.Now;

            //Sleep and rerun
            _loadGuiLines = false;
        }