Exemplo n.º 1
0
        public override Task StopAsync(CancellationToken cancellationToken)
        {
            LivePortfolioClient.Logout();
            LivePortfolioClient.Database.Dispose();
            if (BrokerClient is PaperTradeBrokerClient)
            {
                ((PaperTradeBrokerClient)BrokerClient).Database.Dispose();
            }

            return(base.StopAsync(cancellationToken));
        }
Exemplo n.º 2
0
        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();
        }