public string AddUser(string UserName, string Balance, string jsonInput) { User user = null; string message = string.Empty; enumStatus status = enumStatus.Unknown; double balance = 0.0; try { if (!double.TryParse(Balance, out balance)) { message = string.Format("Error: Invalid Balance: {0}", Balance); } if (!string.IsNullOrEmpty(jsonInput)) { user = new User(jsonInput); } else { user = new User(UserName, balance); } if (MatchMeDB.Instance.UserTable.ContainsKey(user.UserName) || MatchMeDB.Instance.Users.ContainsKey(user.Id)) { string existingUser = MatchMeDB.Instance.UserTable[user.UserName].ToString(); message = string.Format("Error: duplicate user. Existing User: {0} New User (rejected): {1}", existingUser, user.ToString()); } if (string.IsNullOrEmpty(message)) { status = MatchMeDB.Instance.AddUser(user); if (status.Equals(enumStatus.UserAdded)) { message = string.Format("User Added: {0}", user.ToString()); } } } catch (Exception ex) { ServerLog.LogException(ex, string.Format("Add User: {0}", user.ToString())); message = ex.Message; status = enumStatus.UserAddFailed; } var result = new Dictionary <string, string> { { "status", status.ToString() }, { "message", message } }; return(JsonConvert.SerializeObject(result)); }
public string PlaceAnOrder(string UserName, string UserId, string Symbol, string Volume, string Price, string OrderType, string OrderSide) { User user = null; string message = string.Empty; string userId = MatchMeDB.Instance.UserTable[Config.AdminUser].Id; enumStatus status = enumStatus.Unknown; enumSide orderside = enumSide.Invalid; enumOrderType ordertype = enumOrderType.Invalid; double price = 0.0; int volume = 0; bool exist = false; double requiredbalance = 0.0; double remainbalance = 0.0; string symbol = Symbol.ToUpper(); try { Symbol = Symbol.ToUpper(); if (!int.TryParse(Volume, out volume)) { message = string.Format("Error: Invalid Volume: {0}", volume); status = enumStatus.OrderPlaceError; } if (!status.Equals(enumStatus.OrderPlaceError) && !string.IsNullOrEmpty(symbol)) { List <Order> companies = MatchMeDB.Instance.OrderTable.ContainsKey(userId) ? MatchMeDB.Instance.OrderTable[userId] : new List <Order>(); exist = companies.Where(a => a.Symbol.Equals(symbol)).Count() > 0; if (!exist) { message = string.Format("Error: The Company does not exist {0}", symbol); status = enumStatus.OrderPlaceError; } } else { message = string.Format("Error: The Company does not exist {0}", symbol); status = enumStatus.OrderPlaceError; } if (!status.Equals(enumStatus.OrderPlaceError) && !Enum.TryParse(OrderSide, true, out orderside)) { message = string.Format("Error: Invalid Order Side: {0}", OrderSide); status = enumStatus.OrderPlaceError; } if (!status.Equals(enumStatus.OrderPlaceError) && !Enum.TryParse(OrderType, true, out ordertype)) { message = string.Format("Error: Invalid Order Type: {0}", OrderType); status = enumStatus.OrderPlaceError; } if (!status.Equals(enumStatus.OrderPlaceError) && ordertype.Equals(enumOrderType.Market)) { price = Exchange.Instance.GetMarketPrice(orderside, symbol, volume); } if (!status.Equals(enumStatus.OrderPlaceError) && ordertype.Equals(enumOrderType.Limit)) { if (!double.TryParse(Price, out price)) { message = string.Format("Error: Invalid Price: {0}", Price); status = enumStatus.OrderPlaceError; } if (!status.Equals(enumStatus.OrderPlaceError) && orderside.Equals(enumSide.Sell)) { price = (-1) * Math.Abs(price); } } if (!status.Equals(enumStatus.OrderPlaceError) && !string.IsNullOrEmpty(UserName)) { MatchMeDB.Instance.UserTable.TryGetValue(UserName, out user); if (user == null) { message = string.Format("Error: Can't retrieve the User from the db via the keys. UserName{0}, UserId{1}", UserName, UserId); status = enumStatus.OrderPlaceError; } } if (!status.Equals(enumStatus.OrderPlaceError) && string.IsNullOrEmpty(message) && exist) { if (price > 0) { //price larger than zero means that it's a buy limit order or an order with valid market price requiredbalance = price * volume + Config.Commission; } if (requiredbalance > user.Balance) { //check if balance is enough remainbalance = requiredbalance - user.Balance; message = string.Format("Error: No Enough Balance: Remain balance {0}, Requires {1} to place the order", user.Balance, remainbalance); status = enumStatus.Rejected; } else { Order newOrder = new Order(symbol, volume, price, user.Id, ordertype, orderside); if (orderside.Equals(enumSide.Sell)) { status = Exchange.Instance.PlaceSell(newOrder); if (status.Equals(enumStatus.Rejected)) { message = string.Format("Error: Short Sell is not allowed. {0}", newOrder); } } else if (orderside.Equals(enumSide.Buy)) { status = Exchange.Instance.PlaceBuy(newOrder); } if (!status.Equals(enumStatus.OrderPlaceError) && string.IsNullOrEmpty(message)) { message = "New Order Placed:" + MatchMeDB.Instance.Orders[newOrder.Id]; status = enumStatus.OrderPlaced; } } } } catch (Exception ex) { ServerLog.LogException(ex, string.Format("Place Order Failed, User {0}, Symbol {1}", user.ToString(), Symbol)); message = ex.Message; status = enumStatus.OrderPlaceError; } var result = new Dictionary <string, string> { { "status", status.ToString() }, { "message", message } }; return(JsonConvert.SerializeObject(result)); }
public string AdjustBalance(string UserName, string UserId, string AdjustAmount) { User user = null; string message = string.Empty; enumStatus status = enumStatus.Unknown; double adjustAmount; try { if (!double.TryParse(AdjustAmount, out adjustAmount)) { message = string.Format("Error: Invalid adjustment: {0}", adjustAmount); status = enumStatus.BalanceAdjustFailed; } if (!string.IsNullOrEmpty(UserName)) { MatchMeDB.Instance.UserTable.TryGetValue(UserName, out user); } if (user == null && !string.IsNullOrEmpty(UserId)) { string userDoc = string.Empty; MatchMeDB.Instance.Users.TryGetValue(UserId, out userDoc); if (userDoc != null) { user = new User(userDoc); } } if (user == null) { message = string.Format("Error: Can't retrieve the User from the db via the keys. UserName{0}, UserId{1}", UserName, UserId); status = enumStatus.BalanceAdjustFailed; } else { //We found the User in DB, so we update it! user.Balance += adjustAmount; if (user.Balance < 0) { message = string.Format("Error: Balance less than 0. UserName{0}, UserId{1}", UserName, user.Balance); status = enumStatus.BalanceAdjustFailed; } status = MatchMeDB.Instance.UpdateUser(user); if (status.Equals(enumStatus.BalanceAdjusted)) { message = string.Format("Balance Adjusted. {0}", user.ToString()); } } } catch (Exception ex) { ServerLog.LogException(ex, string.Format("Add User: {0}", user.ToString())); message = ex.Message; status = enumStatus.BalanceAdjustFailed; } var result = new Dictionary <string, string> { { "status", status.ToString() }, { "message", message } }; return(JsonConvert.SerializeObject(result)); }