예제 #1
0
        /// <summary>
        /// Sets the job we're subscribing for
        /// </summary>
        /// <param name="job">Job we're subscribing for</param>
        public void SetJob(LiveNodePacket job)
        {
            var wssUrl          = job.BrokerageData["gdax-url"];
            var restApi         = job.BrokerageData["gdax-rest-api"];
            var restClient      = new RestClient(restApi);
            var webSocketClient = new WebSocketClientWrapper();
            var passPhrase      = job.BrokerageData["gdax-passphrase"];
            var apiKey          = job.BrokerageData["gdax-api-key"];
            var apiSecret       = job.BrokerageData["gdax-api-secret"];
            var priceProvider   = new ApiPriceProvider(job.UserId, job.UserToken);
            var aggregator      = Composer.Instance.GetExportedValueByTypeName <IDataAggregator>(
                Config.Get("data-aggregator", "QuantConnect.Lean.Engine.DataFeeds.AggregationManager"), forceTypeNameOnExisting: false);

            Initialize(
                wssUrl: wssUrl,
                websocket: webSocketClient,
                restClient: restClient,
                apiKey: apiKey,
                apiSecret: apiSecret,
                passPhrase: passPhrase,
                algorithm: null,
                priceProvider: priceProvider,
                aggregator: aggregator,
                job: job
                );

            if (!IsConnected)
            {
                Connect();
            }
        }
예제 #2
0
        public async Task Start()
        {
            if (_started)
            {
                throw new Exception("already_started");
            }
            await Task.Run(() => WebSocketClientWrapper.ConnectAsync(
                               $"wss://{_options.Url}:{_options.Port}",
                               CancellationToken.None,
                               (context) =>
            {
                _socketWrapper = context;

                context.OnOpen    += OnOpen;
                context.OnClose   += _options.OnClose;
                context.OnError   += _options.OnError;
                context.OnReceive += OnReceived;

                _options.OnConnected?.Invoke();
            },
                               true,
                               false,
                               3,
                               _options.InternalWebSocketOptions
                               ));
        }
        protected override IBrokerage CreateBrokerage(IOrderProvider orderProvider, ISecurityProvider securityProvider)
        {
            var restClient      = new RestClient("https://api.pro.coinbase.com");
            var webSocketClient = new WebSocketClientWrapper();

            var securities = new SecurityManager(new TimeKeeper(DateTime.UtcNow, TimeZones.NewYork))
            {
                { Symbol, CreateSecurity(Symbol) }
            };

            var transactions = new SecurityTransactionManager(null, securities);

            transactions.SetOrderProcessor(new FakeOrderProcessor());

            var algorithm = new Mock <IAlgorithm>();

            algorithm.Setup(a => a.Transactions).Returns(transactions);
            algorithm.Setup(a => a.BrokerageModel).Returns(new GDAXBrokerageModel());
            algorithm.Setup(a => a.Portfolio).Returns(new SecurityPortfolioManager(securities, transactions));
            algorithm.Setup(a => a.Securities).Returns(securities);

            var priceProvider = new Mock <IPriceProvider>();

            priceProvider.Setup(a => a.GetLastPrice(It.IsAny <Symbol>())).Returns(1.234m);

            var aggregator = new AggregationManager();

            return(new GDAXBrokerage(Config.Get("gdax-url", "wss://ws-feed.pro.coinbase.com"), webSocketClient, restClient,
                                     Config.Get("gdax-api-key"), Config.Get("gdax-api-secret"), Config.Get("gdax-passphrase"), algorithm.Object,
                                     priceProvider.Object, aggregator));
        }
예제 #4
0
        public void GetsHistory(Symbol symbol, Resolution resolution, TickType tickType, TimeSpan period, bool shouldBeEmpty)
        {
            var restClient      = new RestClient("https://api.pro.coinbase.com");
            var webSocketClient = new WebSocketClientWrapper();
            var aggregator      = new AggregationManager();

            var brokerage = new GDAXBrokerage(
                Config.Get("gdax-url", "wss://ws-feed.pro.coinbase.com"), webSocketClient, restClient,
                Config.Get("gdax-api-key"), Config.Get("gdax-api-secret"), Config.Get("gdax-passphrase"), null, null, aggregator, null);

            var historyProvider = new BrokerageHistoryProvider();

            historyProvider.SetBrokerage(brokerage);
            historyProvider.Initialize(new HistoryProviderInitializeParameters(null, null, null, null, null, null, null, false, new DataPermissionManager()));

            var now = DateTime.UtcNow;

            var requests = new[]
            {
                new HistoryRequest(now.Add(-period),
                                   now,
                                   typeof(TradeBar),
                                   symbol,
                                   resolution,
                                   SecurityExchangeHours.AlwaysOpen(TimeZones.Utc),
                                   DateTimeZone.Utc,
                                   resolution,
                                   false,
                                   false,
                                   DataNormalizationMode.Adjusted,
                                   tickType)
            };

            var history = historyProvider.GetHistory(requests, TimeZones.Utc).ToList();

            foreach (var slice in history)
            {
                var bar = slice.Bars[symbol];

                Log.Trace($"{bar.Time}: {bar.Symbol} - O={bar.Open}, H={bar.High}, L={bar.Low}, C={bar.Close}, V={bar.Volume}");
            }

            if (shouldBeEmpty)
            {
                Assert.IsTrue(history.Count == 0);
            }
            else
            {
                Assert.IsTrue(history.Count > 0);
            }

            Log.Trace("Data points retrieved: " + historyProvider.DataPointCount);
        }
        private static GDAXBrokerage GetBrokerage()
        {
            var wssUrl          = Config.Get("gdax-url", "wss://ws-feed.pro.coinbase.com");
            var webSocketClient = new WebSocketClientWrapper();
            var restClient      = new RestClient("https://api.pro.coinbase.com");
            var apiKey          = Config.Get("gdax-api-key");
            var apiSecret       = Config.Get("gdax-api-secret");
            var passPhrase      = Config.Get("gdax-passphrase");
            var algorithm       = new QCAlgorithm();
            var userId          = Config.GetInt("job-user-id");
            var userToken       = Config.Get("api-access-token");
            var priceProvider   = new ApiPriceProvider(userId, userToken);

            return(new GDAXBrokerage(wssUrl, webSocketClient, restClient, apiKey, apiSecret, passPhrase, algorithm, priceProvider));
        }
        protected override IBrokerage CreateBrokerage(IOrderProvider orderProvider, ISecurityProvider securityProvider)
        {
            var restClient      = new RestClient("https://api.pro.coinbase.com");
            var webSocketClient = new WebSocketClientWrapper();

            var algorithm = new Mock <IAlgorithm>();

            algorithm.Setup(a => a.BrokerageModel).Returns(new GDAXBrokerageModel(AccountType.Cash));

            var priceProvider = new ApiPriceProvider(Config.GetInt("job-user-id"), Config.Get("api-access-token"));

            return(new GDAXBrokerage(Config.Get("gdax-url", "wss://ws-feed.pro.coinbase.com"), webSocketClient, restClient,
                                     Config.Get("gdax-api-key"), Config.Get("gdax-api-secret"), Config.Get("gdax-passphrase"), algorithm.Object,
                                     priceProvider));
        }
예제 #7
0
        private static TestGDAXDataQueueHandler GetDataQueueHandler()
        {
            var wssUrl          = Config.Get("gdax-url", "wss://ws-feed.pro.coinbase.com");
            var webSocketClient = new WebSocketClientWrapper();
            var restClient      = new RestClient("https://api.pro.coinbase.com");
            var apiKey          = Config.Get("gdax-api-key");
            var apiSecret       = Config.Get("gdax-api-secret");
            var passPhrase      = Config.Get("gdax-passphrase");
            var algorithm       = new QCAlgorithm();
            var userId          = Config.GetInt("job-user-id");
            var userToken       = Config.Get("api-access-token");
            var priceProvider   = new ApiPriceProvider(userId, userToken);
            var aggregator      = new AggregationManager();

            return(new TestGDAXDataQueueHandler(wssUrl, webSocketClient, restClient, apiKey, apiSecret, passPhrase, algorithm, priceProvider, aggregator, null));
        }
예제 #8
0
        /// <summary>
        /// Create the Brokerage instance
        /// </summary>
        /// <param name="job"></param>
        /// <param name="algorithm"></param>
        /// <returns></returns>
        public override IBrokerage CreateBrokerage(Packets.LiveNodePacket job, IAlgorithm algorithm)
        {
            var required = new[] { "gdax-url", "gdax-api-secret", "gdax-api-key", "gdax-passphrase" };

            foreach (var item in required)
            {
                if (string.IsNullOrEmpty(job.BrokerageData[item]))
                {
                    throw new Exception($"GDAXBrokerageFactory.CreateBrokerage: Missing {item} in config.json");
                }
            }

            var restApi = BrokerageData["gdax-rest-api"];

            if (job.BrokerageData.ContainsKey("gdax-rest-api"))
            {
                restApi = job.BrokerageData["gdax-rest-api"];
            }

            var restClient      = new RestClient(restApi);
            var webSocketClient = new WebSocketClientWrapper();
            var priceProvider   = new ApiPriceProvider(job.UserId, job.UserToken);
            var aggregator      = Composer.Instance.GetExportedValueByTypeName <IDataAggregator>(Config.Get("data-aggregator", "QuantConnect.Lean.Engine.DataFeeds.AggregationManager"), forceTypeNameOnExisting: false);

            IBrokerage brokerage;

            if (job.DataQueueHandler.Contains("GDAXDataQueueHandler"))
            {
                var dataQueueHandler = new GDAXDataQueueHandler(job.BrokerageData["gdax-url"], webSocketClient,
                                                                restClient, job.BrokerageData["gdax-api-key"], job.BrokerageData["gdax-api-secret"],
                                                                job.BrokerageData["gdax-passphrase"], algorithm, priceProvider, aggregator, job);

                Composer.Instance.AddPart <IDataQueueHandler>(dataQueueHandler);

                brokerage = dataQueueHandler;
            }
            else
            {
                brokerage = new GDAXBrokerage(job.BrokerageData["gdax-url"], webSocketClient,
                                              restClient, job.BrokerageData["gdax-api-key"], job.BrokerageData["gdax-api-secret"],
                                              job.BrokerageData["gdax-passphrase"], algorithm, priceProvider, aggregator, job);
            }

            return(brokerage);
        }
예제 #9
0
파일: SockClient.cs 프로젝트: wiangf/Lean
        /// <summary>
        /// Creates new instance of <see cref="SockClient"/> object.
        /// </summary>
        /// <param name="keyId">Application key identifier.</param>
        /// <param name="secretKey">Application secret key.</param>
        /// <param name="alpacaRestApi">Alpaca REST API endpoint URL.</param>
        public SockClient(
            string keyId,
            string secretKey,
            Uri alpacaRestApi)
        {
            if (keyId == null)
            {
                throw new ArgumentException(nameof(keyId));
            }
            if (secretKey == null)
            {
                throw new ArgumentException(nameof(secretKey));
            }

            _keyId     = keyId;
            _secretKey = secretKey;

            alpacaRestApi = alpacaRestApi ?? new Uri("https://api.alpaca.markets");

            var uriBuilder = new UriBuilder(alpacaRestApi)
            {
                Scheme = alpacaRestApi.Scheme == "http" ? "ws" : "wss"
            };

            uriBuilder.Path += "stream";

            _webSocket = new WebSocketClientWrapper();
            _webSocket.Initialize(uriBuilder.Uri.ToString());

            _webSocket.Open   += HandleOpened;
            _webSocket.Closed += HandleClosed;

            _webSocket.Message += HandleDataReceived;
            _webSocket.Error   += (sender, args) =>
            {
                OnError?.Invoke(args.Exception);
            };
        }
        /// <summary>
        /// Create the Brokerage instance
        /// </summary>
        /// <param name="job"></param>
        /// <param name="algorithm"></param>
        /// <returns></returns>
        public override IBrokerage CreateBrokerage(Packets.LiveNodePacket job, IAlgorithm algorithm)
        {
            var required = new[] { "gdax-url", "gdax-api-secret", "gdax-api-key", "gdax-passphrase" };

            foreach (var item in required)
            {
                if (string.IsNullOrEmpty(job.BrokerageData[item]))
                {
                    throw new Exception($"GDAXBrokerageFactory.CreateBrokerage: Missing {item} in config.json");
                }
            }

            var restClient      = new RestClient("https://api.pro.coinbase.com");
            var webSocketClient = new WebSocketClientWrapper();
            var priceProvider   = new ApiPriceProvider(job.UserId, job.UserToken);

            IBrokerage brokerage;

            if (job.DataQueueHandler.EndsWith("GDAXDataQueueHandler"))
            {
                var dataQueueHandler = new GDAXDataQueueHandler(job.BrokerageData["gdax-url"], webSocketClient,
                                                                restClient, job.BrokerageData["gdax-api-key"], job.BrokerageData["gdax-api-secret"],
                                                                job.BrokerageData["gdax-passphrase"], algorithm, priceProvider);

                Composer.Instance.AddPart <IDataQueueHandler>(dataQueueHandler);

                brokerage = dataQueueHandler;
            }
            else
            {
                brokerage = new GDAXBrokerage(job.BrokerageData["gdax-url"], webSocketClient,
                                              restClient, job.BrokerageData["gdax-api-key"], job.BrokerageData["gdax-api-secret"],
                                              job.BrokerageData["gdax-passphrase"], algorithm, priceProvider);
            }

            return(brokerage);
        }