public DisposableAlpacaDataSubscription(
                IAlpacaDataSubscription <TItem> subscription,
                IAlpacaDataStreamingClient client)
            {
                _subscription = subscription;
                _client       = client;

                _client.Subscribe(_subscription);
            }
예제 #2
0
 public AlpacaClient(AlpacaConfig config)
 {
     _config = config;
     _alpacaTradingClient = config.Alpaca_Use_Live_Api
         ? Environments.Live.GetAlpacaTradingClient(new SecretKey(_config.Alpaca_Live_App_Id, _config.Alpaca_Live_Secret_Key))
         : Environments.Paper.GetAlpacaTradingClient(new SecretKey(_config.Alpaca_Paper_App_Id, _config.Alpaca_Paper_Secret_Key));
     _alpacaDataClient = config.Alpaca_Use_Live_Api
         ? Environments.Live.GetAlpacaDataClient(new SecretKey(_config.Alpaca_Live_App_Id, _config.Alpaca_Live_Secret_Key))
         : Environments.Paper.GetAlpacaDataClient(new SecretKey(_config.Alpaca_Paper_App_Id, _config.Alpaca_Paper_Secret_Key));
     _alpacaStreamingClient = config.Alpaca_Use_Live_Api
         ? Environments.Live.GetAlpacaDataStreamingClient(new SecretKey(_config.Alpaca_Live_App_Id, _config.Alpaca_Live_Secret_Key))
         : Environments.Paper.GetAlpacaDataStreamingClient(new SecretKey(_config.Alpaca_Paper_App_Id, _config.Alpaca_Paper_Secret_Key));
 }
예제 #3
0
        public AlpacaClient(
            IAlpacaTradingClient alpacaTradingClient,
            IAlpacaStreamingClient alpacaTradingStreamingClient,
            IAlpacaDataClient alpacaDataClient,
            IAlpacaDataStreamingClient alpacaDataStreamingClient
            )
        {
            _alpacaTradingClient          = alpacaTradingClient ?? throw new ArgumentNullException(nameof(alpacaTradingClient));
            _alpacaTradingStreamingClient = alpacaTradingStreamingClient ?? throw new ArgumentNullException(nameof(alpacaTradingStreamingClient));
            _alpacaDataClient             = alpacaDataClient ?? throw new ArgumentNullException(nameof(alpacaDataClient));
            _alpacaDataStreamingClient    = alpacaDataStreamingClient ?? throw new ArgumentNullException(nameof(alpacaDataStreamingClient));

            _stockActions = new Dictionary <string, List <Action <StockInput> > >(StringComparer.OrdinalIgnoreCase);
        }
예제 #4
0
        public async Task StartAsync(CancellationToken cancellationToken)
        {
            _client = Alpaca.Markets.Environments.Paper
                      .GetAlpacaDataStreamingClient(new SecretKey(_configuration.GetSection("AlpacaAPI").GetSection("KeyId").Value,
                                                                  _configuration.GetSection("AlpacaAPI").GetSection("SecretKey").Value));

            await _client.ConnectAndAuthenticateAsync();

            var stocks = await GetStocksForStreaming();

            foreach (var stock in stocks)
            {
                var subscription = _client.GetQuoteSubscription(stock);
                _subscriptions.Add(subscription);
                subscription.Received += async(result) => await SubscriptionResult_Received(result);
            }

            _client.Subscribe(_subscriptions);
        }
예제 #5
0
 public static IAlpacaDataSubscription <IBar> GetMinuteBarSubscription(
     this IAlpacaDataStreamingClient client,
     params String[] symbols) =>
 getMinuteBarSubscription(
     client.EnsureNotNull(nameof(client)),
     symbols.EnsureNotNull(nameof(symbols)));
예제 #6
0
 public static IAlpacaDataSubscription <IQuote> GetQuoteSubscription(
     this IAlpacaDataStreamingClient client,
     IEnumerable <String> symbols) =>
 getQuoteSubscription(
     client.EnsureNotNull(nameof(client)),
     symbols.EnsureNotNull(nameof(symbols)));
예제 #7
0
 private static IAlpacaDataSubscription <IBar> getDailyBarSubscription(
     IAlpacaDataStreamingClient client,
     IEnumerable <String> symbols) =>
 getSubscription(client.GetDailyBarSubscription, symbols);
예제 #8
0
 private static IAlpacaDataSubscription <IQuote> getQuoteSubscription(
     IAlpacaDataStreamingClient client,
     IEnumerable <String> symbols) =>
 getSubscription(client.GetQuoteSubscription, symbols);
예제 #9
0
 public static ValueTask <IDisposableAlpacaDataSubscription <IBar> > SubscribeDailyBarAsync(
     this IAlpacaDataStreamingClient client,
     IEnumerable <String> symbols) =>
 DisposableAlpacaDataSubscription <IBar> .CreateAsync(
     client.EnsureNotNull(nameof(client)).GetDailyBarSubscription(symbols),
     client);
예제 #10
0
 public static ValueTask <IDisposableAlpacaDataSubscription <IBar> > SubscribeMinuteBarAsync(
     this IAlpacaDataStreamingClient client,
     params String[] symbols) =>
 DisposableAlpacaDataSubscription <IBar> .CreateAsync(
     client.EnsureNotNull(nameof(client)).GetMinuteBarSubscription(symbols),
     client);
예제 #11
0
 public static ValueTask <IDisposableAlpacaDataSubscription <IQuote> > SubscribeQuoteAsync(
     this IAlpacaDataStreamingClient client,
     String symbol) =>
 DisposableAlpacaDataSubscription <IQuote> .CreateAsync(
     client.EnsureNotNull(nameof(client)).GetQuoteSubscription(symbol),
     client);
 public static IAlpacaDataStreamingClient WithReconnect(
     this IAlpacaDataStreamingClient client,
     ReconnectionParameters parameters) =>
 new ClientWithReconnection(client, parameters);
 public static IAlpacaDataStreamingClient WithReconnect(
     this IAlpacaDataStreamingClient client) =>
 WithReconnect(client, ReconnectionParameters.Default);
        public async Task Run()
        {
            alpacaTradingClient = Environments.Paper.GetAlpacaTradingClient(new SecretKey(API_KEY, API_SECRET));

            alpacaDataClient = Environments.Paper.GetAlpacaDataClient(new SecretKey(API_KEY, API_SECRET));

            // Connect to Alpaca's websocket and listen for updates on our orders.
            alpacaStreamingClient = Environments.Paper.GetAlpacaStreamingClient(new SecretKey(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(new ListOrdersRequest());

            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(new CalendarRequest().SetTimeInterval(DateTime.Today.GetInclusiveIntervalFromThat())))
                            .ToList();
            var calendarDate = calendars.First().TradingDateUtc;
            var closingTime  = calendars.First().TradingCloseTimeUtc;

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

            var today = DateTime.Today;

            // TODO: olegra - temporary disable for the transition period

            // Get the first group of bars from today if the market has already been open.
            //var bars = await alpacaDataClient.ListAggregatesAsync(
            //    new AggregatesRequest(symbol, new AggregationPeriod(1, AggregationPeriodUnit.Minute))
            //        .SetInclusiveTimeInterval(today, today.AddDays(1)));
            //var lastBars = bars.Items.Skip(Math.Max(0, bars.Items.Count() - 20));
            //foreach (var bar in lastBars)
            //{
            //    if (bar.TimeUtc?.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.
            alpacaDataStreamingClient = Environments.Live.GetAlpacaDataStreamingClient(new SecretKey(API_KEY, API_SECRET));

            alpacaDataStreamingClient.ConnectAndAuthenticateAsync().Wait();
            Console.WriteLine("Polygon client opened.");
            var subscription = alpacaDataStreamingClient.GetMinuteAggSubscription(symbol);

            subscription.Received += 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 alpacaDataStreamingClient.DisconnectAsync();
                }
                else
                {
                    // Decide whether to buy or sell and submit orders.
                    await HandleMinuteAgg(agg);
                }
            };
            alpacaDataStreamingClient.Subscribe(subscription);
        }
예제 #15
0
 /// <summary>
 /// Wraps instance of <see cref="IAlpacaDataStreamingClient"/> into the helper class
 /// with automatic reconnection support and provide optional reconnection parameters.
 /// </summary>
 /// <param name="client">Original streaming client for wrapping.</param>
 /// <param name="parameters">Reconnection parameters (or default if missing).</param>
 /// <returns>Wrapped version of the <paramref name="client"/> object with reconnect.</returns>
 public static IAlpacaDataStreamingClient WithReconnect(
     this IAlpacaDataStreamingClient client,
     ReconnectionParameters?parameters = null) =>
 new ClientWithReconnection(client, parameters ?? ReconnectionParameters.Default);