コード例 #1
0
        private async Task CheckOutNewTickersForRequiredVolume()
        {
            var tradingSettings  = _configurationService.GetTradingSettings();
            var allCurrencyPairs = await _stockRestConnector.GetCurrencyPairs();

            var baseCurrencyPairs = allCurrencyPairs.Where(item => !_activePositionWorkers.ContainsKey(item.Id) &&
                                                           tradingSettings.QuoteCurrencies.Any(currencyId => String.Equals(item.QuoteCurrencyId, currencyId, StringComparison.OrdinalIgnoreCase)));

            var allTickers = await _stockRestConnector.GetTickers();

            var tradingTickers = allTickers
                                 .Where(tickerItem =>
                                        baseCurrencyPairs.Any(currencyPairItem => String.Equals(tickerItem.CurrencyPairId, currencyPairItem.Id)))
                                 .Where(tickerItem =>
            {
                var tickerCurrencyPair = baseCurrencyPairs.First(currencyPairItem =>
                                                                 String.Equals(tickerItem.CurrencyPairId, currencyPairItem.Id));
                decimal volumeToCompare;
                if (String.Equals(tickerCurrencyPair.QuoteCurrencyId, Constants.BTC, StringComparison.OrdinalIgnoreCase))
                {
                    volumeToCompare = tickerItem.VolumeInQuoteCurrency;
                }
                else
                {
                    var btcConvertFactor    = 0m;
                    var requestCurrencyPair = allCurrencyPairs.FirstOrDefault(item =>
                                                                              String.Equals(tickerCurrencyPair.QuoteCurrencyId, item.QuoteCurrencyId, StringComparison.OrdinalIgnoreCase) &&
                                                                              String.Equals(item.BaseCurrencyId, Constants.BTC, StringComparison.OrdinalIgnoreCase));
                    if (requestCurrencyPair != null)
                    {
                        btcConvertFactor = allTickers.First(item =>
                                                            String.Equals(item.CurrencyPairId, requestCurrencyPair.Id, StringComparison.OrdinalIgnoreCase)).LastPrice;
                    }
                    else
                    {
                        requestCurrencyPair = allCurrencyPairs.FirstOrDefault(item =>
                                                                              String.Equals(tickerCurrencyPair.QuoteCurrencyId, item.BaseCurrencyId, StringComparison.OrdinalIgnoreCase) &&
                                                                              String.Equals(item.QuoteCurrencyId, Constants.BTC, StringComparison.OrdinalIgnoreCase));
                        if (requestCurrencyPair != null)
                        {
                            btcConvertFactor = 1 / allTickers.First(item =>
                                                                    String.Equals(item.CurrencyPairId, requestCurrencyPair.Id,
                                                                                  StringComparison.OrdinalIgnoreCase)).LastPrice;
                        }
                    }

                    volumeToCompare = btcConvertFactor > 0 ? tickerItem.VolumeInQuoteCurrency / btcConvertFactor : 0;
                }
                return(volumeToCompare > tradingSettings.MinCurrencyPairTradingVolumeInBTC);
            })
                                 .ToList();

            var tradingCurrencyPairs = baseCurrencyPairs.Where(currencyPairItem => tradingTickers.Any(tickerItem =>
                                                                                                      String.Equals(tickerItem.CurrencyPairId, currencyPairItem.Id, StringComparison.OrdinalIgnoreCase))).ToList();

            var periodsForAnalysis = new[]
            {
                tradingSettings.Period.GetLowerFramePeriod(),
                tradingSettings.Period,
                tradingSettings.Period.GetHigherFramePeriod()
            };

            foreach (var currencyPair in tradingCurrencyPairs)
            {
                foreach (var candlePeriod in periodsForAnalysis)
                {
                    var candles = await _stockRestConnector.GetCandles(currencyPair.Id, candlePeriod, 30);

                    _candleLoadingService.UpdateCandles(currencyPair.Id, candlePeriod, candles);
                }

                await _candleLoadingService.InitSubscription(currencyPair.Id, periodsForAnalysis);

                _candleLoadingService.CandlesUpdated += (o, e) =>
                {
                    if (_activePositionWorkers == null)
                    {
                        return;
                    }

                    if (_activePositionWorkers.ContainsKey(e.CurrencyPairId))
                    {
                        return;
                    }

                    if (e.Period != tradingSettings.Period)
                    {
                        return;
                    }

                    CheckOutForNewPosition(currencyPair).Wait();
                };
            }
        }