示例#1
0
        public async Task SellOrder_Should_BeValid()
        {
            CryptoApiMock.MockSellingTrade(new CryptoOrder
            {
                Market       = Market,
                PricePerUnit = 110,
                Price        = 1100,
                OrderType    = CryptoOrderType.LimitSell,
                Quantity     = 10M,
                Limit        = 110
            });

            Strategy.SetupGet(strategy => strategy.Settings).Returns(new TraderSettings {
                TradingBudget = 1000
            });
            InitializeTrader(new TradeAction {
                TradeAdvice = TradeAdvice.Sell, OrderPricePerUnit = 110
            });
            CoinTrader.TraderState.Trades[0].BuyOrder.Quantity = 10;
            await CoinTrader.UpdatePrice(new Ticker());

            CryptoApiMock.Verify(c => c.SellCoinAsync(It.Is <CryptoOrder>(s => s.PricePerUnit == 110 &&
                                                                          s.Price == 1100 &&
                                                                          s.Market == Market &&
                                                                          s.OrderType == CryptoOrderType.LimitSell &&
                                                                          s.Quantity == 10M &&
                                                                          s.Limit == 110)), Times.Once);
        }
示例#2
0
        public async Task BuyOrder_Should_BeValid()
        {
            CryptoApiMock.MockBuyingTrade(new CryptoOrder
            {
                Market       = Market,
                PricePerUnit = 100,
                Price        = 1000,
                IsClosed     = false,
                OrderType    = CryptoOrderType.LimitBuy,
                Quantity     = 9.975M,
                Limit        = 100
            });
            Strategy.SetupGet(strategy => strategy.Settings).Returns(new TraderSettings {
                TradingBudget = 1000
            });
            InitializeTrader(new TradeAction {
                TradeAdvice = TradeAdvice.Buy, OrderPricePerUnit = 100
            });

            await CoinTrader.UpdatePrice(new Ticker());

            CryptoApiMock.Verify(c => c.BuyCoinAsync(It.Is <CryptoOrder>(b => b.PricePerUnit == 100 &&
                                                                         b.Price == 1000 &&
                                                                         b.Market == Market &&
                                                                         !b.IsClosed &&
                                                                         b.OrderType == CryptoOrderType.LimitBuy &&
                                                                         b.Quantity == 9.975M &&
                                                                         b.Limit == 100)), Times.Once);
        }
示例#3
0
        protected CoinTraderTestBase()
        {
            Market = "BTC-ETC";
            var pushManagerMock = new Mock <IPushManager>();

            CoinTrader = new CoinTrader(CryptoApiMock.Object, OrleansClientMock.Object, HubNotifierMock.Object, pushManagerMock.Object)
            {
                Strategy = Strategy.Object
            };
            var tickerSubject = new Subject <Ticker>();
            var orderSubject  = new Subject <CryptoOrder>();

            CryptoApiMock.SetupGet(c => c.TickerUpdated).Returns(tickerSubject);
            CryptoApiMock.SetupGet(c => c.OrderUpdated).Returns(orderSubject);
            TraderGrainMock.Setup(t => t.IsInitialized()).ReturnsAsync(true);
            HubNotifierMock.Setup(h => h.UpdateTrader(It.IsAny <TraderState>())).Returns(Task.CompletedTask);
            HubNotifierMock.Setup(h => h.UpdateTicker(It.IsAny <Ticker>())).Returns(Task.CompletedTask);
            TraderGrainMock.Setup(t => t.UpdateTrades(It.IsAny <List <Trade> >())).Returns(Task.CompletedTask);
            pushManagerMock.Setup(p => p.TriggerPush(It.IsAny <PushMessage>())).Returns(Task.CompletedTask);
            TraderGrainMock.Setup(c => c.GetTraderData()).ReturnsAsync(new TraderState {
                Trades = new List <Trade>()
            });
            OrleansClientMock.Setup(c => c.GetGrain <ITraderGrain>(It.IsAny <string>(), It.IsAny <string>()))
            .Returns(TraderGrainMock.Object);
        }
示例#4
0
        public async Task SellAdvice_Should_CreateSellOrder()
        {
            await InitializeTrader(new TradeAction { TradeAdvice = TradeAdvice.Sell, OrderPricePerUnit = 120 });

            await CoinTrader.UpdatePrice(_newPriceTicker);

            CryptoApiMock.Verify(c => c.SellCoinAsync(It.Is <CryptoOrder>(b => b.PricePerUnit == 120)), Times.Once);
        }
示例#5
0
        public async Task EachTrader_ShouldHave_ABudget()
        {
            await TriggerBuy(1, 100, 1000);

            CoinTrader.Strategy.Settings.TradingBudget.Should().Be(1000);
            CoinTrader.TraderState.Budget.Available.Should().Be(900);
            CoinTrader.TraderState.Budget.Invested.Should().Be(1000);
            CryptoApiMock.Verify(c => c.BuyCoinAsync(It.Is <CryptoOrder>(o => o.Price == 1000)), Times.Once);
        }
示例#6
0
        public async Task BuyAdvice_Should_CreateBuyOrder()
        {
            CryptoApiMock.MockBuyingTrade(new CryptoOrder());
            await InitializeTrader(new TradeAction { TradeAdvice = TradeAdvice.Buy, OrderPricePerUnit = 98 });

            await CoinTrader.UpdatePrice(_newPriceTicker);

            CryptoApiMock.Verify(c => c.BuyCoinAsync(It.Is <CryptoOrder>(b => b.PricePerUnit == 98)), Times.Once);
        }
示例#7
0
        public async Task BuyingOrder_Should_UpdateTraderStatus()
        {
            CryptoApiMock.MockBuyingTrade(new CryptoOrder());
            await InitializeTrader(new TradeAction { TradeAdvice = TradeAdvice.Buy, OrderPricePerUnit = 98 });

            await CoinTrader.UpdatePrice(_newPriceTicker);

            CoinTrader.Trades[0].Status.Should().Be(TradeStatus.Buying);
        }
示例#8
0
        public async Task CancellingBuyOrder_Should_RemoveTrade()
        {
            CryptoApiMock.MockCancelTrade(new CryptoOrder());
            await InitializeTrader(new TradeAction { TradeAdvice = TradeAdvice.Cancel });

            await CoinTrader.UpdatePrice(_newPriceTicker);

            CoinTrader.Trades.Count.Should().Be(0);
        }
示例#9
0
        public async Task CancelAdvice_Should_CancelBuyOrder()
        {
            CryptoApiMock.MockCancelTrade(new CryptoOrder());
            await InitializeTrader(new TradeAction { TradeAdvice = TradeAdvice.Cancel });

            CoinTrader.Trades[0].BuyOrder.Uuid = "test";
            await CoinTrader.UpdatePrice(_newPriceTicker);

            CryptoApiMock.Verify(c => c.CancelOrder(It.Is <string>(s => s == "test")), Times.Once);
        }
示例#10
0
        public async Task EmptyTradesList_Should_AddNewTrade()
        {
            CryptoApiMock.MockBuyingTrade(new CryptoOrder());
            await InitializeTrader(new TradeAction { TradeAdvice = TradeAdvice.Buy, OrderPricePerUnit = 98 });

            CoinTrader.Trades = new List <Trade>();

            await CoinTrader.UpdatePrice(_newPriceTicker);

            CoinTrader.Trades.Count.Should().Be(1);
        }
示例#11
0
        public async Task UpdatePrice_Should_UpdateAllTrades()
        {
            await InitializeTrader(new TradeAction { TradeAdvice = TradeAdvice.Cancel });

            CryptoApiMock.MockCancelTrade(new CryptoOrder());
            CoinTrader.Trades.Add(new Trade());

            await CoinTrader.UpdatePrice(_newPriceTicker);

            Strategy.Verify(s => s.CalculateTradeAction(It.IsAny <Ticker>(), It.IsAny <Trade>()), Times.Exactly(2));
        }
示例#12
0
 protected async Task InitializeTrader(TradeAction tradeAction)
 {
     CryptoApiMock.MockSellingTrade(new CryptoOrder());
     Strategy.SetupGet(strategy => strategy.Settings).Returns(new TraderSettings {
         TradingBudget = 1000
     });
     Strategy.SetTradeAction(tradeAction);
     CoinTrader.Initialize(Market);
     CoinTrader.Strategy = Strategy.Object;
     await CoinTrader.StartAsync();
 }
示例#13
0
        public async Task ClosedOrder_Should_UpdateTradeStatus()
        {
            CryptoApiMock.MockBuyingTrade(new CryptoOrder());
            InitializeTrader(new TradeAction {
                TradeAdvice = TradeAdvice.Buy, OrderPricePerUnit = 98
            });
            await CoinTrader.UpdatePrice(_newPriceTicker);

            await CoinTrader.UpdateOrder(new CryptoOrder { IsClosed = false, OrderType = CryptoOrderType.LimitBuy });

            CoinTrader.TraderState.Trades[0].Status.Should().NotBe(TradeStatus.Bought);
        }
示例#14
0
        private async Task TriggerBuy(decimal pricePerUnit, decimal price, decimal budget)
        {
            var cryptoOrder = new CryptoOrder {
                PricePerUnit = pricePerUnit, Price = price
            };

            CryptoApiMock.MockBuyingTrade(cryptoOrder);
            CryptoApiMock.MockCancelTrade(cryptoOrder);
            await InitializeTrader(new TradeAction { TradeAdvice = TradeAdvice.Buy, OrderPricePerUnit = pricePerUnit });

            Strategy.SetupGet(strategy => strategy.Settings).Returns(new TraderSettings {
                TradingBudget = budget
            });
            await CoinTrader.UpdatePrice(new Ticker());
        }
示例#15
0
        public async Task PriceUpdate_Should_UpdateTraderProfit()
        {
            CryptoApiMock.MockBuyingTrade(new CryptoOrder());
            var trade = new Trade();

            trade.BuyOrder.PricePerUnit     = 100;
            CryptoBroker.TraderState.Trades = new List <Trade> {
                trade
            };
            trade.Status          = TradeStatus.Bought;
            CryptoBroker.Strategy = new HoldUntilPriceDropsStrategy();
            await CryptoBroker.UpdatePrice(_newPriceTicker);

            CryptoBroker.TraderState.Trades[0].Profit.Should().Be(19.4M);
        }
示例#16
0
        public async Task OnlyCompletedTrades_Should_AddNewTrade()
        {
            CryptoApiMock.MockBuyingTrade(new CryptoOrder());
            InitializeTrader(new TradeAction {
                TradeAdvice = TradeAdvice.Buy, OrderPricePerUnit = 98
            });
            CoinTrader.TraderState.Trades = new List <Trade> {
                new Trade {
                    Status = TradeStatus.Completed
                }
            };

            await CoinTrader.UpdatePrice(_newPriceTicker);

            CoinTrader.TraderState.Trades.Count.Should().Be(2);
        }
示例#17
0
        public async Task SellingCoin_Should_UpdateOrderForTrade()
        {
            await InitializeTrader(new TradeAction { TradeAdvice = TradeAdvice.Sell, OrderPricePerUnit = 98 });

            var sellOrder = new CryptoOrder {
                OrderType = CryptoOrderType.LimitSell, Price = 1100, Uuid = "S"
            };

            CryptoApiMock.MockSellingTrade(sellOrder);
            CoinTrader.Trades[0].SellOrder.Uuid = "S";

            await CoinTrader.UpdatePrice(_newPriceTicker);

            CoinTrader.Trades[0].SellOrder.Uuid.Should().Be("S");
            CoinTrader.Trades[0].SellOrder.Price.Should().Be(1100);
        }
示例#18
0
 protected void InitializeTrader(TradeAction tradeAction)
 {
     CryptoApiMock.MockSellingTrade(new CryptoOrder());
     Strategy.SetupGet(strategy => strategy.Settings).Returns(new TraderSettings {
         TradingBudget = 1000
     });
     Strategy.SetTradeAction(tradeAction);
     CoinTrader.Initialize(new TraderState
     {
         Trades   = new List <Trade>(),
         Market   = Market,
         Settings = new TraderSettings {
             TradingBudget = 1000
         }
     });
     CoinTrader.Strategy = Strategy.Object;
 }
示例#19
0
        public async Task UpdatePrice_ShouldNot_RunConcurrently()
        {
            var subject = new Subject <Ticker>();

            CryptoApiMock.MockBuyingTrade(new CryptoOrder());
            CryptoApiMock.SetupGet(c => c.TickerUpdated).Returns(subject);
            await InitializeTrader(new TradeAction { TradeAdvice = TradeAdvice.Buy, OrderPricePerUnit = 1 });

            for (int i = 0; i < 100; i++)
            {
                subject.OnNext(new Ticker {
                    Market = Market
                });
            }

            Strategy.Verify(s => s.CalculateTradeAction(It.IsAny <Ticker>(), It.IsAny <Trade>()), Times.Exactly(100));
        }
示例#20
0
        protected void Reset()
        {
            Market = "BTC-ETC";
            var pushManagerMock = new Mock <IPushManager>();

            Strategy.SetupGet(strategy => strategy.Settings).Returns(new TraderSettings {
                TradingBudget = 1000
            });
            CoinTrader = new CoinTrader(CryptoApiMock.Object)
            {
                Strategy     = Strategy.Object,
                IsInTestMode = true
            };
            var tickerSubject = new Subject <Ticker>();
            var orderSubject  = new Subject <CryptoOrder>();

            CryptoApiMock.SetupGet(c => c.TickerUpdated).Returns(tickerSubject);
            CryptoApiMock.SetupGet(c => c.OrderUpdated).Returns(orderSubject);
            TraderGrainMock.Setup(t => t.IsInitialized()).ReturnsAsync(true);
            HubNotifierMock.Setup(h => h.UpdateTrader(It.IsAny <TraderState>())).Returns(Task.CompletedTask);
            HubNotifierMock.Setup(h => h.UpdateTicker(It.IsAny <Ticker>())).Returns(Task.CompletedTask);
            TraderGrainMock.Setup(t => t.UpdateTrades(It.IsAny <List <Trade> >())).Returns(Task.CompletedTask);
            pushManagerMock.Setup(p => p.TriggerPush(It.IsAny <PushMessage>())).Returns(Task.CompletedTask);
            var traderState = new TraderState
            {
                Trades   = new List <Trade>(),
                Budget   = new Budget(),
                Settings = new TraderSettings {
                    TradingBudget = 1000
                }
            };

            CoinTrader.TraderState = traderState;
            TraderGrainMock.Setup(c => c.GetTraderData()).ReturnsAsync(traderState);
            OrleansClientMock.Setup(c => c.GetGrain <ITraderGrain>(It.IsAny <string>(), It.IsAny <string>()))
            .Returns(TraderGrainMock.Object);
        }
示例#21
0
 private void CheckBuyOrderInvocation(decimal quantity, decimal pricePerUnit, decimal price)
 {
     CryptoApiMock.Verify(c => c.BuyCoinAsync(It.Is <CryptoOrder>(o => o.Price == price &&
                                                                  o.PricePerUnit == pricePerUnit &&
                                                                  o.Quantity == quantity)), Times.Once);
 }