public ActionResult ExchangePairs(string exchange, string baseCurrency) { var result = new JArray(); var symbolArray = new JArray(); IExchangeAPI api = ExchangeAPI.GetExchangeAPI(exchange); var exchangeCoins = api.GetSymbolsMetadataAsync().Result; if (!String.IsNullOrEmpty(baseCurrency)) { exchangeCoins = exchangeCoins.Where(e => e.BaseCurrency.ToLowerInvariant() == baseCurrency.ToLowerInvariant()); } foreach (var coin in exchangeCoins) { symbolArray.Add(api.ExchangeSymbolToGlobalSymbol(coin.MarketName)); } var baseCurrencyArray = new JArray(); var exchangeBaseCurrencies = api.GetSymbolsMetadataAsync().Result.Select(m => m.BaseCurrency).Distinct(); foreach (var currency in exchangeBaseCurrencies) { baseCurrencyArray.Add(currency); } result.Add(symbolArray); result.Add(baseCurrencyArray); return(new JsonResult(result)); }
public ActionResult BacktesterResults(string exchange, string coinsToBuy, string baseCurrency, string candleSize = "5", string strategy = "all") { JObject strategies = new JObject(); List <string> coins = new List <string>(); if (String.IsNullOrEmpty(coinsToBuy)) { IExchangeAPI api = ExchangeAPI.GetExchangeAPI(exchange.ToLower()); var exchangeCoins = api.GetSymbolsMetadataAsync().Result.Where(m => m.BaseCurrency == baseCurrency); foreach (var coin in exchangeCoins) { coins.Add(api.ExchangeSymbolToGlobalSymbol(coin.MarketName)); } } else { Char delimiter = ','; String[] coinsToBuyArray = coinsToBuy.Split(delimiter); foreach (var coin in coinsToBuyArray) { coins.Add(coin.ToUpper()); } } var backtestOptions = new BacktestOptions { DataFolder = Global.DataPath, Exchange = (Exchange)Enum.Parse(typeof(Exchange), exchange, true), Coins = coins, CandlePeriod = Int32.Parse(candleSize) }; var cts = new CancellationTokenSource(); var parallelOptions = new ParallelOptions { CancellationToken = cts.Token, MaxDegreeOfParallelism = Environment.ProcessorCount }; Parallel.ForEach(BacktestFunctions.GetTradingStrategies(), parallelOptions, async tradingStrategy => { if (strategy != "all") { var base64EncodedBytes = Convert.FromBase64String(strategy); if (tradingStrategy.Name != Encoding.UTF8.GetString(base64EncodedBytes)) { return; } } var result = await BacktestFunctions.BackTestJson(tradingStrategy, backtestOptions, Global.DataStoreBacktest); foreach (var item in result) { await Runtime.GlobalHubBacktest.Clients.All.SendAsync("Send", JsonConvert.SerializeObject(item)); } }); return(new JsonResult(strategies)); }
public async Task <ActionResult> FillCandlesGaps(string exchange, string coinsToBuy, string baseCurrency, DateTime?from = null, DateTime?to = null, string candleSize = "5") { var coins = new List <string>(); if (String.IsNullOrEmpty(coinsToBuy)) { IExchangeAPI api = ExchangeAPI.GetExchangeAPI(exchange); var exchangeCoins = api.GetSymbolsMetadataAsync().Result.Where(m => m.BaseCurrency == baseCurrency); foreach (var coin in exchangeCoins) { coins.Add(api.ExchangeSymbolToGlobalSymbol(coin.MarketName)); } } else { Char delimiter = ','; String[] coinsToBuyArray = coinsToBuy.Split(delimiter); foreach (var coin in coinsToBuyArray) { coins.Add(coin.ToUpper()); } } var backtestOptions = new BacktestOptions { DataFolder = Global.DataPath, Exchange = (Exchange)Enum.Parse(typeof(Exchange), exchange, true), Coins = coins, CandlePeriod = Int32.Parse(candleSize), EndDate = DateTime.Now }; if (from.HasValue) { backtestOptions.StartDate = from.Value; } if (to.HasValue) { backtestOptions.EndDate = to.Value; backtestOptions.EndDate = backtestOptions.EndDate.AddDays(1).AddMinutes(-1); } await DataRefresher.FillCandlesGaps(x => Global.Logger.Information(x), backtestOptions, Global.DataStoreBacktest); var result = new JObject { ["result"] = "success" }; return(new JsonResult(result)); }
public async Task <ActionResult> RefreshCandles(string exchange, string coinsToBuy, string baseCurrency, string candleSize = "5") { List <string> coins = new List <string>(); if (String.IsNullOrEmpty(coinsToBuy)) { IExchangeAPI api = ExchangeAPI.GetExchangeAPI(exchange); var exchangeCoins = api.GetSymbolsMetadataAsync().Result.Where(m => m.BaseCurrency == baseCurrency); foreach (var coin in exchangeCoins) { coins.Add(api.ExchangeSymbolToGlobalSymbol(coin.MarketName)); } } else { Char delimiter = ','; String[] coinsToBuyArray = coinsToBuy.Split(delimiter); foreach (var coin in coinsToBuyArray) { coins.Add(coin.ToUpper()); } } BacktestOptions backtestOptions = new BacktestOptions { DataFolder = Global.DataPath, Exchange = (Exchange)Enum.Parse(typeof(Exchange), exchange, true), Coins = coins, CandlePeriod = Int32.Parse(candleSize) }; await DataRefresher.RefreshCandleData(x => Global.Logger.Information(x), backtestOptions, Global.DataStoreBacktest); JObject result = new JObject { ["result"] = "success" }; return(new JsonResult(result)); }
public void HandleTickerUpdate(IExchangeAPI api, IReadOnlyCollection <KeyValuePair <string, ExchangeTicker> > tickers) { var symbolsInUpdate = new HashSet <string>(); foreach (var kv in tickers) { string symbol; if (api is ExchangeBitfinexAPI) { symbol = kv.Key.Substring(0, 3) + "-" + kv.Key.Substring(3); } else { symbol = api.ExchangeSymbolToGlobalSymbol(kv.Key); } string exchange = api.Name; // 1st time for SYMBOL: Create a dictionary <exchange, stack<ExchangeTicker>> if (!m_tickers.ContainsKey(symbol)) { m_tickers[symbol] = new ConcurrentDictionary <string, ConcurrentStack <ExchangeTicker> >(); } // 1st time for SYMBOL|EXCHANGE: Create a stack<ExchangeTicker> if (!m_tickers[symbol].ContainsKey(exchange)) { m_tickers[symbol][exchange] = new ConcurrentStack <ExchangeTicker>(); } var ticker = kv.Value; m_tickers[symbol][exchange].Push(ticker); symbolsInUpdate.Add(symbol); } /*if (symbolsInUpdate.Contains("BTC-USD")) update("BTC-USD"); * if (symbolsInUpdate.Contains("BTC-USDT")) update("BTC-USDT"); * if (symbolsInUpdate.Contains("ETH-USD")) update("ETH-USD"); * if (symbolsInUpdate.Contains("ETH-USDT")) update("ETH-USDT");*/ }
public ActionResult BacktesterResults(string exchange, string coinsToBuy, string baseCurrency, bool saveSignals, decimal startingWallet, decimal tradeAmount, DateTime?from = null, DateTime?to = null, string candleSize = "5", string strategy = "all") { var strategies = new JObject(); var coins = new List <string>(); if (String.IsNullOrEmpty(coinsToBuy)) { IExchangeAPI api = ExchangeAPI.GetExchangeAPI(exchange); var exchangeCoins = api.GetSymbolsMetadataAsync().Result.Where(m => m.BaseCurrency == baseCurrency); foreach (var coin in exchangeCoins) { coins.Add(api.ExchangeSymbolToGlobalSymbol(coin.MarketName)); } } else { Char delimiter = ','; String[] coinsToBuyArray = coinsToBuy.Split(delimiter); foreach (var coin in coinsToBuyArray) { coins.Add(coin.ToUpper()); } } var backtestOptions = new BacktestOptions { DataFolder = Global.DataPath, Exchange = (Exchange)Enum.Parse(typeof(Exchange), exchange, true), Coins = coins, CandlePeriod = Int32.Parse(candleSize) }; if (from.HasValue) { backtestOptions.StartDate = from.Value; } if (to.HasValue) { backtestOptions.EndDate = to.Value; backtestOptions.EndDate = backtestOptions.EndDate.AddDays(1).AddMinutes(-1); } if (tradeAmount == 0m) { tradeAmount = backtestOptions.StakeAmount; } if (startingWallet == 0m) { startingWallet = backtestOptions.StartingWallet; } var cts = new CancellationTokenSource(); var parallelOptions = new ParallelOptions { CancellationToken = cts.Token, MaxDegreeOfParallelism = Environment.ProcessorCount }; Parallel.ForEach(BacktestFunctions.GetTradingStrategies(), parallelOptions, async tradingStrategy => { if (strategy != "all") { var base64EncodedBytes = Convert.FromBase64String(strategy); if (tradingStrategy.Name != Encoding.UTF8.GetString(base64EncodedBytes)) { return; } } var result = await BacktestFunctions.BackTestJson(tradingStrategy, backtestOptions, Global.DataStoreBacktest, baseCurrency, saveSignals, startingWallet, tradeAmount); for (int i = 0; i < result.Count(); i++) { if (i == 0) { await Runtime.GlobalHubBacktest.Clients.All.SendAsync("SendSummary", JsonConvert.SerializeObject(result[i])); } else { await Runtime.GlobalHubBacktest.Clients.All.SendAsync("Send", JsonConvert.SerializeObject(result[i])); } } }); return(new JsonResult(strategies)); }