public async void StartYourEngines() { logger.Trace("Enumerate Markets"); // enumerate all markets // coins to remove like stable-coins and BTC, ETH. string[] coinsToRemove = { "USDC", "BUSD", "USDT", "DAI", "BTC", "ETH", "PAX", "XRP" }; var tickers = await api.GetTickersAsync(); tickers = tickers.Where(t => t.Value.Volume.QuoteCurrency == QUOTECURRENCY && !coinsToRemove.Contains(t.Value.Volume.BaseCurrency) ); logger.Trace($"Enumerated {tickers.Count()} markets."); foreach (var ticker in tickers) { this.Assets.Add(new Asset { Ticker = ticker.Key, BaseCurrency = ticker.Value.Volume.BaseCurrency }); } var currentTime = DateTime.UtcNow; var minutesAway1 = 60 - currentTime.Minute; var minutesAway2 = 45 - currentTime.Minute; var minutesAway3 = 30 - currentTime.Minute; var minutesAway4 = 15 - currentTime.Minute; var minutesAway = new int[] { minutesAway1, minutesAway2, minutesAway3, minutesAway4 }.Where(a => a > 0).Min(); logger.Trace($"App starting in {minutesAway} minutes."); // Update 15-minute candle once per 15-minutes. timer = new Timer(async(objState) => await doWork(objState)); timer.Change((minutesAway * 60 + 15) * 1000, FIFTEENMINUTES); // don't start exactly on the hour so that the server has prepared the 15minute candle. offset by 15 seconds. // start up web socket. if (socket == null) { var numOfTickers = this.Assets.Count(); socket = await api.GetTickersWebSocketAsync(items => { for (int i = 0; i < numOfTickers; i++) { var tkr = this.Assets[i].Ticker; var foundTkr = items.FirstOrDefault(p => p.Key == tkr); var asset = this.Assets[i]; if (foundTkr.Value != null) { asset.Price = foundTkr.Value.Last; asset.Ask = foundTkr.Value.Ask; asset.Bid = foundTkr.Value.Bid; // adjust the stoploss. asset.adjustStopLoss(); if (asset.HasTrade && asset.CanSell && (asset.Price < asset.StopLoss)) { this.doSell(asset); } } } }, tickers.Select(t => t.Key).ToArray()); } }