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