protected override async Task ExecuteAsync(CancellationToken stoppingToken) { //TimeSortedCollection<FilledOrder> liveOrders = new TimeSortedCollection<FilledOrder>(); //liveOrders.Add(new FilledOrder("NIO_201204C55", (float)0.5, "BUY_TO_OPEN", "LIMIT", (float)0.5, 50, new DateTime(2020, 12, 1, 12, 25, 33))); //liveOrders.Add(new FilledOrder("NIO_201204C60", (float)0.5, "BUY_TO_OPEN", "LIMIT", (float)0.5, 50, new DateTime(2020, 12, 1, 12, 22, 30))); //liveOrders.Add(new FilledOrder("NIO_201204C62", (float)0.5, "BUY_TO_OPEN", "LIMIT", (float)0.5, 50, new DateTime(2020, 12, 1, 12, 22, 30))); //liveOrders.Add(new FilledOrder("NIO_201204C65", (float)0.5, "BUY_TO_OPEN", "LIMIT", (float)0.5, 50, new DateTime(2020, 12, 1, 12, 30, 00))); //LivePortfolioClient.IdentifyNewAndUpdatedOrders(liveOrders, 260); //IEnumerable<Position> positions = BrokerClient.GetPositions(); //OptionQuote quote; //try //{ // quote = MarketDataClient.GetOptionQuote("AAPL_201218C140"); // //OptionQuote quote = MarketDataClient.GetQuote("AAPL_121819C140"); //} //catch (Exception ex) //{ // Log.Information(ex, "hello"); //} //Order o1 = new Order("AAPL_201218C150", 1, InstructionType.SELL_TO_CLOSE, OrderType.MARKET, (float)0.08); //BrokerClient.PlaceOrder(o1); //Log.Information("Placing Order: {@Order}", o1); //IList<Position> positions = await ((LottoXClient)LivePortfolioClient).GetPositionsFromImage("C:/Users/Admin/WindowsServices/MarketCode/LottoXService/screenshots/portfolio-4380.png"); //Order o1 = new Order("AAPL_201231C150", 1, InstructionType.BUY_TO_OPEN, OrderType.LIMIT, (float).03); //Order o2 = new Order("CMG_201231C150", 1, InstructionType.BUY_TO_OPEN, OrderType.LIMIT, (float).03); //BrokerClient.PlaceOrder(o1); //BrokerClient.PlaceOrder(o2); BrokerClient.CancelExistingBuyOrders("ZM_210115C550"); Log.Information("RETURNING EARLY"); return; if (!MarketDataClient.IsMarketOpenToday()) { Log.Information("Market closed today"); return; } //Log.Information("NOT LOGGING IN"); await LivePortfolioClient.Login(); TimeSpan marketOpenTime = new TimeSpan(9, 30, 0); TimeSpan marketCloseTime = new TimeSpan(16, 0, 0); int invalidPortfolioStateCount = 0; int errorCount = 0; //string seedOrdersFilename = "C:/Users/Admin/WindowsServices/MarketCode/LottoXService/screenshots/orders-4173.png"; string seedOrdersFilename = ""; while (!stoppingToken.IsCancellationRequested) { TimeSpan now = DateTime.Now.TimeOfDay; if (now >= marketCloseTime) { Log.Information("Market now closed!"); ElmahClient.Dispose(); //Log.Information("NOT BREAKING ON MARKET CLOSED"); break; } else if (now <= marketOpenTime) { Log.Information("Market not open yet!"); // Or, wait until 9:30am await Task.Delay(30 * 1000, stoppingToken); continue; } try { Task _ = ElmahClient.Heartbeats.HealthyAsync(new Guid(_elmahConfig.LogId), _elmahConfig.HeartbeatId); TimeSortedCollection <PositionDelta> deltas; if (seedOrdersFilename.Length > 0) { Log.Information("*********Seeding live orders with file " + seedOrdersFilename); deltas = await LivePortfolioClient.GetLiveDeltasFromPositions(seedOrdersFilename); seedOrdersFilename = ""; } else if (errorCount > 0 || invalidPortfolioStateCount > 0) { Log.Information("***Getting live deltas after error"); deltas = await LivePortfolioClient.GetLiveDeltasFromPositions(); } else if (await LivePortfolioClient.HaveOrdersChanged(null)) { Log.Information("***Change in top orders detected- getting live orders"); deltas = await LivePortfolioClient.GetLiveDeltasFromPositions(); } else { deltas = new TimeSortedCollection <PositionDelta>(); } foreach (PositionDelta delta in deltas) { Order?order = OrderManager.DecideOrder(delta); if (order != null) { if (order.Instruction == InstructionType.SELL_TO_CLOSE) { BrokerClient.CancelExistingBuyOrders(order.Symbol); } BrokerClient.PlaceOrder(order); } } invalidPortfolioStateCount = 0; errorCount = 0; } catch (InvalidPortfolioStateException) { invalidPortfolioStateCount++; if (invalidPortfolioStateCount == 2) { Log.Error("Portfolio found invalid {InvalidCount} times", invalidPortfolioStateCount); } else if (invalidPortfolioStateCount > 2) { Log.Fatal("Portfolio found invalid {InvalidCount} times", invalidPortfolioStateCount); break; } await LivePortfolioClient.Login(); continue; } catch (PortfolioDatabaseException) { //Assume the exception is already logged break; } catch (OptionParsingException ex) { Log.Fatal(ex, "Error parsing option symbol. Symbol {Symbol}. Terminating program.", ex.Symbol); break; } catch (ArgumentException ex) { Log.Fatal(ex, "Arument exception encountered- terminating program."); break; } catch (ModelBuilderException ex) { Log.Error(ex, "ModelBuilderException encountered"); errorCount++; if (errorCount > 2) { Log.Fatal(ex, "Too many consecutive errors encountered. Terminating program. Error count = {ErrorCount}", errorCount); break; } } catch (Exception ex) { errorCount++; if (errorCount <= 2) { Log.Error(ex, "Unexpected error: count = {ErrorCount}", errorCount); } else if (errorCount > 2) { Log.Fatal(ex, "Too many consecutive errors encountered. Terminating program. Error count = {ErrorCount}", errorCount); break; } } await Task.Delay(15 *1000, stoppingToken); } _hostApplicationLifetime.StopApplication(); }