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);
 }
Exemple #3
0
        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);
                }
            });
        }
Exemple #4
0
        /// <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));
        }