public static async Task RunGetHistoricalTrades(Dictionary <string, string> dict) { RequireArgs(dict, "exchangeName", "marketSymbol"); string exchangeName = dict["exchangeName"]; IExchangeAPI api = ExchangeAPI.GetExchangeAPI(exchangeName); string marketSymbol = dict["marketSymbol"]; Console.WriteLine("Showing historical trades for exchange {0}...", exchangeName); DateTime?startDate = null; DateTime?endDate = null; if (dict.ContainsKey("startDate")) { startDate = DateTime.Parse(dict["startDate"]).ToUniversalTime(); } if (dict.ContainsKey("endDate")) { endDate = DateTime.Parse(dict["endDate"]).ToUniversalTime(); } await api.GetHistoricalTradesAsync((IEnumerable <ExchangeTrade> trades) => { foreach (ExchangeTrade trade in trades) { Console.WriteLine("Trade at timestamp {0}: {1}/{2}/{3}", trade.Timestamp.ToLocalTime(), trade.Id, trade.Price, trade.Amount); } return(true); }, marketSymbol, startDate, endDate); }
private async Task TestTrade(IExchangeAPI api, string marketSymbol) { if (FunctionRegex == null || Regex.IsMatch("trade", FunctionRegex, RegexOptions.IgnoreCase)) { try { ExchangeTrade[] trades = null; Console.Write("Test {0} GetHistoricalTradesAsync... ", api.Name); await api.GetHistoricalTradesAsync(tradeEnum => { trades = tradeEnum.ToArray(); return(true); }, marketSymbol); Assert(trades.Length != 0 && trades[0].Price > 0m && trades[0].Amount > 0m); Console.WriteLine($"OK ({trades.Length})"); Console.Write("Test {0} GetRecentTradesAsync... ", api.Name); trades = (await api.GetRecentTradesAsync(marketSymbol)).ToArray(); Assert(trades.Length != 0 && trades[0].Price > 0m && trades[0].Amount > 0m); Console.WriteLine($"OK ({trades.Length} trades)"); } catch (NotImplementedException) { Console.WriteLine("Not implemented"); } } }
/// <summary> /// Export exchange data to csv and then to optimized bin files /// </summary> /// <param name="api">Exchange api, null to just convert existing csv files</param> /// <param name="marketSymbol">Market symbol to export</param> /// <param name="basePath">Base path to export to, should not contain symbol, symbol will be appended</param> /// <param name="sinceDateTime">Start date to begin export at</param> /// <param name="callback">Callback if api is not null to notify of progress</param> public static async Task ExportExchangeTrades(IExchangeAPI api, string marketSymbol, string basePath, DateTime sinceDateTime, Action <long> callback = null) { basePath = Path.Combine(basePath, marketSymbol); Directory.CreateDirectory(basePath); sinceDateTime = sinceDateTime.ToUniversalTime(); if (api != null) { long count = 0; int lastYear = -1; int lastMonth = -1; StreamWriter writer = null; bool innerCallback(IEnumerable <ExchangeTrade> trades) { foreach (ExchangeTrade trade in trades) { if (trade.Timestamp.Year != lastYear || trade.Timestamp.Month != lastMonth) { if (writer != null) { writer.Close(); } lastYear = trade.Timestamp.Year; lastMonth = trade.Timestamp.Month; writer = new StreamWriter(basePath + trade.Timestamp.Year + "-" + trade.Timestamp.Month.ToString("00") + ".csv"); } writer.WriteLine("{0},{1},{2}", CryptoUtility.UnixTimestampFromDateTimeSeconds(trade.Timestamp), trade.Price, trade.Amount); if (++count % 100 == 0) { callback?.Invoke(count); } } return(true); } await api.GetHistoricalTradesAsync(innerCallback, marketSymbol, sinceDateTime); writer.Close(); callback?.Invoke(count); } TraderFileReader.ConvertCSVFilesToBinFiles(basePath); }