public void Add(PositionSummaryData d) { if (!dic.ContainsKey(d.Contract.Code)) { dic.Add(d.Contract.Code, new PositionSummary(d)); } }
public static void InitPosition(this Trader t, PositionSummaryData d) { if (!dic.ContainsKey(t.Id)) { lock (dicSync) { if (!dic.ContainsKey(t.Id)) { dic.Add(t.Id, new PositionSummaryCollection()); } } } dic[t.Id].Add(d); }
public void UpdatePositionSummary(Trader obj, List <UserPosition> ups, bool isAdd) { LogError(() => { lock (obj.Account.BailAccount) { foreach (var v in ups) { try { var m = market.Get(v.Order.Contract.Name); obj.Calc(v, isAdd, m == null ? 0 : m.NewestDealPrice); } catch (Exception e) { Singleton <TextLog> .Instance.Error(e, "UpdatePositionSummary"); } } } if (OnPositionSummaryChanged != null && ups.Count > 0) { var u = ups[0]; var ps = obj.GetPositionSummary(u.Order.Contract.Code, u.Order.PositionType); var v = ps; var pd = new PositionSummaryData { OrderType = v.OrderType, Commission = 0, TotalValue = v.TotalValue, Maintain = 0, ClosableCount = obj.GetClosableCount(v), FloatProfit = v.FloatProfit, BuyTotal = v.BuyTotal, BuyPrice = v.BuyPrice, Count = v.Count, PositionType = v.PositionType, ContractId = v.Contract.Id, CloseProfit = v.CloseProfit, TraderId = obj.Id, When = DateTime.Now }; pds.Save(pd); RaisePC(ps, obj); } }); }
/// <summary> /// 手动行权 /// </summary> /// <param name="contractId"></param> /// <param name="basePrice"></param> public void ManualExcute(int contractId, decimal basePrice, Market m, string name) { log.Info(string.Format("开始手动行权:{0}-{1}", contractId, basePrice)); List <int> l = new List <int>(); var oss = OptionService.Model.Traders.Where(a => a.Orders().Count > 0).ToList(); //先撤单 foreach (var s in oss) { var aa = s.Orders().GetLivesByContractId(contractId); foreach (var b in aa) { OptionService.Matcher.Redo(b); l.Add(b.Id); } } var traders = ts.ToList(); //遍历所有交易员 for (int i = 0; i < traders.Count; i++) { var upl = traders[i].GetPositionSummaries().Where(a => a.Contract.Id == contractId); var has = upl != null && upl.Count() > 0; log.Info(string.Format("{0}-{1}-{2}-{3}个-应{4}", traders[i].Name, has ? upl.First().PositionType : "", has ? upl.First().Contract.Id : 0, has ? upl.First().Count : 0, contractId)); if (upl == null) { continue; } var uppp = upl.ToList(); //再遍历他的当前合约的持仓汇总 for (int j = 0; j < upl.Count(); j++) { Execute(uppp[j], traders[i], basePrice, true); var q = traders[i].GetPositionSummaries().Where(a => a.Contract.Id == contractId).FirstOrDefault(); if (q == null) { continue; } var v = q; traders[i].RemovePositionSummary(v.CCode);//根据合约代码移除持仓汇总 var pd = new PositionSummaryData { OrderType = v.OrderType, Commission = 0, TotalValue = v.TotalValue, Maintain = 0, ClosableCount = traders[i].GetClosableCount(v), FloatProfit = v.FloatProfit, BuyTotal = v.BuyTotal, BuyPrice = v.BuyPrice, Count = v.Count, PositionType = v.PositionType, ContractId = v.Contract.Id, CloseProfit = v.CloseProfit, TraderId = traders[i].Id, When = DateTime.Now }; pds.Save(pd); OnRemovedByExe(traders[i], v); var uq = traders[i].Positions.Where(a => a.Order.Contract.Id == contractId); if (uq == null) { continue; } var uql = uq.ToList(); foreach (var u in uql) { traders[i].Positions.Remove(u); } } } m.Board.Remove(name); handler.UpdateOrderStateToExecuted(l); if (OnContractExecuted != null) { OnContractExecuted(contractId, basePrice); } log.Info(string.Format("结束手动行权:{0}-{1}", contractId, basePrice)); }