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); } }
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())); }
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); }