Пример #1
0
        //获取主账户最大可下单数量
        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));
            }
        }
Пример #2
0
        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);
        }
Пример #3
0
        //将单元的下单数量分配到主账户
        public static Dictionary <int, int> GetOrderAccount(Order order)
        {
            Dictionary <int, int> order_items = new Dictionary <int, int>();
            Unit unit = UnitRA.Get("U_" + order.unit_id);
            List <AccountGroupItem> items = AccountGroupRA.List4Unit(order.unit_id);
            int total = 0;

            if (order.type_enum == OrderTypeEnum.Buy)
            {
                if (unit.priority_strategy_enum == PriorityStrategyEnum.Natural)
                {
                    items = items.OrderBy(i => i.sort_buy).ToList();
                }
                else
                {
                    items = items.OrderByDescending(i => i.capital_available).ToList();
                }
                foreach (AccountGroupItem item in items)
                {
                    int buyable = (item.capital_available == decimal.MaxValue) ? (order.count - total) : (int)(item.capital_available / 100 / order.price) * 100;
                    int ct      = Math.Min(buyable, (order.count - total));
                    order_items.Add(item.account_id, ct);
                    total += ct;
                    if (ct == order.count)
                    {
                        break;
                    }
                }
            }
            else
            {
                items = items.OrderBy(i => i.sort_sell).ToList();
                foreach (AccountGroupItem item in items)
                {
                    int sellable = PositionRA.GetSellable(order.unit_id, order.code, item.account_id);
                    int ct       = Math.Min(sellable, (order.count - total));
                    order_items.Add(item.account_id, ct);
                    total += ct;
                    if (ct == order.count)
                    {
                        break;
                    }
                }
            }
            return(order_items);
        }
Пример #4
0
        public Result Delete(Model.DB.AccountGroup model)
        {
            var units = UnitDA.List4AccountGroup(model.id);

            if (units.Count > 0)
            {
                return(Result(ApiResultEnum.Cited, string.Join(",", units.Select(u => u.code))));
            }

            model.created_by = user_id;
            ApiResultEnum result = AccountGroupDA.Delete(model);

            if (result == ApiResultEnum.Success && MonitorRA.GetStatusTrade() != 0)
            {
                AccountGroupRA.Delete4AccountGroup(model.id);
            }
            return(Result(result, string.Empty));
        }
Пример #5
0
        public Result UpdateItems(Model.DB.AccountGroup model)
        {
            model.items = model.items.OrderBy(i => i.sort_buy).AsEnumerable().DistinctBy(i => i.account_id).ToList();
            ApiResultEnum result = AccountGroupDA.UpdateItems(model);

            if (result == ApiResultEnum.Success && MonitorRA.GetStatusTrade() != 0)
            {
                var units = UnitDA.List4AccountGroup(model.id);
                foreach (var kvp in units)
                {
                    UnitRA.UpdatePriorityStrategy(model.priority_strategy, "U_" + kvp.id);
                }
                AccountGroupRA.Delete4AccountGroup(model.id);
                List <Model.DB.AccountGroupItem> items = AccountGroupDA.ListItems4AccountGroup(model.id);
                foreach (Model.DB.AccountGroupItem item in items)
                {
                    OpenCloseBiz.LoadAccountGroupItem(item);
                }
                TradeBiz.RunCalculateValue();
            }
            return(Result(result));
        }
Пример #6
0
        public Result <int> Count(Order model)
        {
            model.user_id = user_id;
            ApiResultEnum result = LimitBiz.CheckStatus(model);

            if (result != ApiResultEnum.Success && result != ApiResultEnum.Order_Count_Error && (result != ApiResultEnum.Order_Price_Error || model.type_enum == OrderTypeEnum.Buy))
            {
                return(Result(ApiResultEnum.Success, 0));
            }

            int unit_count = LimitBiz.GetUnitCount(model);

            if (unit_count == 0)
            {
                return(Result(ApiResultEnum.Success, 0));
            }

            List <int> order_items;
            int        account_count = 0;

            if (model.account_id == 0)
            {
                order_items = AccountGroupRA.List4Unit(model.unit_id).Select(g => g.account_id).ToList();
            }
            else
            {
                order_items = new List <int> {
                    model.account_id
                }
            };
            foreach (int account_id in order_items)
            {
                model.account_id = account_id;
                account_count   += LimitBiz.GetAccountCount(model);
            }
            return(Result(ApiResultEnum.Success, Math.Min(unit_count, account_count)));
        }
Пример #7
0
        public static void RunCalculateValue()
        {
            //单元的市值
            Dictionary <int, decimal[]> dic_unit = new Dictionary <int, decimal[]>();
            //主账户的市值
            Dictionary <int, decimal> dic_account = new Dictionary <int, decimal>();
            //单元下主账户组中的主账户市值
            Dictionary <string, decimal> dic_account_group = new Dictionary <string, decimal>();

            string[] keys = TradeRA.KeySearch("P_*");
            foreach (string key in keys)
            {
                Position position = PositionRA.Get(key);
                HQItem   hq       = HQService.Get(position.code);
                decimal  price    = hq == null ? position.price_latest : hq.Last;
                decimal  value    = price * position.count;
                decimal  profit   = (price - position.price_cost) * position.count;
                if (dic_unit.ContainsKey(position.unit_id))
                {
                    dic_unit[position.unit_id][position.block] += value;
                    dic_unit[position.unit_id][4] += value;
                    dic_unit[position.unit_id][5] += profit;
                }
                else
                {
                    decimal[] values = new decimal[6] {
                        0, 0, 0, 0, value, profit
                    };
                    values[position.block] = value;
                    dic_unit.Add(position.unit_id, values);
                }

                //主账户市值暂只计算创业板
                if (position.block_enum == BlockEnum.gem)
                {
                    if (dic_account.ContainsKey(position.account_id))
                    {
                        dic_account[position.account_id] += value;
                    }
                    else
                    {
                        dic_account.Add(position.account_id, value);
                    }
                }

                string ua = "U_" + position.unit_id + "_A_" + position.account_id;
                if (dic_account_group.ContainsKey(ua))
                {
                    dic_account_group[ua] += value;
                }
                else
                {
                    dic_account_group.Add(ua, value);
                }
            }
            foreach (var kvp in dic_unit)
            {
                UnitRA.UpdateCapitalStockValue(kvp.Value, "U_" + kvp.Key);
            }
            foreach (var kvp in dic_account)
            {
                AccountRA.UpdateCapitalStockValue(kvp.Value, "A_" + kvp.Key);
            }
            foreach (var kvp in dic_account_group)
            {
                AccountGroupRA.UpdateCapitalStockValue(kvp.Key, kvp.Value);
            }
        }
Пример #8
0
        //检查主账户是否满足下单条件
        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);
        }