示例#1
0
        public void UpdateTrades_Second_Update_3_New_Trades_Less_Than_Limit()
        {
            // Arrange
            var preferences = new Model.Preferences();

            preferences.OrderBookChartDisplayCount = 8;
            preferences.OrderBookDisplayCount      = 5;
            preferences.TradesDisplayCount         = 15;
            preferences.TradesChartDisplayCount    = 18;

            var exchangeApi     = ExchangeServiceHelper.GetExchangeService(ExchangeServiceType.SubscribeOrderBookAggregateTrades);
            var exchangeService = new WpfExchangeService(exchangeApi);
            var symbolViewModel = new SymbolViewModel(Exchange.Test, exchangeService, chartHelper,
                                                      new BinanceOrderBookHelper(),
                                                      new TradeHelper(),
                                                      preferences, new DebugLogger());

            var trx = TestHelper.BNB.GetViewSymbol();

            symbolViewModel.Symbol = trx;

            var firstTrades = TradesUpdateHelper.Trades_BNB_InitialTradeUpdate_10_Trades();

            var secondTrades = TradesUpdateHelper.Trades_BNB_NextTradeUpdate(firstTrades, 3, 3);

            // Act
            symbolViewModel.UpdateTrades(firstTrades);

            symbolViewModel.UpdateTrades(secondTrades);

            // Assert
            Assert.AreEqual(symbolViewModel.Trades.Count, 13);
            Assert.AreEqual(symbolViewModel.TradesChart.Count, 13);

            var chart = firstTrades.Take(3).ToList();

            chart.AddRange(secondTrades);

            // Assert - chart trades
            for (int i = 0; i < 13; i++)
            {
                Assert.AreEqual(symbolViewModel.TradesChart[i].Id, chart[i].Id);
                Assert.AreEqual(symbolViewModel.TradesChart[i].Time, chart[i].Time);
            }

            // Assert - trades
            var trades = chart.Reverse <ITrade>().ToList();

            for (int i = 0; i < 13; i++)
            {
                Assert.AreEqual(symbolViewModel.Trades[i].Id, trades[i].Id);
                Assert.AreEqual(symbolViewModel.Trades[i].Time, trades[i].Time);
            }
        }
示例#2
0
        public async Task SelectedSymbol()
        {
            // Arrange
            var    fail                = false;
            Symbol selectedSymbol      = null;
            var    exchangeApi         = ExchangeServiceHelper.GetExchangeService(ExchangeServiceType.SymbolsViewModel);
            var    exchangeService     = new WpfExchangeService(exchangeApi);
            var    symbolsCacheFactory = SymbolsCacheFactoryHelper.GetSymbolsCachefactory(exchangeService);
            var    symbolsViewModel    = new SymbolsViewModel(exchangeService, symbolsCacheFactory, new DebugLogger());

            var symbolsObservable = Observable.FromEventPattern <SymbolsEventArgs>(
                eventHandler => symbolsViewModel.OnSymbolsNotification += eventHandler,
                eventHandler => symbolsViewModel.OnSymbolsNotification -= eventHandler)
                                    .Select(eventPattern => eventPattern.EventArgs);

            symbolsObservable.Subscribe((args) =>
            {
                if (args.Value != null)
                {
                    selectedSymbol = args.Value;
                }
                else if (args.Symbols != null)
                {
                    // expected
                }
                else
                {
                    fail = true;
                }
            });

            var userAccount = new UserAccount
            {
                Preferences = new Preferences {
                    SelectedSymbol = "BNBBTC",
                }
            };

            userAccount.Preferences.FavouriteSymbols.Add("BNBBTC");
            userAccount.Preferences.FavouriteSymbols.Add("TRXBTC");

            await symbolsViewModel.SetAccount(userAccount);

            await Task.Delay(1000);

            // Act
            var trx = symbolsViewModel.Symbols.Single(s => s.Name.Equals("TRXBTC"));

            symbolsViewModel.SelectedSymbol = trx;

            // Assert
            Assert.AreEqual(symbolsViewModel.SelectedSymbol, selectedSymbol);
            Assert.IsFalse(fail);
        }
        public async Task Buy_Fails_Order_Validation()
        {
            // Arrange
            var cxlToken        = new CancellationToken();
            var exchangeApi     = ExchangeServiceHelper.GetExchangeService();
            var exchangeService = new WpfExchangeService(exchangeApi);
            var tradeViewModel  = new TradeViewModel(exchangeService, new DebugLogger());

            var symbols = await exchangeService.GetSymbols24HourStatisticsAsync(Exchange.Test, cxlToken);

            var trx = symbols.Single(s => s.Name.Equals("TRXBTC"));

            var account = new Account(new Core.Model.AccountInfo {
                User = new Core.Model.User()
            })
            {
                ApiKey    = "apikey",
                ApiSecret = "apisecret"
            };

            account = await exchangeService.GetAccountInfoAsync(Exchange.Test, account.AccountInfo.User, cxlToken);

            var selectedAsset = account.Balances.Single(ab => ab.Asset.Equals("TRX"));

            tradeViewModel.SetSymbols(symbols.ToList());
            tradeViewModel.SetAccount(account);
            tradeViewModel.SetSymbol(selectedAsset);

            tradeViewModel.QuoteAccountBalance.Free = 0.00012693M;

            tradeViewModel.SelectedOrderType = "Limit";
            tradeViewModel.Price             = 0.00000900M;

            var tradeObservable = Observable.FromEventPattern <TradeEventArgs>(
                eventHandler => tradeViewModel.OnTradeNotification += eventHandler,
                eventHandler => tradeViewModel.OnTradeNotification -= eventHandler)
                                  .Select(eventPattern => eventPattern.EventArgs);

            Exception ex = null;

            tradeObservable.Subscribe(args =>
            {
                if (args.HasException)
                {
                    ex = args.Exception;
                }
            });

            // Act
            tradeViewModel.BuyCommand.Execute(null);

            // Assert
            Assert.IsInstanceOfType(ex, typeof(OrderValidationException));
        }
        public void SelectedAsset()
        {
            // Arrange
            var            fail = false;
            AccountBalance selectedAccountBalance = null;
            var            exchangeApi            = ExchangeServiceHelper.GetExchangeService();
            var            exchangeService        = new WpfExchangeService(exchangeApi);
            var            symbolsCache           = SymbolsCacheHelper.GetSymbolsCache(exchangeService);
            var            accountViewModel       = new AccountViewModel(exchangeService, symbolsCache, new DebugLogger());

            var account = new Account(new Interface.AccountInfo {
                User = new Interface.User()
            })
            {
                ApiKey    = "apikey",
                ApiSecret = "apisecret"
            };

            accountViewModel.Account = account;

            var accountObservable = Observable.FromEventPattern <AccountEventArgs>(
                eventHandler => accountViewModel.OnAccountNotification += eventHandler,
                eventHandler => accountViewModel.OnAccountNotification -= eventHandler)
                                    .Select(eventPattern => eventPattern.EventArgs);

            accountObservable.Subscribe(args =>
            {
                if (args.AccountEventType.Equals(AccountEventType.LoggedOut) ||
                    args.AccountEventType.Equals(AccountEventType.LoggedIn))
                {
                    // expected
                }
                else if (args.AccountEventType.Equals(AccountEventType.SelectedAsset))
                {
                    selectedAccountBalance = args.SelectedAsset;
                }
                else
                {
                    fail = true;
                }
            });

            // Act
            accountViewModel.SetAccount(account);
            accountViewModel.LoginCommand.Execute(null);
            var trx = accountViewModel.Account.Balances.Single(ab => ab.Asset.Equals("TRX"));

            accountViewModel.SelectedAsset = trx;

            // Assert
            Assert.AreEqual(selectedAccountBalance, trx);
            Assert.IsFalse(fail);
        }
示例#5
0
        public async Task Buy_Fails_No_OrderType()
        {
            // Arrange
            var cxlToken        = new CancellationToken();
            var exchangeApi     = ExchangeServiceHelper.GetExchangeService();
            var exchangeService = new WpfExchangeService(exchangeApi);
            var tradeViewModel  = new TradeViewModel(exchangeService);

            var symbols = await exchangeService.GetSymbols24HourStatisticsAsync(cxlToken);

            var trx = symbols.Single(s => s.Name.Equals("TRXBTC"));

            var account = new Account(new Interface.AccountInfo {
                User = new Interface.User()
            })
            {
                ApiKey    = "apikey",
                ApiSecret = "apisecret"
            };

            account = await exchangeService.GetAccountInfoAsync(account.AccountInfo.User.ApiKey, account.AccountInfo.User.ApiSecret, cxlToken);

            var selectedAsset = account.Balances.Single(ab => ab.Asset.Equals("TRX"));

            tradeViewModel.SetSymbols(symbols.ToList());
            tradeViewModel.SetAccount(account);
            tradeViewModel.SetSymbol(selectedAsset);

            tradeViewModel.Quantity = 200m;
            tradeViewModel.Price    = 0.00000900M;

            var tradeObservable = Observable.FromEventPattern <TradeEventArgs>(
                eventHandler => tradeViewModel.OnTradeNotification += eventHandler,
                eventHandler => tradeViewModel.OnTradeNotification -= eventHandler)
                                  .Select(eventPattern => eventPattern.EventArgs);

            Exception ex = null;

            tradeObservable.Subscribe(args =>
            {
                if (args.HasException)
                {
                    ex = args.Exception;
                }
            });

            // Act
            tradeViewModel.BuyCommand.Execute(null);

            // Assert
            Assert.IsNotNull(ex);
            Assert.IsTrue(ex.Message.Contains("order type"));
        }
        public void HasQuoteBaseBalance_Null()
        {
            // Arrange
            var exchangeApi     = ExchangeServiceHelper.GetExchangeService();
            var exchangeService = new WpfExchangeService(exchangeApi);
            var tradeViewModel  = new TradeViewModel(exchangeService, new DebugLogger());

            // Act

            // Assert
            Assert.IsFalse(tradeViewModel.HasBaseBalance);
            Assert.IsFalse(tradeViewModel.HasQuoteBalance);
        }
        public void Login()
        {
            // Arrange
            var    fail             = false;
            var    loggedInAccount  = string.Empty;
            string errorMessage     = string.Empty;
            var    exchangeApi      = ExchangeServiceHelper.GetExchangeService();
            var    exchangeService  = new WpfExchangeService(exchangeApi);
            var    symbolsCache     = SymbolsCacheHelper.GetSymbolsCache(exchangeService);
            var    accountViewModel = new AccountViewModel(exchangeService, symbolsCache, new DebugLogger());

            var account = new Account(new Interface.AccountInfo {
                User = new Interface.User()
            })
            {
                ApiKey    = "apikey",
                ApiSecret = "apisecret"
            };

            accountViewModel.Account = account;

            var accountObservable = Observable.FromEventPattern <AccountEventArgs>(
                eventHandler => accountViewModel.OnAccountNotification += eventHandler,
                eventHandler => accountViewModel.OnAccountNotification -= eventHandler)
                                    .Select(eventPattern => eventPattern.EventArgs);

            accountObservable.Subscribe(args =>
            {
                if (args.AccountEventType.Equals(AccountEventType.LoggedIn))
                {
                    loggedInAccount = JsonConvert.SerializeObject(args.Value);
                }
                else
                {
                    fail = true;
                }
            });

            // Act
            accountViewModel.LoginCommand.Execute(null);

            // Assert
            var accountViewModelAccount = JsonConvert.SerializeObject(accountViewModel.Account);
            var accountInfo             = JsonConvert.SerializeObject(accountViewModel.Account.AccountInfo);
            var testAccountInfo         = JsonConvert.SerializeObject(TestHelper.AccountInfo);

            Assert.AreEqual(accountViewModelAccount, loggedInAccount);
            Assert.AreEqual(accountInfo, testAccountInfo);
            Assert.IsFalse(fail);
        }
示例#8
0
        public void HasQuoteBaseBalance_Null()
        {
            // Arrange
            var cxlToken        = new CancellationToken();
            var exchangeApi     = ExchangeServiceHelper.GetExchangeService();
            var exchangeService = new WpfExchangeService(exchangeApi);
            var tradeViewModel  = new TradeViewModel(exchangeService);

            // Act

            // Assert
            Assert.IsFalse(tradeViewModel.HasBaseBalance);
            Assert.IsFalse(tradeViewModel.HasQuoteBalance);
        }
示例#9
0
        public async Task GetSymbols24HourStatisticsAsync()
        {
            // Arrange
            var exchangeApi     = ExchangeServiceHelper.GetExchangeService();
            var exchangeService = new WpfExchangeService(exchangeApi);
            var cxlToken        = new CancellationToken();

            // Act
            var symbols = await exchangeService.GetSymbols24HourStatisticsAsync(Exchange.Test, cxlToken).ConfigureAwait(false);

            // Assert
            var testResults = symbols.Where(s => s.SymbolStatistics.LastPrice.Equals(0.0M)).ToList();

            Assert.IsFalse(testResults.Any());
        }
示例#10
0
        public async Task SymbolsViewModel_SetAccount()
        {
            // Arrange
            var fail                = false;
            var exchangeApi         = ExchangeServiceHelper.GetExchangeService(ExchangeServiceType.SymbolsViewModel);
            var exchangeService     = new WpfExchangeService(exchangeApi);
            var symbolsCacheFactory = SymbolsCacheFactoryHelper.GetSymbolsCachefactory(exchangeService);

            // Act
            var symbolsViewModel = new SymbolsViewModel(exchangeService, symbolsCacheFactory, new DebugLogger());

            var symbolsObservable = Observable.FromEventPattern <SymbolsEventArgs>(
                eventHandler => symbolsViewModel.OnSymbolsNotification += eventHandler,
                eventHandler => symbolsViewModel.OnSymbolsNotification -= eventHandler)
                                    .Select(eventPattern => eventPattern.EventArgs);

            symbolsObservable.Subscribe((args) =>
            {
                if (args.Symbols != null || // OnLoadedSymbols
                    args.Value.Name.Equals("BNBBTC"))    // OnSelectedSymbol
                {
                    // expected
                }
                else
                {
                    fail = true;
                }
            });

            await symbolsViewModel.SetAccount(
                new UserAccount
            {
                Preferences = new Preferences
                {
                    SelectedSymbol   = "BNBBTC",
                    FavouriteSymbols = new ObservableCollection <string>(new[] { "BNBBTC", "TRXBTC" })
                }
            });

            await Task.Delay(1000);

            // Assert
            Assert.AreEqual(symbolsViewModel.Symbols.Count, 2);
            Assert.IsNotNull(symbolsViewModel.AccountPreferences);
            Assert.IsNotNull(symbolsViewModel.SelectedSymbol);
            Assert.AreEqual(symbolsViewModel.SelectedSymbol.Name, "BNBBTC");
            Assert.IsFalse(fail);
        }
示例#11
0
        public async Task UpdateOrderBook()
        {
            // Arrange
            var cxlToken        = new CancellationToken();
            var exchangeApi     = ExchangeServiceHelper.GetExchangeService(ExchangeServiceType.SubscribeOrderBookAggregateTrades);
            var exchangeService = new WpfExchangeService(exchangeApi);
            var symbolViewModel = new SymbolViewModel(exchangeService);

            var trx = TestHelper.Trx.GetViewSymbol();

            // Act
            await symbolViewModel.SetSymbol(trx);

            // Assert
            Assert.AreEqual(symbolViewModel.OrderBook.LastUpdateId, TestHelper.OrderBookUpdated.LastUpdateId);
        }
示例#12
0
        public async Task Login()
        {
            // Arrange
            var     fail                = false;
            Account notifyAccount       = null;
            var     exchangeApi         = ExchangeServiceHelper.GetExchangeService();
            var     exchangeService     = new WpfExchangeService(exchangeApi);
            var     symbolsCacheFactory = SymbolsCacheFactoryHelper.GetSymbolsCachefactory(exchangeService);
            var     accountViewModel    = new AccountBalancesViewModel(exchangeService, symbolsCacheFactory, new DebugLogger());

            var account = new Account(new Core.Model.AccountInfo {
                User = new Core.Model.User()
            })
            {
                ApiKey    = "apikey",
                ApiSecret = "apisecret"
            };

            var accountObservable = Observable.FromEventPattern <AccountEventArgs>(
                eventHandler => accountViewModel.OnAccountNotification += eventHandler,
                eventHandler => accountViewModel.OnAccountNotification -= eventHandler)
                                    .Select(eventPattern => eventPattern.EventArgs);

            accountObservable.Subscribe(args =>
            {
                if (args.AccountEventType.Equals(AccountEventType.LoggedIn))
                {
                    notifyAccount = args.Value;
                }
                else
                {
                    fail = true;
                }
            });

            // Act
            await accountViewModel.Login(account);

            // Assert
            Assert.AreEqual(account.ApiKey, accountViewModel.Account.ApiKey);
            Assert.AreEqual(account.AccountInfo.User.ApiSecret, accountViewModel.Account.AccountInfo.User.ApiSecret);
            Assert.IsNotNull(notifyAccount);
            Assert.AreEqual(account.ApiKey, notifyAccount.ApiKey);
            Assert.AreEqual(account.AccountInfo.User.ApiSecret, notifyAccount.AccountInfo.User.ApiSecret);
            Assert.IsFalse(fail);
        }
示例#13
0
        public void SetAccount()
        {
            // Arrange
            var     fail             = false;
            Account notifyAccount    = null;
            var     exchangeApi      = ExchangeServiceHelper.GetExchangeService();
            var     exchangeService  = new WpfExchangeService(exchangeApi);
            var     accountViewModel = new AccountViewModel(exchangeService);

            var account = new Account(new Interface.AccountInfo {
                User = new Interface.User()
            })
            {
                ApiKey    = "apikey",
                ApiSecret = "apisecret"
            };

            var accountObservable = Observable.FromEventPattern <AccountEventArgs>(
                eventHandler => accountViewModel.OnAccountNotification += eventHandler,
                eventHandler => accountViewModel.OnAccountNotification -= eventHandler)
                                    .Select(eventPattern => eventPattern.EventArgs);

            accountObservable.Subscribe(args =>
            {
                if (args.AccountEventType.Equals(AccountEventType.LoggedIn))
                {
                    notifyAccount = args.Value;
                }
                else
                {
                    fail = true;
                }
            });

            // Act
            accountViewModel.SetAccount(account);

            // Assert
            Assert.AreEqual(account.ApiKey, accountViewModel.Account.ApiKey);
            Assert.AreEqual(account.AccountInfo.User.ApiSecret, accountViewModel.Account.AccountInfo.User.ApiSecret);
            Assert.IsNotNull(notifyAccount);
            Assert.AreEqual(account.ApiKey, notifyAccount.ApiKey);
            Assert.AreEqual(account.AccountInfo.User.ApiSecret, notifyAccount.AccountInfo.User.ApiSecret);
            Assert.IsFalse(fail);
        }
        public void Login_AccountKeyMissing_NotifyHasException()
        {
            // Arrange
            var    fail             = false;
            string errorMessage     = string.Empty;
            var    exchangeApi      = ExchangeServiceHelper.GetExchangeService();
            var    exchangeService  = new WpfExchangeService(exchangeApi);
            var    symbolsCache     = SymbolsCacheHelper.GetSymbolsCache(exchangeService);
            var    accountViewModel = new AccountViewModel(exchangeService, symbolsCache, new DebugLogger());

            var account = new Account(new Interface.AccountInfo {
                User = new Interface.User()
            })
            {
                ApiKey = "apikey"
            };

            accountViewModel.Account = account;

            var accountObservable = Observable.FromEventPattern <AccountEventArgs>(
                eventHandler => accountViewModel.OnAccountNotification += eventHandler,
                eventHandler => accountViewModel.OnAccountNotification -= eventHandler)
                                    .Select(eventPattern => eventPattern.EventArgs);

            accountObservable.Subscribe(args =>
            {
                if (args.HasException)
                {
                    errorMessage = args.Exception.Message;
                }
                else
                {
                    fail = true;
                }
            });

            // Act
            accountViewModel.LoginCommand.Execute(null);

            // Assert
            Assert.AreEqual(errorMessage, "Both api key and secret key are required to login to an account.");
            Assert.IsFalse(fail);
        }
示例#15
0
        public void UpdateTrades_Third_Update()
        {
            // Arrange
            var preferences = new Model.Preferences
            {
                OrderBookChartDisplayCount = 8,
                OrderBookDisplayCount      = 5,
                TradesDisplayCount         = 15,
                TradesChartDisplayCount    = 18
            };

            var exchangeApi     = ExchangeServiceHelper.GetExchangeService(ExchangeServiceType.SubscribeOrderBookAggregateTrades);
            var exchangeService = new WpfExchangeService(exchangeApi);
            var symbolViewModel = new SymbolViewModel(Exchange.Test, exchangeService, chartHelper,
                                                      new BinanceOrderBookHelper(),
                                                      new TradeHelper(),
                                                      preferences, new DebugLogger());

            var trx = TestHelper.BNB.GetViewSymbol();

            symbolViewModel.Symbol = trx;

            var firstTrades = TradesUpdateHelper.Trades_BNB_InitialTradeUpdate_10_Trades();

            var secondTrades = TradesUpdateHelper.Trades_BNB_NextTradeUpdate(firstTrades, 3, 3);

            var thirdTrades = TradesUpdateHelper.Trades_BNB_NextTradeUpdate(secondTrades, 9, 9);

            // Act
            symbolViewModel.UpdateTrades(firstTrades);

            symbolViewModel.UpdateTrades(secondTrades);

            symbolViewModel.UpdateTrades(thirdTrades);

            // Assert
            var update = secondTrades.Skip(1).Take(8).ToList();

            update.AddRange(thirdTrades);

            AssertTradeUpdate(symbolViewModel, preferences, update);
        }
示例#16
0
        public void Quantity_and_Price_and_StopPrice_NoSelectedSymbol()
        {
            // Arrange
            var exchangeApi     = ExchangeServiceHelper.GetExchangeService();
            var exchangeService = new WpfExchangeService(exchangeApi);
            var tradeViewModel  = new TradeViewModel(exchangeService, new DebugLogger());

            var quantity = 294.123m;
            var price    = 1.123456789m;

            // Act
            tradeViewModel.Quantity  = quantity;
            tradeViewModel.Price     = price;
            tradeViewModel.StopPrice = price;

            // Assert
            Assert.AreEqual(tradeViewModel.Quantity, quantity);
            Assert.AreEqual(tradeViewModel.Price, price);
            Assert.AreEqual(tradeViewModel.StopPrice, price);
        }
示例#17
0
        public async Task SelectedSymbol()
        {
            // Arrange
            var    fail             = false;
            Symbol selectedSymbol   = null;
            var    exchangeApi      = ExchangeServiceHelper.GetExchangeService(ExchangeServiceType.SymbolsViewModel);
            var    exchangeService  = new WpfExchangeService(exchangeApi);
            var    symbolsViewModel = new SymbolsViewModel(exchangeService);

            var symbolsObservable = Observable.FromEventPattern <SymbolsEventArgs>(
                eventHandler => symbolsViewModel.OnSymbolsNotification += eventHandler,
                eventHandler => symbolsViewModel.OnSymbolsNotification -= eventHandler)
                                    .Select(eventPattern => eventPattern.EventArgs);

            symbolsObservable.Subscribe((args) =>
            {
                if (args.Value != null)
                {
                    selectedSymbol = args.Value;
                }
                else if (args.Symbols != null)
                {
                    // expected
                }
                else
                {
                    fail = true;
                }
            });

            await Task.Delay(1000);

            // Act
            var trx = symbolsViewModel.Symbols.Single(s => s.Name.Equals("TRXBTC"));

            symbolsViewModel.SelectedSymbol = trx;

            // Assert
            Assert.AreEqual(symbolsViewModel.SelectedSymbol, selectedSymbol);
            Assert.IsFalse(fail);
        }
        public async Task OrderTypes_NoSelectedSymbol()
        {
            // Arrange
            var cxlToken        = new CancellationToken();
            var exchangeApi     = ExchangeServiceHelper.GetExchangeService();
            var exchangeService = new WpfExchangeService(exchangeApi);
            var tradeViewModel  = new TradePanelViewModel(exchangeService, new DebugLogger());

            var symbols = await exchangeService.GetSymbols24HourStatisticsAsync(Exchange.Test, cxlToken);

            tradeViewModel.SetSymbols(symbols.ToList());

            // Act

            // Assert
            Assert.IsNull(tradeViewModel.SelectedSymbol);

            var intersection = tradeViewModel.OrderTypes.Intersect(InterfaceExtensions.OrderExtensions.OrderTypes()).ToList();

            Assert.IsTrue(InterfaceExtensions.OrderExtensions.OrderTypes().Count().Equals(intersection.Count));
        }
示例#19
0
        public async Task SetAccount_Different_Account_Null_SelectedAsset()
        {
            // Arrange
            var cxlToken        = new CancellationToken();
            var exchangeApi     = ExchangeServiceHelper.GetExchangeService();
            var exchangeService = new WpfExchangeService(exchangeApi);
            var tradeViewModel  = new TradeViewModel(exchangeService);

            var symbols = await exchangeService.GetSymbols24HourStatisticsAsync(cxlToken);

            tradeViewModel.SetSymbols(symbols.ToList());

            var account = new Account(new Interface.AccountInfo {
                User = new Interface.User()
            })
            {
                ApiKey    = "apikey",
                ApiSecret = "apisecret"
            };

            account = await exchangeService.GetAccountInfoAsync(account.AccountInfo.User.ApiKey, account.AccountInfo.User.ApiSecret, cxlToken);

            tradeViewModel.SetAccount(account);

            var differentAccount = new Account(new Interface.AccountInfo {
                User = new Interface.User()
            })
            {
                ApiKey    = "test123",
                ApiSecret = "test123"
            };

            // Act
            tradeViewModel.SetAccount(differentAccount);

            // Assert
            Assert.AreEqual(tradeViewModel.Account, differentAccount);
            Assert.AreEqual(tradeViewModel.SelectedOrderType, null);
            Assert.IsNull(tradeViewModel.SelectedSymbol);
        }
示例#20
0
        public async Task UpdateAggregateTrades()
        {
            // Arrange
            var cxlToken        = new CancellationToken();
            var exchangeApi     = ExchangeServiceHelper.GetExchangeService(ExchangeServiceType.SubscribeOrderBookAggregateTrades);
            var exchangeService = new WpfExchangeService(exchangeApi);
            var symbolViewModel = new SymbolViewModel(exchangeService);

            var trx = TestHelper.Trx.GetViewSymbol();

            // Act
            await symbolViewModel.SetSymbol(trx);

            // Assert
            var trades        = TestHelper.AggregateTrades;
            var updatedtrades = TestHelper.AggregateTradesUpdated;

            var maxId     = trades.Max(t => t.Id);
            var newTrades = (from t in updatedtrades
                             where t.Id > maxId
                             orderby t.Time
                             select t).ToList();

            for (int i = 0; i < newTrades.Count(); i++)
            {
                if (trades.Count >= 20)
                {
                    trades.RemoveAt(trades.Count - 1);
                }

                trades.Insert(0, newTrades[i]);
            }

            Assert.AreEqual(symbolViewModel.AggregateTrades.Count, trades.Count);

            for (int i = 0; i < symbolViewModel.AggregateTrades.Count; i++)
            {
                Assert.AreEqual(symbolViewModel.AggregateTrades[i].Id, trades[i].Id);
            }
        }
        public async Task SetAccount_OverrideAccount()
        {
            // Arrange
            var exchangeApi      = ExchangeServiceHelper.GetExchangeService();
            var exchangeService  = new WpfExchangeService(exchangeApi);
            var accountViewModel = new OrdersViewModel(exchangeService, new DebugLogger());

            var firstAccount = new Account(new Interface.Model.AccountInfo {
                User = new Interface.Model.User()
            })
            {
                ApiKey    = "apikey",
                ApiSecret = "apisecret"
            };

            accountViewModel.Account = firstAccount;
            var firstorder = new Order {
                ClientOrderId = "test123", Symbol = "ETHBTC"
            };

            accountViewModel.Orders.Add(firstorder);

            var newAccount = new Account(new Interface.Model.AccountInfo {
                User = new Interface.Model.User()
            })
            {
                ApiKey    = "newapikey",
                ApiSecret = "newapisecret"
            };

            // Act
            await accountViewModel.SetAccount(newAccount);

            // Assert
            Assert.IsTrue(accountViewModel.Account.ApiKey.Equals(newAccount.ApiKey));
            foreach (var order in TestHelper.Orders)
            {
                Assert.IsNotNull(accountViewModel.Orders.SingleOrDefault(o => o.ClientOrderId.Equals(order.ClientOrderId)));
            }
        }
示例#22
0
        public async Task SubscribeStatistics()
        {
            // Arrange
            var exchangeApi     = ExchangeServiceHelper.GetExchangeService();
            var exchangeService = new WpfExchangeService(exchangeApi);
            var cxlToken        = new CancellationToken();

            var symbols = await exchangeService.GetSymbols24HourStatisticsAsync(cxlToken).ConfigureAwait(false);

            Action <Exception> exception = e => { };

            // Act
            exchangeService.SubscribeStatistics(symbols, exception, cxlToken);

            // Assert
            var eth             = symbols.Single(s => s.Name.Equals("ETHBTC"));
            var updatedEthStats = TestHelper.EthStats_UpdatedLastPrice_Upwards;

            Assert.AreEqual(eth.SymbolStatistics.PriceChangePercent, updatedEthStats.PriceChangePercent);
            Assert.AreEqual(eth.LastPriceChangeDirection, 1);
            Assert.AreEqual(eth.SymbolStatistics.LastPrice, updatedEthStats.LastPrice);
        }
示例#23
0
        public void UpdateOrderBook_SecondUpdate()
        {
            // Arrange
            var exchangeApi     = ExchangeServiceHelper.GetExchangeService();
            var exchangeService = new WpfExchangeService(exchangeApi);

            var preferences = new Model.Preferences
            {
                OrderBookChartDisplayCount = 8,
                OrderBookDisplayCount      = 5
            };

            var symbolViewModel = new SymbolViewModel(Exchange.Test, exchangeService, chartHelper,
                                                      new BinanceOrderBookHelper(),
                                                      new TradeHelper(),
                                                      preferences, new DebugLogger());

            var trx = TestHelper.Trx.GetViewSymbol();

            symbolViewModel.Symbol = trx;

            var orderBook       = new OrderBookUpdateHelper();
            var firstOrderBook  = orderBook.OrderBook_Trx_GetFirstUpdate();
            var secondOrderBook = orderBook.OrderBook_Trx_GetSecondUpdate();

            // AppVeyor Hack!!!
            if (firstOrderBook.LastUpdateId.Equals(secondOrderBook.LastUpdateId))
            {
                secondOrderBook.LastUpdateId++;
            }

            // Act
            symbolViewModel.UpdateOrderBook(firstOrderBook);

            symbolViewModel.UpdateOrderBook(secondOrderBook);

            // Assert
            AssertOrderBookUpdate(symbolViewModel, secondOrderBook, preferences);
        }
示例#24
0
        public async Task SelectedOrderType_IsStopLoss_Not_IsLoading()
        {
            // Arrange
            var cxlToken        = new CancellationToken();
            var exchangeApi     = ExchangeServiceHelper.GetExchangeService();
            var exchangeService = new WpfExchangeService(exchangeApi);
            var tradeViewModel  = new TradeViewModel(exchangeService);

            var symbols = await exchangeService.GetSymbols24HourStatisticsAsync(cxlToken);

            tradeViewModel.SetSymbols(symbols.ToList());
            var trx = tradeViewModel.Symbols.Single(s => s.Name.Equals("TRXBTC"));

            tradeViewModel.SelectedSymbol = trx;

            // Act
            tradeViewModel.SelectedOrderType = "Stop Loss";

            // Assert
            Assert.IsFalse(tradeViewModel.IsPriceEditable);
            Assert.IsTrue(tradeViewModel.IsMarketPrice);
        }
示例#25
0
        public async Task SelectedSymbol_HasAccount()
        {
            // Arrange
            var cxlToken        = new CancellationToken();
            var exchangeApi     = ExchangeServiceHelper.GetExchangeService();
            var exchangeService = new WpfExchangeService(exchangeApi);
            var tradeViewModel  = new TradeViewModel(exchangeService);

            var account = new Account(new Interface.AccountInfo {
                User = new Interface.User()
            })
            {
                ApiKey    = "apikey",
                ApiSecret = "apisecret"
            };

            account = await exchangeService.GetAccountInfoAsync(account.AccountInfo.User.ApiKey, account.AccountInfo.User.ApiSecret, cxlToken);

            var baseBalance = account.Balances.Single(a => a.Asset.Equals("TRX"));
            var quoteAsset  = account.Balances.Single(a => a.Asset.Equals("BTC"));

            tradeViewModel.SetAccount(account);

            var symbols = await exchangeService.GetSymbols24HourStatisticsAsync(cxlToken);

            tradeViewModel.SetSymbols(symbols.ToList());
            var trx = tradeViewModel.Symbols.Single(s => s.Name.Equals("TRXBTC"));

            // Act
            tradeViewModel.SelectedSymbol = trx;

            // Assert
            Assert.AreEqual(tradeViewModel.SelectedSymbol, trx);
            Assert.AreEqual(tradeViewModel.Quantity, 0);
            Assert.AreEqual(tradeViewModel.Price, trx.SymbolStatistics.LastPrice);
            Assert.AreEqual(tradeViewModel.StopPrice, trx.SymbolStatistics.LastPrice);
            Assert.AreEqual(tradeViewModel.BaseAccountBalance, baseBalance);
            Assert.AreEqual(tradeViewModel.QuoteAccountBalance, quoteAsset);
        }
示例#26
0
        public async Task SetSymbol()
        {
            // Arrange
            var cxlToken        = new CancellationToken();
            var exchangeApi     = ExchangeServiceHelper.GetExchangeService();
            var exchangeService = new WpfExchangeService(exchangeApi);
            var symbolViewModel = new SymbolViewModel(exchangeService);

            var trx = TestHelper.Trx.GetViewSymbol();

            // Act
            await symbolViewModel.SetSymbol(trx);

            // Assert
            Assert.AreEqual(symbolViewModel.Symbol, trx);
            Assert.IsNotNull(symbolViewModel.OrderBook);
            Assert.AreEqual(symbolViewModel.OrderBook.LastUpdateId, TestHelper.OrderBook.LastUpdateId);
            Assert.IsNotNull(symbolViewModel.OrderBook.Top);
            Assert.IsTrue(symbolViewModel.OrderBook.TopAsks.Count > 0);
            Assert.IsTrue(symbolViewModel.OrderBook.TopBids.Count > 0);
            Assert.IsTrue(symbolViewModel.AggregateTrades.Count > 0);
        }
示例#27
0
        public void HasQuoteBaseBalance()
        {
            // Arrange
            var exchangeApi     = ExchangeServiceHelper.GetExchangeService();
            var exchangeService = new WpfExchangeService(exchangeApi);
            var tradeViewModel  = new TradeViewModel(exchangeService, new DebugLogger());

            var quoteBalance = new AccountBalance {
                Free = 299m
            };
            var baseBalance = new AccountBalance {
                Free = 0.000123m
            };

            // Act
            tradeViewModel.QuoteAccountBalance = quoteBalance;
            tradeViewModel.BaseAccountBalance  = baseBalance;

            // Assert
            Assert.IsTrue(tradeViewModel.HasBaseBalance);
            Assert.IsTrue(tradeViewModel.HasQuoteBalance);
        }
示例#28
0
        public async Task SelectedSymbol_Null()
        {
            // Arrange
            var cxlToken        = new CancellationToken();
            var exchangeApi     = ExchangeServiceHelper.GetExchangeService();
            var exchangeService = new WpfExchangeService(exchangeApi);
            var tradeViewModel  = new TradeViewModel(exchangeService, new DebugLogger());

            var account = new Account(new Interface.Model.AccountInfo {
                User = new Interface.Model.User()
            })
            {
                ApiKey    = "apikey",
                ApiSecret = "apisecret"
            };

            account = await exchangeService.GetAccountInfoAsync(Exchange.Test, account.AccountInfo.User, cxlToken);

            tradeViewModel.SetAccount(account);

            var symbols = await exchangeService.GetSymbols24HourStatisticsAsync(Exchange.Test, cxlToken);

            tradeViewModel.SetSymbols(symbols.ToList());
            var trx = tradeViewModel.Symbols.Single(s => s.Name.Equals("TRXBTC"));

            tradeViewModel.SelectedSymbol = trx;

            // Act
            tradeViewModel.SelectedSymbol = null;

            // Assert
            Assert.IsNull(tradeViewModel.SelectedSymbol);
            Assert.AreEqual(tradeViewModel.Quantity, 0);
            Assert.AreEqual(tradeViewModel.Price, 0);
            Assert.AreEqual(tradeViewModel.StopPrice, 0);
            Assert.IsNull(tradeViewModel.BaseAccountBalance);
            Assert.IsNull(tradeViewModel.QuoteAccountBalance);
        }
示例#29
0
        public async Task GetRangeOfOrderTypes()
        {
            var cxlToken        = new CancellationToken();
            var exchangeApi     = ExchangeServiceHelper.GetExchangeService();
            var exchangeService = new WpfExchangeService(exchangeApi);

            var symbols = await exchangeService.GetSymbols24HourStatisticsAsync(Exchange.Test, cxlToken);

            var orderTypes = new List <Core.Model.OrderType>();

            foreach (var symbol in symbols)
            {
                foreach (var orderType in symbol.OrderTypes)
                {
                    if (!orderTypes.Contains(orderType))
                    {
                        orderTypes.Add(orderType);
                    }
                }
            }

            Assert.AreEqual(orderTypes.Count, 5);
        }
示例#30
0
        public void HasQuoteBaseBalance_Zero()
        {
            // Arrange
            var cxlToken        = new CancellationToken();
            var exchangeApi     = ExchangeServiceHelper.GetExchangeService();
            var exchangeService = new WpfExchangeService(exchangeApi);
            var tradeViewModel  = new TradeViewModel(exchangeService);

            var quoteBalance = new AccountBalance {
                Free = 0m
            };
            var baseBalance = new AccountBalance {
                Free = 0m
            };

            // Act
            tradeViewModel.QuoteAccountBalance = quoteBalance;
            tradeViewModel.BaseAccountBalance  = baseBalance;

            // Assert
            Assert.IsFalse(tradeViewModel.HasBaseBalance);
            Assert.IsFalse(tradeViewModel.HasQuoteBalance);
        }