// ReSharper disable once UnusedParameter.Local public static void Main(string[] args) { Console.CancelKeyPress += delegate(object sender, ConsoleCancelEventArgs e) { e.Cancel = true; CancellationTokenSource.Cancel(); Console.WriteLine("Waiting...."); }; var options = new ArgumentOptions(); var isValid = CommandLine.Parser.Default.ParseArgumentsStrict(args, options); if (!isValid) { Console.WriteLine("Parameter is wrong!"); return; } InitializeAutoMappers(); var serviceProvider = InitDependencyInjection.Init(options.Exchange, options.Strategy); Console.WriteLine("Starting parameters:"); Console.WriteLine($"\tExchange name: {options.Exchange}"); Console.WriteLine($"\tTrading pair: {options.TradingPair}"); Console.WriteLine($"\tCandle period: {options.CandlePeriod}"); Console.WriteLine($"\tStrategy name: {options.Strategy}"); Console.WriteLine(); try { _userBalanceService = serviceProvider.GetService <IUserBalanceService>(); _realTimeService = serviceProvider.GetService <ITraderService>(); var utcNow = DateTime.UtcNow; var delayStartInSeconds = (int)options.CandlePeriod * 60 - utcNow.Minute % (int)options.CandlePeriod * 60 - utcNow.Second; Console.WriteLine($"Delaying realtime trading start. Delay time (seconds): {delayStartInSeconds}"); Thread.Sleep(delayStartInSeconds * 1000); Console.WriteLine(); Console.WriteLine("Started trading"); Console.WriteLine(); _realTimeService.StartTradingAsync(options.TradingPair, options.CandlePeriod, CancellationTokenSource.Token).Wait(); } catch (Exception ex) { var emailService = serviceProvider.GetService <IEmailService>(); emailService.SendEmail($"Exception {options.TradingPair}", ex.ToString()); Console.WriteLine($"Exception: {ex}"); } Console.WriteLine("############ SUMMARY ############"); Console.WriteLine(_userBalanceService.TradingSummary()); Console.WriteLine("Press any key to exit..."); Console.ReadKey(); }
public static void Main(string[] args) { var options = new ArgumentOptions(); var isValid = CommandLine.Parser.Default.ParseArgumentsStrict(args, options); if (!isValid) { Console.WriteLine("Parameter is wrong!"); return; } InitializeAutoMappers(); var serviceProvider = InitDependencyInjection.Init(options.Exchange, options.Strategy, options.EnableBacktest); if (options.EnableBacktest) { var candleService = serviceProvider.GetService <ICandleService>(); var availableCandlePeriods = candleService.GetAvailableCandlePeriodsAsync(options.TradingPair).Result.ToList(); Console.WriteLine("Available candle preiods:"); var periodOptions = new Dictionary <int, long>(); for (int i = 0; i < availableCandlePeriods.Count; i++) { var availableCandlePeriod = availableCandlePeriods[i]; Console.WriteLine($"Options {i + 1}: {availableCandlePeriod.PeriodStart:yyyy-MM-dd hh:mm} - {availableCandlePeriod.PeriodEnd:yyyy-MM-dd hh:mm}; Sample count: {availableCandlePeriod.Candles.Count()}"); Console.WriteLine(); periodOptions.Add(i + 1, availableCandlePeriod.ScanId); } Console.WriteLine("Select option: "); var key = Console.ReadKey(); int selectedOption; if (!int.TryParse(key.KeyChar.ToString(), out selectedOption)) { Console.WriteLine("Not exists option!"); return; } var scanId = periodOptions[selectedOption]; var candles = availableCandlePeriods.First(w => w.ScanId == scanId).Candles.ToList(); Console.WriteLine(); Console.WriteLine($"Selected option: {selectedOption}; Candle count: {candles.Count}"); var backtesTraderService = serviceProvider.GetService <ITraderService>(); backtesTraderService.CheckStrategyAsync(options.TradingPair, candles); Console.WriteLine("############ SUMMARY ############"); var userBalanceService = serviceProvider.GetService <IUserBalanceService>(); Console.WriteLine(userBalanceService.TradingSummary()); } if (options.EnableImport) { var importProvider = serviceProvider.GetService <IImportRepository>(); var candles = importProvider.ImportCandlesAsync(options.TradingPair, options.ImportIntervalInHour, options.CandlePeriod).Result; Console.WriteLine($"Imported candle count: {candles.Count()}"); } if (options.EnableOrderTesting) { var exchangeProvider = serviceProvider.GetService <IExchangeProvider>(); var depthModel = exchangeProvider.GetDepth(options.TradingPair).Result; //decimal price = 19150; //decimal defaultAmount = 10; ////var orderBook = exchangeProvider.GetOrderBook(options.TradingPair, 1).Result; ////price = orderBook.SellOrders.First(); //var ticker = exchangeProvider.GetTicker(options.TradingPair).Result; //price = ticker.HighestBid; ////var balance = exchangeProvider.GetBalanceAsync().Result; //var rate = Math.Round(defaultAmount / price, 8); ////var orderNumber = exchangeProvider.CreateOrderAsync(TradeType.Buy, options.TradingPair, price, rate).Result; ////var result = exchangeProvider.CancelOrderAsync(orderNumber).Result; ////ticker = exchangeProvider.GetTicker(options.TradingPair).Result; ////price = ticker.HighestBid; //var orderNumber2 = exchangeProvider.CreateOrderAsync(TradeType.Sell, options.TradingPair, price, (decimal)0.00057228).Result; ////var a = exchangeProvider.GetOrderBook(options.TradingPair, 1).Result; } }