Esempio n. 1
0
        public AddTickerResponse AddTicker(String ticker)
        {
            // TODO: AddTicker preconditions & tests
            lock (managers) {
                using OrderContext context = orderContextFactory.Create();
                OrderManager manager = new OrderManager(context, ticker);
                managers.Add(ticker, manager);

                AddTickerResponse response = new AddTickerResponse {
                    BuyOrderCount  = manager.Count.Item1,
                    SellOrderCount = manager.Count.Item2
                };

                return(response);
            }
        }
Esempio n. 2
0
        public override Task <Empty> InitializeService(Empty request, ServerCallContext context)
        {
            Logger.Here().Information("BGN");
            tickers.ForEach(ticker => {
                Logger.Here().Information("Adding ticker: " + ticker);
                try {
                    AddTickerResponse response = service.AddTicker(ticker);
                    Logger.Here().Information(String.Format("Added {0} BUY and {1} SELL open orders for {2}",
                                                            response.BuyOrderCount, response.SellOrderCount, ticker));
                } catch (Exception e) {
                    Logger.Here().Warning("Error adding ticker " + ticker + " E: " + e.Message);
                    throw new RpcException(new Status(StatusCode.Internal, e.Message));
                }
            });

            Logger.Here().Information("END");
            return(Task.FromResult(new Empty()));
        }
Esempio n. 3
0
        private void ExecuteSimulation(string[] args)
        {
            String msg         = "";
            int    minOrders   = 1000;
            int    numTrades   = 0;
            bool   limitOrders = true;
            int    numThreads  = 10;

            Console.WriteLine("\nHello! I am a simulator for DemoExchange\n");
            Console.WriteLine("How many orders to seed?: ");
            logger.Information("Orders to seed: " + minOrders);
            Console.WriteLine("How many trades to execute?: ");
            logger.Information("Trades to execute: " + numTrades);
            Console.WriteLine("Include limit orders?: ");
            logger.Information("Limit orders: " + limitOrders);
            Console.WriteLine("How many concurrent threads?: ");
            logger.Information("Concurrent threads: " + numThreads);
            Console.WriteLine("");

            List <String> tickers = new List <String> {
                "ERX", "SPY", "DIA", "QQQ", "UPRO", "SPXU", "OILU", "OILD"
            };

            logger.Information("Tickers: " + String.Join(", ", tickers));
            if (minOrders > 0)
            {
                msg = "\n\n********** SEEDING ORDER BOOK **********\n";
                Console.WriteLine(msg);
                logger.Information(msg);
                ParallelOptions opt = new ParallelOptions()
                {
                    MaxDegreeOfParallelism = tickers.Count
                };
                Parallel.For(0, tickers.Count, opt, i => {
                    String ticker  = tickers[i];
                    long seedStart = Now;
                    int basePrice  = rnd.Next(8, 19);
                    List <IOrderModel> buyOrders = GenerateInitialOrders(minOrders, ticker,
                                                                         basePrice, true);
                    List <IOrderModel> sellOrders = GenerateInitialOrders(minOrders, ticker,
                                                                          basePrice, false);
                    service.TestPerfAddOrder(ticker, buyOrders, sellOrders);
                    msg = String.Format("{3}: Added {1} buy orders and {2} sell orders in {0} milliseconds", Stop(seedStart), buyOrders.Count, sellOrders.Count, ticker);
                    Console.WriteLine(msg);
                    logger.Information(msg);
                });
            }

            if (numTrades > 0)
            {
                msg = "\n\n********** LOADING ORDERS **********\n";
                Console.WriteLine(msg);
                logger.Information(msg);
                long            loadStart = Now;
                ParallelOptions loadOpt   = new ParallelOptions()
                {
                    MaxDegreeOfParallelism = tickers.Count
                };
                bool addTicker = minOrders == 0;
                Parallel.For(0, tickers.Count, loadOpt, i => {
                    String ticker = tickers[i];
                    Tuple <int, int> result;
                    long loadStart = Now;
                    if (addTicker)
                    {
                        AddTickerResponse response = service.AddTicker(ticker);
                        result = new Tuple <int, int>(response.BuyOrderCount, response.SellOrderCount);
                    }
                    else
                    {
                        result = service.TestPerfLoadOrderBook(ticker);
                    }
                    msg = String.Format("Loaded {1} BUY and {2} {3} orders in {0} milliseconds",
                                        Stop(loadStart), result.Item1, result.Item2, ticker);
                    Console.WriteLine(msg);
                    logger.Information(msg);
                });

                msg = "\n\n********** BEGIN TRADING **********\n";
                Console.WriteLine(msg);
                logger.Information(msg);
                long            tradeStart = Now;
                ParallelOptions opt        = new ParallelOptions()
                {
                    MaxDegreeOfParallelism = numThreads
                };
                Parallel.For(0, numTrades, opt, i => {
                    int orderType   = (rnd.Next(1, limitOrders ? 5 : 3));
                    String ticker   = tickers[rnd.Next(1, tickers.Count + 1) - 1];
                    Quote quote     = (Quote)service.GetQuote(ticker);
                    int sign        = rnd.Next(1, 3) == 1 ? 1 : -1;
                    long orderStart = Now;
                    IResponse <IOrderModel, OrderResponse> response;
                    if (orderType == 1)
                    {
                        response = service.SubmitOrder(NewBuyMarketOrder(GetAccountId(), ticker, RandomQuantity));
                    }
                    else if (orderType == 2)
                    {
                        response = service.SubmitOrder(NewSellMarketOrder(GetAccountId(), ticker, RandomQuantity));
                    }
                    else if (orderType == 3)
                    {
                        decimal price = Convert.ToDecimal(quote.Ask) + (sign * (rnd.Next(1, 10000) / 10000000M));
                        response      = service.SubmitOrder(NewBuyLimitDayOrder(GetAccountId(),
                                                                                ticker, RandomQuantity, price));
                    }
                    else
                    {
                        decimal price = Convert.ToDecimal(quote.Bid) + (sign * (rnd.Next(1, 10000) / 10000000M));
                        response      = service.SubmitOrder(NewSellLimitDayOrder(GetAccountId(),
                                                                                 ticker, RandomQuantity, price));
                    }
                    if (response.HasErrors)
                    {
                        throw new Exception(response.Errors[0].Description);
                    }
                    msg = String.Format("Executed order in {0} milliseconds\n", Stop(orderStart));
                    Console.WriteLine(msg);
                    logger.Information(msg);
                });
                msg = String.Format("Executed {1} trades with {2} threads in {0} milliseconds",
                                    Stop(tradeStart), numTrades, numThreads);
                Console.WriteLine(msg);
                logger.Information(msg);
            }
            msg = "\n\n********** END TRADING **********\n";
            Console.WriteLine(msg);
            logger.Information(msg);
        }