예제 #1
0
        public void UpdateBuyOrders(Ticker ticker)
        {
            List <CryptoOrder> removedOrders = new List <CryptoOrder>();

            foreach (var buyOrder in _pendingBuyOrders)
            {
                if (ticker.Ask <= buyOrder.PricePerUnit)
                {
                    //Console.WriteLine($"Closed buy order {buyOrder.Uuid}");
                    buyOrder.Closed   = ticker.Timestamp;
                    buyOrder.IsClosed = true;
                    buyOrder.IsClosed = true;
                    OrderUpdated.OnNext(buyOrder);
                    removedOrders.Add(buyOrder);
                }
                if (buyOrder.Canceled)
                {
                    removedOrders.Add(buyOrder);
                }
            }

            foreach (var removedOrder in removedOrders)
            {
                _pendingBuyOrders.Remove(removedOrder);
            }
        }
예제 #2
0
        partial void OnHandle(OrderUpdated @event)
        {
            Entities.OrderEntity entity = OrderRepository.Load(@event.Rsn);
            entity = AutomapHelper.Automap(@event, entity);

            OrderRepository.Update(entity);
        }
 private void OnOrderUpdated(List <LaborDetail.ListItem> orders)
 {
     if (OrderUpdated != null)
     {
         OrderUpdated.Invoke(this, new OrderEventArgs(orders));
     }
 }
예제 #4
0
        private void UpdateOrder(Order order)
        {
            order.Status = OrderStatus.Updated;

            Console.WriteLine($"order updated in book: {order}");

            OrderUpdated?.Invoke(this, new OrderUpdateEventArgs(order));
        }
예제 #5
0
        public when_order_update_is_received()
        {
            var makeReservationCommand = sut.Commands.Select(e => e.Body).OfType <MakeSeatReservation>().Single();

            reservationId = makeReservationCommand.ReservationId;

            orderUpdated = new OrderUpdated {
                SourceId = orderId,
                Seats    = new[] { new SeatQuantity(Guid.NewGuid(), 3) }
            };
            sut.Handle(orderUpdated);
        }
        public void Handle(OrderUpdated @event)
        {
            var dto = GetDraftOrder(@event.SourceId);

            if (WasNotAlreadyHandled(dto, @event.Version))
            {
                var newItems = @event.Seats.Select(seat => new DraftOrderItem(seat.SeatType, seat.Quantity));
                dto.Lines        = newItems.ToList();
                dto.State        = DraftOrder.States.PendingReservation;
                dto.OrderVersion = @event.Version;

                draftOrderRepository.Update(dto);
            }
        }
예제 #7
0
        public async Task <Unit> UpdateOrder(CryptoOrder cryptoOrder)
        {
            try
            {
                Log($"Closed order {cryptoOrder.Uuid} as {cryptoOrder.OrderType} at {cryptoOrder.Limit}");
                switch (cryptoOrder.OrderType)
                {
                case CryptoOrderType.LimitSell:
                    TraderState.Budget.Available += cryptoOrder.Price;
                    var tradeForSellOrder = TraderState.Trades.FirstOrDefault(t => t.SellOrder.Uuid == cryptoOrder.Uuid);
                    if (tradeForSellOrder != null)
                    {
                        if (cryptoOrder.Canceled)
                        {
                            tradeForSellOrder.Status             = TradeStatus.Bought;
                            tradeForSellOrder.SellOrder.IsOpened = false;
                            return(await Task.FromResult(Unit.Default));
                        }
                        var tradeProfit = tradeForSellOrder.BuyOrder.Price.GetReadablePercentageChange(tradeForSellOrder.SellOrder.Price);
                        TraderState.Budget.Profit += tradeProfit;
                        TraderState.Budget.Earned += tradeForSellOrder.SellOrder.Price - tradeForSellOrder.BuyOrder.Price;
                        Log($"{cryptoOrder.Uuid}: SELL - {tradeProfit}");
                        tradeForSellOrder.Profit    = tradeProfit;
                        tradeForSellOrder.Status    = TradeStatus.Completed;
                        tradeForSellOrder.SellOrder = cryptoOrder;
                    }
                    break;

                case CryptoOrderType.LimitBuy:
                    var tradeForBuyOrder = TraderState.Trades.FirstOrDefault(t => t.BuyOrder.Uuid == cryptoOrder.Uuid);
                    if (tradeForBuyOrder != null)
                    {
                        if (cryptoOrder.Canceled)
                        {
                            TraderState.Trades.Remove(tradeForBuyOrder);
                            return(await Task.FromResult(Unit.Default));
                        }
                        tradeForBuyOrder.Status   = TradeStatus.Bought;
                        tradeForBuyOrder.BuyOrder = cryptoOrder;
                    }
                    break;
                }
            }
            finally
            {
                OrderUpdated.OnNext(cryptoOrder);
            }
            return(await Task.FromResult(Unit.Default));
        }
        public void Handle(OrderUpdated @event)
        {
            var pInfo = repository.GetBy(x => x.OrderId == @event.SourceId).FirstOrDefault();

            if (pInfo != null)
            {
                var manager = new RegistrationProcessManager(pInfo);
                manager.Handle(@event);
                context.RegisterModified(manager.ProcessInfo);
                context.Commit();
            }
            else
            {
                Trace.TraceError("Failed to locate the registration process manager handling the order with id {0}.", @event.SourceId);
            }
        }
        public void Handle(OrderUpdated @event)
        {
            using (var context = contextFactory.Invoke()) {
                var pm = context.Find(x => x.OrderId == @event.SourceId);
                if (pm != null)
                {
                    pm.Handle(@event);

                    context.Save(pm);
                }
                else
                {
                    Trace.TraceError("Failed to locate the registration process manager handling the order with id {0}.", @event.SourceId);
                }
            }
        }
예제 #10
0
        public void Handle(OrderUpdated @event)
        {
            using (var context = this._contextFactory.Invoke()) {
                var dto = context.Set <DraftOrder>().Include(o => o.Lines).First(o => o.OrderId == @event.SourceId);
                if (WasNotAlreadyHandled(dto, @event.Version))
                {
                    var linesSet = context.Set <DraftOrderItem>();
                    foreach (var line in dto.Lines.ToArray())
                    {
                        linesSet.Remove(line);
                    }

                    dto.Lines.AddRange(@event.Seats.Select(seat => new DraftOrderItem(seat.SeatType, seat.Quantity)));

                    dto.State        = DraftOrder.States.PendingReservation;
                    dto.OrderVersion = @event.Version;

                    context.Save(dto);
                }
            }
        }
예제 #11
0
        public void Handle(OrderUpdated message)
        {
            if (this.State == ProcessState.AwaitingReservationConfirmation ||
                this.State == ProcessState.ReservationConfirmationReceived)
            {
                this.State = ProcessState.AwaitingReservationConfirmation;

                var seatReservationCommand = new MakeSeatReservation {
                    ConferenceId  = this.ConferenceId,
                    ReservationId = this.ReservationId,
                    Seats         = message.Seats.ToList()
                };

                this.SeatReservationCommandId = seatReservationCommand.Id;
                this.AddCommand(seatReservationCommand);
            }
            else
            {
                throw new InvalidOperationException("The order cannot be updated at this stage.");
            }
        }
        public void Setup()
        {
            this._sut          = new RegistrationProcessManager();
            this._orderId      = Guid.NewGuid();
            this._conferenceId = Guid.NewGuid();

            this._sut.Handle(new OrderPlaced()
            {
                SourceId     = this._orderId,
                ConferenceId = this._conferenceId,
                Seats        = new[] { new SeatQuantity(Guid.NewGuid(), 2) },
                ReservationAutoExpiration = DateTime.UtcNow.Add(TimeSpan.FromMinutes(22))
            });

            this._orderUpdated = new OrderUpdated()
            {
                SourceId = Guid.NewGuid(),
                Seats    = new[] { new SeatQuantity(Guid.NewGuid(), 3) }
            };

            _sut.Handle(this._orderUpdated);
        }
예제 #13
0
        public void Handle(OrderUpdated message)
        {
            if (this.State == ProcessState.AwaitingReservationConfirmation ||
                this.State == ProcessState.ReservationConfirmationReceived)
            {
                this.State = ProcessState.AwaitingReservationConfirmation;

                var anchorReservationCommand =
                    new MakeAnchorReservation
                {
                    WorkshopID    = this.WorkshopID,
                    ReservationId = this.ReservationID,
                    Anchors       = message.Anchors.ToList()
                };
                this.AnchorReservationCommandID = anchorReservationCommand.Id;
                this.AddCommand(anchorReservationCommand);
            }
            else
            {
                throw new InvalidOperationException("The order cannot be updated at this stage.");
            }
        }
        public void Handle(OrderUpdated @event)
        {
            using (var context = factory.Create())
            {
                var dto = DbContext.Set <DraftOrder>().Include(o => o.Lines).First(o => o.OrderID == @event.SourceId);
                if (WasNotAlreadyHandled(dto, @event.Version))
                {
                    var linesSet = DbContext.Set <DraftOrderItem>();
                    foreach (var line in dto.Lines.ToArray())
                    {
                        linesSet.Remove(line);
                    }

                    dto.Lines.AddRange(@event.Anchors.Select(anchor => new DraftOrderItem(anchor.AnchorType, anchor.Quantity)));

                    dto.State        = DraftOrder.States.PendingReservation;
                    dto.OrderVersion = @event.Version;
                    //DbContext.Save(dto);
                    context.SaveChanges();
                }
            }
        }
예제 #15
0
        public void UpdateSellOrders(Ticker ticker)
        {
            List <CryptoOrder> removedOrders = new List <CryptoOrder>();

            foreach (var sellOrder in _pendingSellOrders.Where(s => s.IsClosed == false))
            {
                if (ticker.Bid >= sellOrder.PricePerUnit || sellOrder.OrderType == CryptoOrderType.ImmediateSell)
                {
                    sellOrder.IsClosed  = true;
                    sellOrder.IsClosed  = true;
                    sellOrder.Closed    = ticker.Timestamp;
                    sellOrder.OrderType = CryptoOrderType.LimitSell;
                    removedOrders.Add(sellOrder);
                    OrderUpdated.OnNext(sellOrder);
                }
            }

            foreach (var removedOrder in removedOrders)
            {
                _pendingSellOrders.Remove(removedOrder);
            }
        }
예제 #16
0
 public void When(OrderUpdated orderUpdated)
 {
 }
예제 #17
0
        public async Task <Unit> UpdateOrder(CryptoOrder cryptoOrder)
        {
            try
            {
                if (cryptoOrder.IsClosed == false)
                {
                    return(await Task.FromResult(Unit.Default));
                }
                switch (cryptoOrder.OrderType)
                {
                case CryptoOrderType.LimitSell:
                    TraderState.Budget.Available += cryptoOrder.Price;
                    var tradeForSellOrder = TraderState.Trades.FirstOrDefault(t => t.SellOrder.Uuid == cryptoOrder.Uuid);
                    if (tradeForSellOrder != null)
                    {
                        if (cryptoOrder.Canceled)
                        {
                            tradeForSellOrder.Status             = TradeStatus.Bought;
                            tradeForSellOrder.SellOrder.IsClosed = true;
                            return(await Task.FromResult(Unit.Default));
                        }
                        tradeForSellOrder.SellOrder = cryptoOrder;
                        var tradeProfit = tradeForSellOrder.BuyOrder.Price.GetReadablePercentageChange(tradeForSellOrder.SellOrder.Price);

                        Console.WriteLine($"Sold {tradeForSellOrder.BuyOrder.Uuid} with profit {tradeProfit} \t\t" +
                                          $" {tradeForSellOrder.BuyReason}: {tradeForSellOrder.BuyOrder.PricePerUnit} " +
                                          $"\t\t {tradeForSellOrder.SellReason}: {tradeForSellOrder.SellOrder.PricePerUnit}");


                        TraderState.Budget.Profit += tradeProfit;
                        TraderState.Budget.Earned += tradeForSellOrder.SellOrder.Price - tradeForSellOrder.BuyOrder.Price;
                        tradeForSellOrder.Profit   = tradeProfit;
                        tradeForSellOrder.Status   = TradeStatus.Completed;
                        var tradeWithTriggeredBuy =
                            TraderState.Trades.FirstOrDefault(t =>
                                                              t.TriggeredBuy && t.Status != TradeStatus.Completed);
                        if (tradeWithTriggeredBuy != null &&
                            TraderState.Trades.Count(t => t.TriggeredBuy && t.Status != TradeStatus.Completed) == 0)
                        {
                            //Console.WriteLine($"Set triggered buy to false for {tradeWithTriggeredBuy.BuyOrder.Uuid}");
                            tradeWithTriggeredBuy.TriggeredBuy = false;
                        }
                    }
                    break;

                case CryptoOrderType.LimitBuy:
                    var tradeForBuyOrder = TraderState.Trades.FirstOrDefault(t => t.BuyOrder.Uuid == cryptoOrder.Uuid);
                    if (tradeForBuyOrder != null)
                    {
                        if (cryptoOrder.Canceled)
                        {
                            TraderState.Trades.Remove(tradeForBuyOrder);
                            return(await Task.FromResult(Unit.Default));
                        }
                        tradeForBuyOrder.Status   = TradeStatus.Bought;
                        tradeForBuyOrder.BuyOrder = cryptoOrder;
                    }
                    break;
                }
            }
            finally
            {
                OrderUpdated.OnNext(cryptoOrder);
            }
            return(await Task.FromResult(Unit.Default));
        }
예제 #18
0
 private void OnOrderUpdated(OrderUpdated e)
 {
     this.seats = e.Seats.ToList();
 }
예제 #19
0
 private void OnOrderUpdated(OrderUpdated e)
 {
     this.anchors = e.Anchors.ToList();
 }
예제 #20
0
 protected void OnOrderUpdated(Order order)
 {
     OrderUpdated?.Invoke(this, new OrderBookEventArgs(order));
 }
예제 #21
0
 protected void OnOrderUpdate(BittrexStreamOrderData bittrexOrder)
 {
     OrderUpdated.OnNext(bittrexOrder.ToCryptoOrder());
 }