Exemplo n.º 1
0
        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());
            }
        }