예제 #1
0
        public Result PositionMoveIn(PositionMoveIn model)
        {
            StockInfo stock = StockInfoBiz.GetStock(model.code);

            if (stock == null || model.unit_id == 0 || model.account_id == 0 || model.price_cost == 0 || model.count == 0)
            {
                return(Result(ApiResultEnum.Failed));
            }

            Position position = PositionRA.Get("P_" + model.code + "_A_" + model.account_id + "_U_" + model.unit_id);
            Deal     deal     = new Deal()
            {
                code       = model.code,
                name       = stock.name,
                count      = model.count,
                price      = model.price_cost,
                money      = model.count * model.price_cost,
                unit_id    = model.unit_id,
                account_id = model.account_id,
                type_enum  = OrderTypeEnum.Buy,
            };

            TradeBiz.AdjustPosition(position, deal, model.price_cost, 2);
            return(Result(ApiResultEnum.Success));
        }
예제 #2
0
        public Result PositionTransfer(PositionTransfer model)
        {
            if (model.from_unit_id > 0 && model.to_unit_id > 0)
            {
                HQItem  hq           = HQService.Get(model.code);
                decimal price_latest = hq != null ? hq.Last : 0;

                List <Position> list = new List <Position>();
                string[]        keys = TradeRA.KeySearch("P_" + model.code + "_*_U_" + model.from_unit_id);
                foreach (var key in keys)
                {
                    list.Add(PositionRA.Get(key));
                }
                if (model.count > list.Sum(p => p.count_sellable))
                {
                    int transfer_total = 0;
                    foreach (Position position in list)
                    {
                        int transfer = Math.Min(model.count, position.count_sellable);
                        PositionRA.UpdateTransfer(model.from_unit_id, model.to_unit_id, position.account_id, (model.to_account_id == 0 ? position.account_id : model.to_account_id), model.code, transfer, price_latest);
                        transfer_total += transfer;

                        if (transfer_total == model.count)
                        {
                            break;
                        }
                    }
                    return(Result(ApiResultEnum.Success));
                }
            }
            return(Result(ApiResultEnum.Failed));
        }
예제 #3
0
 public static void SavePosition()
 {
     string[] keys = TradeRA.KeySearch("P_*");
     foreach (string key in keys)
     {
         Position position = PositionRA.Get(key);
         if (position.count == 0)
         {
             if (position.id > 0)
             {
                 PositionDA.Delete(position.id);
             }
         }
         else
         {
             position.price_latest = HQService.Get(position.code).Last;
             if (position.id > 0)
             {
                 PositionDA.Update(position);
             }
             else
             {
                 PositionDA.Add(position);
             }
         }
     }
 }
예제 #4
0
        public static void NewDeal(Deal deal, decimal order_price, int type = 0)
        {
            //计算手续费,佣金最少收5元
            string key_unit = "U_" + deal.unit_id;
            Unit   unit     = UnitRA.Get(key_unit);

            deal.commission     = Math.Max(Math.Round(deal.money * unit.ratio_commission, 2), 5);
            deal.management_fee = Math.Round(deal.money * unit.ratio_management_fee, 2);

            //卖单计算盈亏
            Position position = PositionRA.Get("P_" + deal.code + "_A_" + deal.account_id + "_U_" + deal.unit_id);

            if (deal.type == 1 && position != null)
            {
                deal.profit = Math.Round((deal.price - position.price_cost) * deal.count - deal.commission, 2);
            }

            //更新手续费和盈亏
            DealRA.UpdateFee(deal, "D_" + deal.deal_no + "_O_" + deal.order_no + "_U_" + deal.unit_id);

            AdjustPosition(position, deal, order_price, type);
        }
예제 #5
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);
            }
        }