/// <summary> /// Проверяет - заполненны ли все необходимые поля (это больше от регрессионных ошибок) /// </summary> /// <param name="item"></param> /// <returns></returns> private static void FieldValidation(AccountGroupItem item) { if (item == null) { throw new ArgumentNullException("item"); } Assert.IsNotNull(item); Assert.IsNotNull(item.Code); Assert.IsNotNull(item.Name); Assert.IsNotNull(item.IsReal); Assert.IsNotNull(item.BrokerLeverage); Assert.IsNotNull(item.MarginCallPercentLevel); Assert.IsNotNull(item.StopoutPercentLevel); Assert.IsNotNull(item.AccountsCount); Assert.IsNotNull(item.Dealer); Assert.IsNotNull(item.MessageQueue); Assert.IsNotNull(item.SessionName); Assert.IsNotNull(item.HedgingAccount); Assert.IsNotNull(item.SenderCompId); Assert.IsNotNull(item.SwapFree); Assert.IsNotNull(item.Markup); Assert.IsNotNull(item.DefaultMarkupPoints); Assert.IsNotNull(item.DefaultVirtualDepo); Assert.IsNotNull(item.Dealers); }
//获取主账户最大可下单数量 public static int GetAccountCount(Order order) { Account account = AccountRA.Get("A_" + order.account_id); if (order.type_enum == OrderTypeEnum.Buy && !string.IsNullOrWhiteSpace(account.limit_no_buying) && account.limit_no_buying.Contains(order.code)) { return(0); } if (account.status_enum == StatusEnum.Forbidden) { return(0); } if (account.status_order_enum == StatusOrderEnum.Forbidden) { return(0); } if (order.type_enum == OrderTypeEnum.Buy && account.status_order_enum == StatusOrderEnum.NoBuying) { return(0); } if (order.type_enum == OrderTypeEnum.Buy) { decimal count = account.capital_initial / order.price; if (account.limit_ratio_single > 0) { count = Math.Min(count, account.capital_initial * account.limit_ratio_single / order.price); } BlockInfo block = StockInfoBiz.GetBlock(order.code); if (block.block_type_enum == BlockEnum.gem) { if (account.limit_ratio_gem_single > 0) { count = Math.Min(count, account.capital_initial * account.limit_ratio_gem_single / order.price); } if (account.limit_ratio_gem_total > 0) { count = Math.Min(count, (account.capital_initial * account.limit_ratio_gem_total - account.capital_stock_value_gem) / order.price); } } string[] keys = TradeRA.KeySearch("G_*_U_" + order.unit_id + "_A_" + order.account_id); AccountGroupItem item = AccountGroupRA.Get(keys[0]); if (item.capital_available > 0) { count = Math.Min(count, (item.capital_available - item.capital_stock_value) / order.price); } return((int)Math.Ceiling(count / 100) * 100); } else { return(PositionRA.GetSellable(order.unit_id, order.code, order.account_id)); } }
public ActionResult EditDealerAccountGroups(AccountGroupItem model) { var result = dealerRepository.SaveChangesDealerFealdInAccountGroup(model) ? string.Format("{0} {1} {2} {3}", Resource.MessageAccountGroupSaveDealerInfo, model.Dealer, Resource.MessageAccountGroupFor, model.Code) : string.Format("{0} {1} {2}.", Resource.ErrorMessageSaveDeallerInfo, Resource.MessageAccountGroupFor, model.Code); return(RedirectToAction("AccountGroups", new { message = result })); }
public static void LoadAccountGroupItem(AccountGroupItem item) { string key = "G_" + item.account_group_id + "_U_" + item.unit_id + "_A_" + item.account_id; if (TradeRA.KeyExists(key)) { return; } AccountGroupRA.Add(item, key); }
public static void Add(AccountGroupItem item, string key) { Dictionary <string, string> items = new Dictionary <string, string>(); items.Add("account_group_id", item.account_group_id.ToString()); items.Add("account_id", item.account_id.ToString()); items.Add("capital_allow", item.capital_allow.ToString()); items.Add("sort_buy", item.sort_buy.ToString()); items.Add("sort_sell", item.sort_sell.ToString()); items.Add("unit_id", item.unit_id.ToString()); items.Add("capital_stock_value", item.capital_stock_value.ToString()); TradeRA.SetFields(key, items); TradeRA.SetExpire(key); }
public ActionResult EditAccountGroupsDetails(string code) { AccountGroupItem result = null; try { result = accountGroupsRepository.GetAccountGroups(code).First(); } catch (InvalidOperationException ex) { Logger.Error(String.Format("EditAccountGroupsDetails - на сервере отсутствует группа счетов с кодом {0}", code), ex); } catch (Exception ex) { Logger.Error(String.Format("EditAccountGroupsDetails - ошибка полуения с сервера группы счетов по её коду {0}", code), ex); } return(View(result)); }
/// <summary> /// Добавление новой группы счетов /// </summary> /// <param name="newAccountGroup">Добавляемая группа счётов</param> /// <returns>Сообщение о результате выполнения запроса</returns> /// <remarks>Не тестируется</remarks> public string AddAccountGroup(AccountGroupItem newAccountGroup) { Logger.Info(string.Format("Попытка добавить новую группу четов {0} в БД.", newAccountGroup.Code)); try { var undecorateAccountGroup = LinqToEntity.UndecorateAccountGroup(newAccountGroup); using (var ctx = DatabaseContext.Instance.Make()) { ctx.ACCOUNT_GROUP.Add(undecorateAccountGroup); ctx.SaveChanges(); return(string.Format("{1} (# {0}).", newAccountGroup.Code, Resource.MessageAccountGroupAdd)); } } catch (Exception ex) { Logger.Error("AddAccountGroup()", ex); } return(string.Format("{1} {0}.", newAccountGroup.Code, Resource.ErrorMessageAccountGroupAdd)); }
//检查主账户是否满足下单条件 public static ApiResultEnum CheckAccount(Order order) { Account account = AccountRA.Get("A_" + order.account_id); if (order.type_enum == OrderTypeEnum.Buy && !string.IsNullOrWhiteSpace(account.limit_no_buying) && account.limit_no_buying.Contains(order.code)) { return(ApiResultEnum.Order_Account_NoBuying_Code); } if (account.status_enum == StatusEnum.Forbidden) { return(ApiResultEnum.Order_Account_Forbidden); } if (account.status_order_enum == StatusOrderEnum.Forbidden) { return(ApiResultEnum.Order_Account_Forbidden_Order); } if (order.type_enum == OrderTypeEnum.Buy && account.status_order_enum == StatusOrderEnum.NoBuying) { return(ApiResultEnum.Order_Account_NoBuying_Order); } if (order.type_enum == OrderTypeEnum.Buy) { if (account.limit_ratio_single > 0 && order.price * order.count > account.capital_initial * account.limit_ratio_single) { return(ApiResultEnum.Order_Account_Limit_Single); } BlockInfo block = StockInfoBiz.GetBlock(order.code); if (block.block_type_enum == BlockEnum.gem) { if (account.limit_ratio_gem_single > 0 && order.price * order.count > account.capital_initial * account.limit_ratio_gem_single) { return(ApiResultEnum.Order_Account_Limit_GEM_Single); } if (account.limit_ratio_gem_total > 0 && order.price * order.count + account.capital_stock_value_gem > account.capital_initial * account.limit_ratio_gem_total) { return(ApiResultEnum.Order_Account_Limit_GEM_Total); } } string[] keys = TradeRA.KeySearch("G_*_U_" + order.unit_id + "_A_" + order.account_id); AccountGroupItem item = AccountGroupRA.Get(keys[0]); if (item.capital_available > 0 && item.capital_available < order.price * order.count + item.capital_stock_value) { return(ApiResultEnum.Order_Account_Negative_Amount); } } else { if (PositionRA.GetSellable(order.unit_id, order.code, order.account_id) < order.count) { return(ApiResultEnum.Order_Account_Negative_Position); } } //风控通过进行冻结 if (order.type_enum == OrderTypeEnum.Buy) { string key_unit = "U_" + order.unit_id; UnitRA.UpdateCapitalOrderBuy(order.price * order.count, key_unit); } else if (order.type_enum == OrderTypeEnum.Sell) { string key_position = "P_" + order.code + "_A_" + order.account_id + "_U_" + order.unit_id; PositionRA.UpdateSellableOrderSell(-order.count, key_position); } return(ApiResultEnum.Success); }
public ActionResult AccountGroupAdd(AccountGroupItem newAccountGroup) { var result = accountGroupsRepository.AddAccountGroup(newAccountGroup); return(RedirectToAction("AccountGroups", new { message = result })); }
public ActionResult EditAccountGroupsDetails(AccountGroupItem model) { var result = accountGroupsRepository.SaveAccountGroupChanges(model); return(RedirectToAction("AccountGroups", new { message = result })); }