예제 #1
0
        public static async Task StopAsync()
        {
            // TODO: Should we liquidate on stop?
            await Disconnect();

            AlpacaTradingClient?.Dispose();
            AlpacaStreamingClient?.Dispose();
            PolygonDataClient?.Dispose();
            PolygonStreamingClient?.Dispose();
            await Scheduler?.Shutdown();
        }
예제 #2
0
        internal static async Task Connect()
        {
            if (!AlpacaStreamingClient_IsConnected)
            {
                Logger.LogDebug("AlpacaStreamingClient connect");

                // AlpacaStreamingClient connect
                await AlpacaStreamingClient.ConnectAsync();
            }

            if (!PolygonStreamingClient_IsConnected)
            {
                Logger.LogDebug("PolygonStreamingClient connect");

                // PolygonStreamingClient connect
                await PolygonStreamingClient.ConnectAsync();

                Subscribe();
            }
        }
예제 #3
0
        internal static async Task Disconnect()
        {
            if (AlpacaStreamingClient_IsConnected)
            {
                Logger.LogDebug("AlpacaStreamingClient disconnect");

                // AlpacaStreamingClient disconnect
                await AlpacaStreamingClient.DisconnectAsync();
            }

            if (PolygonStreamingClient_IsConnected)
            {
                Logger.LogDebug("PolygonStreamingClient disconnect");

                // PolygonStreamingClient disconnect
                await PolygonStreamingClient.DisconnectAsync();

                Unsubscribe();
            }
        }
예제 #4
0
 public AlpacaStreamingClient AlpacaClientStreaming()
 {
     _alpacaStreamingClient = Environments.Paper.GetAlpacaStreamingClient(new SecretKey(API_KEY, API_SECRET));
     return(_alpacaStreamingClient);
 }
        public async Task Run()
        {
            alpacaTradingClient = Environments.Paper.GetAlpacaTradingClient(API_KEY, new SecretKey(API_SECRET));

            polygonDataClient = Environments.Paper.GetPolygonDataClient(API_KEY);

            // Connect to Alpaca's websocket and listen for updates on our orders.
            alpacaStreamingClient = Environments.Paper.GetAlpacaStreamingClient(API_KEY, API_SECRET);

            alpacaStreamingClient.ConnectAndAuthenticateAsync().Wait();

            alpacaStreamingClient.OnTradeUpdate += HandleTradeUpdate;

            // First, cancel any existing orders so they don't impact our buying power.
            var orders = await alpacaTradingClient.ListOrdersAsync();

            foreach (var order in orders)
            {
                await alpacaTradingClient.DeleteOrderAsync(order.OrderId);
            }

            // Figure out when the market will close so we can prepare to sell beforehand.
            var calendars    = (await alpacaTradingClient.ListCalendarAsync(DateTime.Today)).ToList();
            var calendarDate = calendars.First().TradingDate;
            var closingTime  = calendars.First().TradingCloseTime;

            closingTime = new DateTime(calendarDate.Year, calendarDate.Month, calendarDate.Day, closingTime.Hour, closingTime.Minute, closingTime.Second);

            var today = DateTime.Today;
            // Get the first group of bars from today if the market has already been open.
            var bars = await polygonDataClient.ListMinuteAggregatesAsync(symbol, 1, today, today.AddDays(1));

            var lastBars = bars.Items.Skip(Math.Max(0, bars.Items.Count() - 20));

            foreach (var bar in lastBars)
            {
                if (bar.Time.Date == today)
                {
                    closingPrices.Add(bar.Close);
                }
            }

            Console.WriteLine("Waiting for market open...");
            await AwaitMarketOpen();

            Console.WriteLine("Market opened.");

            // Connect to Polygon's websocket and listen for price updates.
            polygonStreamingClient = Environments.Live.GetPolygonStreamingClient(API_KEY);

            polygonStreamingClient.ConnectAndAuthenticateAsync().Wait();
            Console.WriteLine("Polygon client opened.");
            polygonStreamingClient.MinuteAggReceived += async(agg) =>
            {
                // If the market's close to closing, exit position and stop trading.
                TimeSpan minutesUntilClose = closingTime - DateTime.UtcNow;
                if (minutesUntilClose.TotalMinutes < 15)
                {
                    Console.WriteLine("Reached the end of trading window.");
                    await ClosePositionAtMarket();

                    await polygonStreamingClient.DisconnectAsync();
                }
                else
                {
                    // Decide whether to buy or sell and submit orders.
                    await HandleMinuteAgg(agg);
                }
            };
            polygonStreamingClient.SubscribeSecondAgg(symbol);
        }