public async Task <ExchangeMarket> GetSymbolInfo(string symbol) { if (_exchangeInfo == null) { var result = (await _api.GetMarketSymbolsMetadataAsync()).ToList(); _exchangeInfo = result; } //var eSymbol = _api.GlobalSymbolToExchangeSymbol(symbol); //return _exchangeInfo.FirstOrDefault(x => x.MarketName == eSymbol); return(_exchangeInfo.FirstOrDefault(x => x.MarketSymbol == symbol)); }
/// <summary> /// Downloads all symbols from the exchanges and filters out the coins with enough 24hr Volume /// </summary> /// <returns></returns> private void FindCoinsWithEnoughVolume() { _symbols = new List <ExtendedSymbol>(); var allSymbolsMeta = _api.GetMarketSymbolsMetadataAsync().Result; var allTickers = _api.GetTickersAsync().Result; // for each symbol foreach (var metadata in allSymbolsMeta) { string symbol = metadata.MarketSymbol.ToUpperInvariant(); if (!IsValidCurrency(symbol)) { // ignore, symbol has wrong currency continue; } // check 24hr volume var ticker = allTickers.FirstOrDefault(e => e.Key == symbol).Value; var volume = ticker.Volume.QuoteCurrencyVolume; if (_api is ExchangeBittrexAPI) { // bittrex reports wrong volume :-( volume = ticker.Volume.BaseCurrencyVolume; } if (volume < _settings.Min24HrVolume) { // ignore since 24hr volume is too low continue; } if (ticker.Ask < _settings.MinPrice) { Trace.WriteLine($"Ignoring because price is too low: {ticker.Ask}"); continue; } SymbolTrend fourHourTrend = new SymbolTrend(4); SymbolTrend oneHourTrend = new SymbolTrend(1); // add to list ExtendedSymbol extendedSymbol = new ExtendedSymbol() { Symbol = metadata, Ticker = ticker, Trends = new SymbolTrend[2] }; extendedSymbol.Trends[0] = fourHourTrend; extendedSymbol.Trends[1] = oneHourTrend; _symbols.Add(extendedSymbol); } _symbols = _symbols.OrderBy(e => e.Symbol.MarketSymbol).ToList(); }
public async Task <Tuple <DateTime, DateTime> > CacheAllData(ExchangeAPI api, Exchange exchange) { Global.Logger.Information($"Starting CacheAllData"); var watch1 = System.Diagnostics.Stopwatch.StartNew(); var exchangeCoins = api.GetMarketSymbolsMetadataAsync().Result.Where(m => m.BaseCurrency == Global.Configuration.TradeOptions.QuoteCurrency); // If there are items on the only trade list remove the rest if (Global.Configuration.TradeOptions.OnlyTradeList.Count > 0) { exchangeCoins = exchangeCoins.Where(m => Global.Configuration.TradeOptions.OnlyTradeList.Any(c => c.Contains(m.MarketSymbol))).ToList(); } var currentExchangeOption = Global.Configuration.ExchangeOptions.FirstOrDefault(); IExchangeAPI realExchange = ExchangeAPI.GetExchangeAPI(api.Name); var returns = new Tuple <DateTime, DateTime>(DateTime.MinValue, DateTime.MinValue); foreach (var coin in exchangeCoins) { var symbol = coin.MarketSymbol; if (realExchange is ExchangeBinanceAPI) { symbol = await api.ExchangeMarketSymbolToGlobalMarketSymbolAsync(symbol); } var backtestOptions = new BacktestOptions { DataFolder = Global.DataPath, Exchange = exchange, Coin = symbol, CandlePeriod = Int32.Parse(currentExchangeOption.SimulationCandleSize) }; var key1 = api.Name + backtestOptions.Coin + backtestOptions.CandlePeriod; var data1 = Global.AppCache.Get <List <Candle> >(key1); if (data1 != null) { returns = new Tuple <DateTime, DateTime>(data1.First().Timestamp, data1.Last().Timestamp); continue; } Candle databaseFirstCandle = Global.DataStoreBacktest.GetBacktestFirstCandle(backtestOptions).Result; Candle databaseLastCandle = Global.DataStoreBacktest.GetBacktestLastCandle(backtestOptions).Result; if (databaseFirstCandle == null || databaseLastCandle == null) { continue; } backtestOptions.StartDate = databaseFirstCandle.Timestamp; backtestOptions.EndDate = databaseLastCandle.Timestamp; var candleProvider = new DatabaseCandleProvider(); var _candle15 = candleProvider.GetCandles(backtestOptions, Global.DataStoreBacktest).Result; _candle15 = await _candle15.FillCandleGaps((Period)Enum.Parse(typeof(Period), backtestOptions.CandlePeriod.ToString(), true)); Global.AppCache.Remove(backtestOptions.Coin + backtestOptions.CandlePeriod); Global.AppCache.Add(api.Name + backtestOptions.Coin + backtestOptions.CandlePeriod, _candle15, new MemoryCacheEntryOptions()); Global.Logger.Information($" Cached {key1}"); backtestOptions.CandlePeriod = 1; var key2 = api.Name + backtestOptions.Coin + backtestOptions.CandlePeriod; if (Global.AppCache.Get <List <Candle> >(key2) != null) { continue; } Candle database1FirstCandle = Global.DataStoreBacktest.GetBacktestFirstCandle(backtestOptions).Result; Candle database1LastCandle = Global.DataStoreBacktest.GetBacktestLastCandle(backtestOptions).Result; if (database1FirstCandle == null || database1LastCandle == null) { continue; } backtestOptions.StartDate = database1FirstCandle.Timestamp; backtestOptions.EndDate = database1LastCandle.Timestamp; var _candle1 = candleProvider.GetCandles(backtestOptions, Global.DataStoreBacktest).Result; _candle1 = await _candle1.FillCandleGaps((Period)Enum.Parse(typeof(Period), backtestOptions.CandlePeriod.ToString(), true)); Global.AppCache.Remove(backtestOptions.Coin + backtestOptions.CandlePeriod); Global.AppCache.Add(api.Name + backtestOptions.Coin + backtestOptions.CandlePeriod, _candle1, new MemoryCacheEntryOptions()); Global.Logger.Information($" Cached {key2}"); returns = new Tuple <DateTime, DateTime>(backtestOptions.StartDate, backtestOptions.EndDate); } watch1.Stop(); Global.Logger.Warning($"Ended CacheAllData in #{watch1.Elapsed.TotalSeconds} seconds"); return(returns); }