public IDisposable Initialize(IObservable<IConnected<IBroker>> brokerStream, IObservable<IConnected<IEventStoreConnection>> eventStore)
        {
            _cache = new TradeCache(eventStore);
            _service = new BlotterService(_cache.GetTrades());
            var disposable = brokerStream.LaunchOrKill(broker => new BlotterServiceHost(_service, broker)).Subscribe();

            _cleanup.Add(disposable);

            return disposable;
        }
        public AnalyticsServiceHost(IAnalyticsService service, IBroker broker, TradeCache tradeCache) : base(broker, "analytics")
        {
            _service = service;
            _broker = broker;
            _tradeCache = tradeCache;
            _subscriptions = new CompositeDisposable();

            RegisterCall("getAnalytics", GetAnalyticsStream);
            StartHeartBeat();

            ListenForPricesAndTrades();
        }
Example #3
0
        public async Task StreamThrows()
        {
            var api    = new Mock <IBinanceApi>().Object;
            var client = new Mock <ITradeWebSocketClient>().Object;

            var cache = new TradeCache(api, client);

            using (var cts = new CancellationTokenSource())
            {
                await Assert.ThrowsAsync <ArgumentNullException>("symbol", () => cache.StreamAsync(null, cts.Token));
            }
        }
Example #4
0
        public void SubscribeThrows()
        {
            var symbol = Symbol.BTC_USDT;
            var api    = new Mock <IBinanceApi>().Object;
            var client = new Mock <ITradeWebSocketClient>().Object;

            var cache = new TradeCache(api, client);

            Assert.Throws <ArgumentNullException>("symbol", () => cache.Subscribe(null));
            Assert.Throws <ArgumentNullException>("symbol", () => cache.Subscribe(string.Empty));

            cache.Subscribe(symbol);

            Assert.Throws <InvalidOperationException>(() => cache.Subscribe(symbol));
        }
Example #5
0
        public void TradeCache_AddTrades_GetLastTrades()
        {
            // Arrange
            int incrementalSize = 5;
            var tradeCache      = new TradeCache <TestTradeCreator, TestTrade, TestTradeParameters>(incrementalSize);
            var trade1          = new TestTrade {
                Id = 1, Price = 0123m, Quantity = 1000m, Time = new DateTime(2000, 1, 1, 1, 0, 1)
            };
            var trade2 = new TestTrade {
                Id = 2, Price = 0121m, Quantity = 500m, Time = new DateTime(2000, 1, 1, 1, 0, 2)
            };
            var trade3 = new TestTrade {
                Id = 3, Price = 0124m, Quantity = 750m, Time = new DateTime(2000, 1, 1, 1, 0, 3)
            };

            // Act
            tradeCache.Add(trade1);
            tradeCache.Add(trade2);
            tradeCache.Add(trade3);

            var trades          = tradeCache.GetTrades();
            var lastTrade       = tradeCache.GetLastTrade();
            var lastTrades      = tradeCache.GetLastTrades(3);
            var lastTradesOver  = tradeCache.GetLastTrades(4);
            var lastTradesUnder = tradeCache.GetLastTrades(2);

            // Assert
            Assert.AreEqual(tradeCache.Position, 2);
            Assert.AreEqual(tradeCache.CacheSize, 5);
            Assert.AreEqual(tradeCache.TradeRange, 5);
            Assert.AreEqual(trades.Length, 3);

            Assert.AreEqual(lastTrade, trade3);

            Assert.AreEqual(lastTrades.Length, 3);
            Assert.AreEqual(lastTrades[0], trade1);
            Assert.AreEqual(lastTrades[1], trade2);
            Assert.AreEqual(lastTrades[2], trade3);

            Assert.AreEqual(lastTradesOver.Length, 3);
            Assert.AreEqual(lastTradesOver[0], trade1);
            Assert.AreEqual(lastTradesOver[1], trade2);
            Assert.AreEqual(lastTradesOver[2], trade3);

            Assert.AreEqual(lastTradesUnder.Length, 2);
            Assert.AreEqual(lastTradesUnder[0], trade2);
            Assert.AreEqual(lastTradesUnder[1], trade3);
        }
Example #6
0
        public void TradeCache_Initialise()
        {
            // Arrange
            int incrementalSize = 5;
            TradeCache <TestTradeCreator, TestTrade, TestTradeParameters> tradeCache;

            // Act
            tradeCache = new TradeCache <TestTradeCreator, TestTrade, TestTradeParameters>(incrementalSize);

            // Assert
            Assert.AreEqual(tradeCache.Position, -1);
            Assert.AreEqual(tradeCache.TradeRange, 5);
            Assert.AreEqual(tradeCache.CacheSize, incrementalSize);
            Assert.IsNull(tradeCache.GetLastTrade());
            Assert.IsNull(tradeCache.GetTrades());
            Assert.IsNull(tradeCache.GetLastTrades(1));
            Assert.IsNull(tradeCache.GetLastTrades(5));
        }
Example #7
0
        static void Construct()
        {
            LrpClient         = CreateLocalClient(Signature.Value, "SoftFX.LlApi.");
            LrpLlCommonClient = CreateLocalClient(Financial.Generated.Signature.Value, "SoftFX.LlCommon.");

            Serializer = new Financial.Generated.Serializer(LrpLlCommonClient);

            Handle                 = new Handle(LrpClient);
            Params                 = new Params(LrpClient);
            Client                 = new ClientServer(LrpClient);
            ClientCache            = new ClientCache(LrpClient);
            FeedServer             = new FeedServer(LrpClient);
            FeedCache              = new FeedCache(LrpClient);
            TradeServer            = new TradeServer(LrpClient);
            TradeCache             = new TradeCache(LrpClient);
            Converter              = new Converter(LrpClient);
            TradeHistoryIterator   = new TradeHistoryIterator(LrpClient);
            DailySnapshotsIterator = new DailySnapshotsIterator(LrpClient);
            Library                = new Library(LrpClient);
        }
Example #8
0
        public Task SubscribeTrades(string symbol, int limit, Action <TradeEventArgs> callback, Action <Exception> exception, CancellationToken cancellationToken)
        {
            var tcs = new TaskCompletionSource <object>();

            try
            {
                var tradeCache = new TradeCache(binanceApi, new TradeWebSocketClient());
                tradeCache.Subscribe(symbol, limit, e =>
                {
                    if (cancellationToken.IsCancellationRequested)
                    {
                        tradeCache.Unsubscribe();
                        return;
                    }

                    try
                    {
                        var trades = e.Trades.Select(t => NewTrade(t)).ToList();
                        callback.Invoke(new TradeEventArgs {
                            Trades = trades
                        });
                    }
                    catch (Exception ex)
                    {
                        tradeCache.Unsubscribe();
                        exception.Invoke(ex);
                        return;
                    }
                });

                tcs.SetResult(null);
            }
            catch (Exception ex)
            {
                tcs.SetException(ex);
            }

            return(tcs.Task);
        }
Example #9
0
        public override async Task <bool> TryUpdateStrategyAsync(string parameters)
        {
            var tcs = new TaskCompletionSource <bool>();

            try
            {
                var strategyParameters = JsonConvert.DeserializeObject <MovingAverageTradeParameters>(parameters);

                if (tradeCache == null)
                {
                    tradeCache = new TradeCache <MovingAverageTradeCreator, MovingAverageTrade, MovingAverageTradeParameters>(strategyParameters.TradeRange);
                }

                if (movingAverageTradeParameters == null ||
                    !strategyParameters.MovingAvarageRange.Equals(movingAverageTradeParameters.MovingAvarageRange) ||
                    !strategyParameters.SellIndicator.Equals(movingAverageTradeParameters.SellIndicator) ||
                    !strategyParameters.BuyIndicator.Equals(movingAverageTradeParameters.BuyIndicator))
                {
                    movingAverageTradeParameters = strategyParameters;
                    tradeCache.TradeCreator.Reset(movingAverageTradeParameters);
                }

                suspend = movingAverageTradeParameters.Suspend;

                StrategyNotification(new StrategyNotificationEventArgs {
                    StrategyNotification = new StrategyNotification {
                        Name = Strategy.Name, Message = $"Parameter update : {parameters}", NotificationLevel = NotificationLevel.Information
                    }
                });

                tcs.SetResult(true);
            }
            catch (Exception ex)
            {
                tcs.SetException(ex);
            }

            return(await tcs.Task);
        }
Example #10
0
        public void LinkToClient()
        {
            var api     = new Mock <IBinanceApi>().Object;
            var client1 = new Mock <ITradeClient>().Object;
            var client2 = new TradeClient();
            var symbol1 = Symbol.BTC_USDT;
            var symbol2 = Symbol.LTC_BTC;

            client2.Subscribe(symbol1);

            var clientSubscribeStreams = client2.SubscribedStreams.ToArray();

            Assert.Equal(TradeClient.GetStreamName(symbol1), clientSubscribeStreams.Single());

            var cache = new TradeCache(api, client1)
            {
                Client = client2 // link client.
            };

            // Client subscribed streams are unchanged after link to unsubscribed cache.
            Assert.Equal(clientSubscribeStreams, client2.SubscribedStreams);

            cache.Client = client1; // unlink client.

            // Subscribe cache to symbol.
            cache.Subscribe(symbol2);

            // Cache is subscribed to symbol.
            Assert.Equal(TradeClient.GetStreamName(symbol2), cache.SubscribedStreams.Single());

            cache.Client = client2; // link to client.

            // Client has second subscribed stream from cache.
            Assert.True(client2.SubscribedStreams.Count() == 2);
            Assert.Contains(TradeClient.GetStreamName(symbol2), client2.SubscribedStreams);
        }
 public IDisposable Initialize(IObservable <IConnected <IBroker> > brokerStream, IObservable <IConnected <IEventStoreConnection> > eventStoreStream)
 {
     _cache   = new TradeCache(eventStoreStream);
     _service = new BlotterService(_cache.GetTrades());
     return(brokerStream.LaunchOrKill(broker => new BlotterServiceHost(_service, broker)).Subscribe());
 }
Example #12
0
File: Native.cs Project: ifzz/FDK
        static void Construct()
        {
            LrpClient = CreateLocalClient(Signature.Value, "SoftFX.LlApi.");
            LrpLlCommonClient = CreateLocalClient(Financial.Generated.Signature.Value, "SoftFX.LlCommon.");

            Serializer = new Financial.Generated.Serializer(LrpLlCommonClient);

            Handle = new Handle(LrpClient);
            Params = new Params(LrpClient);
            Client = new ClientServer(LrpClient);
            ClientCache = new ClientCache(LrpClient);
            FeedServer = new FeedServer(LrpClient);
            FeedCache = new FeedCache(LrpClient);
            TradeServer = new TradeServer(LrpClient);
            TradeCache = new TradeCache(LrpClient);
            Converter = new Converter(LrpClient);
            Iterator = new Iterator(LrpClient);
            Library = new Library(LrpClient);
        }