示例#1
0
        /// <summary>
        /// 用户登录
        /// </summary>
        /// <param name="InputJson"></param>
        /// <returns></returns>
        public static int?login(String InputJson)
        {
            loginType para = JsonConvert.DeserializeObject <loginType>(InputJson);

            if (para.password.Length < 16)
            {
                for (int i = 0; i < 16 - para.password.Length; i++)
                {
                    para.password += "A";
                }
            }

            int?result = DBAccessLayer.Login(para);

            if (result != 0)
            {
                //说明登录成功,需要记录当前已经连入用户的信息
                if (LoginUserDirection.Keys.Contains(para.name))
                {
                    LoginUserDirection[para.name] = para;
                }
                else
                {
                    LoginUserDirection.Add(para.name, para);
                }
            }

            return(result);
        }
示例#2
0
        public static bool ChangePassword(String InputJson)
        {
            if (InputJson == null)
            {
                return(false);
            }
            ChangePasswordType para = JsonConvert.DeserializeObject <ChangePasswordType>(InputJson);

            if (para.op.Length < 16)
            {
                for (int i = 0; i < 16 - para.op.Length; i++)
                {
                    para.op += "A";
                }
            }

            if (para.np.Length < 16)
            {
                for (int i = 0; i < 16 - para.np.Length; i++)
                {
                    para.np += "A";
                }
            }

            return(DBAccessLayer.ChangePassword(para));
        }
        /// <summary>
        /// 策略管理线程启动
        /// </summary>
        public void Run()
        {
            Thread excutedThread = new Thread(new ThreadStart(ThreadProc));

            excutedThread.Start();

            if (DBAccessLayer.DBEnable)
            {
                //策略管理线程启动检测未完成策略
                List <OPENCREATE> remainOpenStra = DBAccessLayer.GetInCompletedOPENStrategy();

                foreach (var item in remainOpenStra)
                {
                    QCommands.Enqueue((object)item);
                }

                List <CLOSECREATE> remainCloseStra = DBAccessLayer.GetInCompletedCLOSEStrategy();

                foreach (var item in remainCloseStra)
                {
                    QCommands.Enqueue((object)item);
                }
            }


            Thread.Sleep(1000);
        }
示例#4
0
        public void Run()
        {
            Thread mythread = new Thread(new ThreadStart(threadproc));

            mythread.Start();

            //载入未完成委托记录
            List <ER_TAOLI_TABLE> ERs = DBAccessLayer.GetInCompletedERRecord("S");

            if (ERs != null && ERs.Count > 0)
            {
                foreach (ER_TAOLI_TABLE item in ERs)
                {
                    QueryEntrustOrderStruct_M entrust = new QueryEntrustOrderStruct_M()
                    {
                        Code         = item.ER_CODE,
                        Direction    = Convert.ToInt16(item.ER_DIRECTION),
                        ExchangeID   = item.ER_ORDER_EXCHANGE_ID,
                        OrderPrice   = Convert.ToDouble(item.ER_FROZEN_MONEY) / Convert.ToInt16(item.ER_VOLUME_TOTAL_ORIGINAL),
                        OrderRef     = Convert.ToInt32(item.ER_ORDER_REF),
                        OrderSysID   = item.ER_ID,
                        SecurityType = (sbyte)115,
                        StrategyId   = item.ER_STRATEGY
                    };

                    queue_query_entrust.GetQueue().Enqueue(entrust);
                }
            }
        }
示例#5
0
        /// <summary>
        ///  股票成交后更新本地股票资金信息
        ///  修改:
        ///     1. 可用资金
        ///     2. 股票成本
        /// </summary>
        /// <param name="alias">用户名</param>
        /// <param name="amount">交易数量,正为买入,负为卖出</param>
        /// <param name="price">价格</param>
        public static void ChangeStockAccountDuToStockDeal(string alias, double price, int amount)
        {
            lock (StockAccountDictionary)
            {
                if (StockAccountDictionary.Keys.Contains(alias.Trim()))
                {
                    StockAccountDictionary[alias.Trim()].StockValue = (Convert.ToDouble(StockAccountDictionary[alias.Trim()].StockValue) + price * amount).ToString();

                    if (amount < 0)
                    {
                        //卖出会增加可用资金
                        StockAccountDictionary[alias.Trim()].Balance = (Convert.ToDouble(StockAccountDictionary[alias.Trim()].Balance) - price * amount).ToString();
                    }
                }
                else
                {
                    StockAccountTable stock = DBAccessLayer.GetStockAccount(alias.Trim());

                    stock.StockValue = (Convert.ToDouble(stock.StockValue) + price * amount).ToString();

                    if (amount < 0)
                    {
                        //卖出修改可用资金量
                        stock.Balance = (Convert.ToDouble(stock.Balance) - amount * price).ToString();
                    }

                    StockAccountDictionary.Add(alias.Trim(), stock);
                }
            }
        }
示例#6
0
        public string ImportTrade(String InputJson)
        {
            try
            {
                string    mark       = InputJson.Substring(0, 2);
                string    jsonString = InputJson.Substring(2);
                MakeOrder order      = new MakeOrder();

                if (mark == "C1")
                {
                    order = (JsonConvert.DeserializeObject <MakeOrder>(jsonString));
                }

                List <MakeOrder> orders = new List <MakeOrder>();
                orders.Add(order);

                queue_prd_trade_from_tradeMonitor.GetQueue().Enqueue((object)orders);

                return("SUCCESS");
            }
            catch (Exception ex)
            {
                GlobalErrorLog.LogInstance.LogEvent("生成交易失败: " + InputJson);
                DBAccessLayer.LogSysInfo("HomeController", ex.ToString());
                return("FALSE");
            }
        }
示例#7
0
        /// <summary>
        /// 页面股票/期货委托信息更新
        /// 股票通过Entrust_query查询最新委托状态并更新
        /// 期货通过UpdateOrder 函数更新最新状态
        /// 该函数传入参数中的JsonString,是单只股票期货的状态,本地维护OrderList来保存之前交易的状态。
        /// </summary>
        /// <param name="name"></param>
        /// <param name="JsonString"></param>
        public void updateOrderList(String name, OrderViewItem item)
        {
            try
            {
                if (item != null)
                {
                    if (!OrderLists.Keys.Contains(name))
                    {
                        List <OrderViewItem> ss = new List <OrderViewItem>();
                        ss.Add(item);
                        OrderLists.Add(name, ss);
                    }

                    List <OrderViewItem> orders = OrderLists[name];

                    OrderViewItem order = orders.Find(
                        delegate(OrderViewItem record)
                    {
                        return(record.OrderRef == item.OrderRef);
                    }
                        );

                    if (order == null)
                    {
                        OrderLists[name].Add(item);
                    }
                    else
                    {
                        order.MSG         = item.MSG;
                        order.VolumeTotal = item.VolumeTotal;
                    }

                    if (!UserConnectionRelation.ContainsKey(name))
                    {
                        return;
                    }

                    _context.Clients.Client(UserConnectionRelation[name]).updateOrderList(JsonConvert.SerializeObject(orders));
                }
                else
                {
                    if (!UserConnectionRelation.ContainsKey(name))
                    {
                        return;
                    }

                    if (!OrderLists.Keys.Contains(name))
                    {
                        List <OrderViewItem> ss = new List <OrderViewItem>();

                        OrderLists.Add(name, ss);
                    }

                    List <OrderViewItem> orders = OrderLists[name];
                    _context.Clients.Client(UserConnectionRelation[name]).updateOrderList(JsonConvert.SerializeObject(orders));
                }
            }
            catch (Exception ex) { DBAccessLayer.LogSysInfo("TradeMonitorHub-updateOrderList", ex.ToString()); GlobalErrorLog.LogInstance.LogEvent(ex.ToString()); }
        }
示例#8
0
        public string ImportHarbor(String InputJson)
        {
            try
            {
                string mark       = InputJson.Substring(0, 2);
                string jsonString = InputJson.Substring(2);
                object obj        = new object();

                if (mark == "A1")
                {
                    obj = (object)(JsonConvert.DeserializeObject <OPENCREATE>(jsonString));
                }
                else if (mark == "A2")
                {
                    obj = (object)(JsonConvert.DeserializeObject <OPENMODIFY>(jsonString));
                }
                else if (mark == "A3")
                {
                    obj = (object)(JsonConvert.DeserializeObject <OPENRUN>(jsonString));
                }
                else if (mark == "A4")
                {
                    obj = (object)(JsonConvert.DeserializeObject <OPENALLOW>(jsonString));
                }
                else if (mark == "A5")
                {
                    obj = (object)(JsonConvert.DeserializeObject <OPENDELETE>(jsonString));
                }
                else if (mark == "B1")
                {
                    obj = (object)(JsonConvert.DeserializeObject <CLOSECREATE>(jsonString));
                }
                else if (mark == "B2")
                {
                    obj = (object)(JsonConvert.DeserializeObject <CLOSEMODIFY>(jsonString));
                }
                else if (mark == "B3")
                {
                    obj = (object)(JsonConvert.DeserializeObject <CLOSERUN>(jsonString));
                }
                else if (mark == "B4")
                {
                    obj = (object)(JsonConvert.DeserializeObject <CLOSEALLOW>(jsonString));
                }
                else if (mark == "B5")
                {
                    obj = (object)(JsonConvert.DeserializeObject <CLOSEDELETE>(jsonString));
                }

                StrategyMonitorClass.QCommands.Enqueue(obj);
                return("SUCCESS");
            }
            catch (Exception ex)
            {
                DBAccessLayer.LogSysInfo("HomeController", ex.ToString());
                return(ex.ToString());
            }
        }
示例#9
0
        /// <summary>
        /// 注册新用户
        /// </summary>
        /// <param name="InputJson"></param>
        /// <returns></returns>
        public static string register(String InputJson)
        {
            registerType para = JsonConvert.DeserializeObject <registerType>(InputJson);

            if (para.Password.Length < 16)
            {
                for (int i = 0; i < 16 - para.Password.Length; i++)
                {
                    para.Password += "A";
                }
            }

            return(DBAccessLayer.InsertUser(para));
        }
示例#10
0
        public void updateRiskList(String name, String JsonStringRisk, String JsonStringRiskPara)
        {
            try
            {
                if (!UserConnectionRelation.ContainsKey(name))
                {
                    return;
                }

                _context.Clients.Client(UserConnectionRelation[name]).updateRiskList(JsonStringRisk);
                _context.Clients.Client(UserConnectionRelation[name]).updateRiskPara(JsonStringRiskPara);
            }
            catch (Exception ex) { DBAccessLayer.LogSysInfo("TradeMonitorHub-updateRiskList", ex.ToString()); GlobalErrorLog.LogInstance.LogEvent(ex.ToString()); }
        }
示例#11
0
        /// <summary>
        /// 获取白名单列表
        /// </summary>
        public static string LoadWhiteList()
        {
            //初始化加载风控参数
            List <BWNameTable> BWRecords = DBAccessLayer.GetWBNamwList();

            riskPara.WhiteNameList.Clear();

            foreach (BWNameTable record in BWRecords)
            {
                riskPara.WhiteNameList.Add(record.Code + "|" + record.Amount + "|" + record.PercentageA + "|" + record.Value + "|" + record.PercentageB);
            }

            return(JsonConvert.SerializeObject(BWRecords));
        }
示例#12
0
        public void getStrategyID(String InputJson)
        {
            lock (SyncRoot)
            {
                string jsonString = InputJson.Substring(2);

                try
                {
                    SEARCHSTRATEGY obj = (JsonConvert.DeserializeObject <SEARCHSTRATEGY>(jsonString));

                    if (obj == null)
                    {
                        return;
                    }

                    if (obj == null || obj.CONTRACT == string.Empty || obj.INDEX == string.Empty || obj.BASIS == string.Empty)
                    {
                        return;
                    }
                    int    hd = 0;
                    String id = DBAccessLayer.SearchStrategy(obj, out hd);

                    decimal       stockcost   = 0;
                    decimal       futureIndex = 0;
                    List <string> li          = DBAccessLayer.GetDealList(id, out stockcost, out futureIndex);

                    var connectId = Context.ConnectionId;

                    Clients.Client(connectId).GetStrategyId(id, hd);



                    string orderli = string.Empty;
                    string future  = string.Empty;

                    foreach (string deal in li)
                    {
                        orderli += (deal + "\r\n");
                    }

                    Clients.Client(connectId).GetDealList(orderli, stockcost, futureIndex);
                }
                catch (Exception ex)
                {
                    DBAccessLayer.LogSysInfo("StrategyInfoHub-GetStrategyID", ex.ToString());
                    return;
                }
            }
        }
示例#13
0
        public static String SetRiskParaJson(String InputJson, String WhiteLi)
        {
            try
            {
                riskParameter para = JsonConvert.DeserializeObject <riskParameter>(InputJson);

                List <BWNameTable> Records = new List <BWNameTable>();

                riskPara.WhiteNameList.Clear();

                if (WhiteLi.Trim() != string.Empty)
                {
                    foreach (string s in WhiteLi.Split('\n'))
                    {
                        if (s.Trim() == string.Empty)
                        {
                            continue;
                        }
                        riskPara.WhiteNameList.Add(s);

                        Records.Add(new BWNameTable()
                        {
                            ID          = Guid.NewGuid(),
                            Code        = s.Split('|')[0],
                            Amount      = s.Split('|')[1],
                            PercentageA = Convert.ToDouble(s.Split('|')[2]),
                            Value       = s.Split('|')[3],
                            PercentageB = Convert.ToDouble(s.Split('|')[4]),
                            flag        = true
                        });
                    }

                    DBAccessLayer.SetWBNameList(Records);
                }


                riskPara.changkouRatio          = para.changkouRatio;
                riskPara.PerStockCostPercentage = para.PerStockCostPercentage;
                riskPara.riskLevel  = para.riskLevel;
                riskPara.stockRatio = para.stockRatio;

                return("success");
            }
            catch (Exception ex)
            {
                DBAccessLayer.LogSysInfo("riskmonitor", ex.ToString());
                return(ex.ToString());
            }
        }
示例#14
0
 public string SetParas(String JsonString)
 {
     try
     {
         PARAS para = new PARAS();
         para = JsonConvert.DeserializeObject <PARAS>(JsonString);
         DBAccessLayer.SetParameter(para);
         return("success");
     }
     catch (Exception ex)
     {
         DBAccessLayer.LogSysInfo("HomeController-SetParas", ex.ToString());
         return(ex.ToString());
     }
 }
示例#15
0
 public void updateAccountInfo(String name, String JsonString, bool admin)
 {
     try
     {
         if (!UserConnectionRelation.ContainsKey(name))
         {
             return;
         }
         _context.Clients.Client(UserConnectionRelation[name]).updateAccountinfo(admin, JsonString);
     }
     catch (Exception ex)
     {
         DBAccessLayer.LogSysInfo("AccountHub-updateAccountInfo", ex.ToString());
         GlobalErrorLog.LogInstance.LogEvent(ex.ToString());
     }
 }
示例#16
0
        public string ImportBatchTrades(String JsonString)
        {
            try
            {
                List <MakeOrder> orders = new List <MakeOrder>();
                orders = JsonConvert.DeserializeObject <List <MakeOrder> >(JsonString);
                queue_prd_trade_from_tradeMonitor.GetQueue().Enqueue((object)orders);


                return("SUCCESS");
            }
            catch (Exception ex)
            {
                DBAccessLayer.LogSysInfo("HomeController-ImportBatchTrades", ex.ToString());
                return(ex.ToString());
            }
        }
示例#17
0
        public string GetBatchTrade(string user)
        {
            try
            {
                List <string>    strs   = pythonOper.GetInstance().GetBatchTradeList();
                List <MakeOrder> orders = new List <MakeOrder>();

                foreach (string s in strs)
                {
                    try
                    {
                        string[] vars = s.Split('\t');

                        MakeOrder order = new MakeOrder()
                        {
                            belongStrategy  = "00",
                            User            = vars[0].Trim(),
                            exchangeId      = vars[1].Trim().ToUpper(),
                            cSecurityCode   = vars[2].Trim(),
                            nSecurityAmount = Convert.ToInt64(vars[3].Trim()),
                            dOrderPrice     = Convert.ToDouble(vars[4].Trim()),
                            cTradeDirection = vars[5].Trim(),
                            offsetflag      = vars[6].Trim(),
                            cSecurityType   = vars[7].Trim(),
                            OrderRef        = 0
                        };


                        orders.Add(order);
                    }
                    catch
                    {
                        GlobalErrorLog.LogInstance.LogEvent("批量交易生成部分失败:" + s);
                        return("FALSE");
                    }
                }

                return(JsonConvert.SerializeObject(orders));
            }
            catch (Exception ex)
            {
                DBAccessLayer.LogSysInfo("HomeController-ImportBatchTrades", ex.ToString());
                return(ex.ToString());
            }
        }
示例#18
0
        //向客户端传递参数
        public void UpdateStrategyInfo(string name, string Info)
        {
            if (!RegisterRelation.ContainsKey(name))
            {
                //策略实例竟然在页面没有对应的控制面板,此处肯定有问题
                return;
            }

            try
            {
                _context.Clients.Client(RegisterRelation[name]).updatePara(name, Info);
            }
            catch (Exception ex)
            {
                DBAccessLayer.LogSysInfo("ProxyHub-UpdateStrategyInfo", ex.ToString());
                GlobalErrorLog.LogInstance.LogEvent(ex.ToString());
            }
        }
        public void DeleteWorker(object v)
        {
            string id = string.Empty;

            if (v is OPENDELETE)
            {
                OPENDELETE value = v as OPENDELETE;

                id = value.basic.ID;
            }
            else
            {
                CLOSEDELETE value = v as CLOSEDELETE;
                id = value.basic.ID;
            }

            if (!Workers.Keys.Contains(id))
            {
                return;
            }

            //结束策略实例
            Workers[id].breaklabel = true;

            //策略管理中删除该实例信息
            Workers.Remove(id);
            WorkersStratus.Remove(id);

            //行情模块中删除该策略实例的订阅,和消息队列
            DeleteStrategySubscribe(id);
            MarketInfo.SetStrategyQueue(new KeyValuePair <String, Queue>(id, new Queue()));

            if (DBAccessLayer.DBEnable)
            {
                if (v is OPENDELETE)
                {
                    DBAccessLayer.DeleteSGOPEN(id);
                }
                else
                {
                    DBAccessLayer.DeleteSGCLOSE(id);
                }
            }
        }
示例#20
0
        public void updateAuditInfo(List <AccountInfo> accounts)
        {
            List <RISK_TABLE> risks      = DBAccessLayer.GetLatestRiskRecord();
            List <RISK_TABLE> show_risks = new List <RISK_TABLE>();

            if (risks == null)
            {
                risks = new List <RISK_TABLE>();
            }
            else
            {
                foreach (RISK_TABLE risk in risks)
                {
                    if (Convert.ToDateTime(risk.time).Date == DateTime.Now.Date)
                    {
                        show_risks.Add(risk);
                    }
                }
            }
            _context.Clients.All.updateauditInfo(JsonConvert.SerializeObject(accounts), JsonConvert.SerializeObject(show_risks));
        }
示例#21
0
        /// <summary>
        /// 获取所有交易员的账户信息
        /// </summary>
        /// <returns></returns>
        public static List <AccountInfo> GetAccountInfoAll()
        {
            List <AccountInfo> Accounts = new List <AccountInfo>();

            List <UserInfo> Users  = DBAccessLayer.GetUser();
            String          result = String.Empty;

            foreach (UserInfo info in Users)
            {
                if (info.userRight == 2)
                {
                    AccountInfo acc = GetAccountInfo(info.alias, out result);
                    if (acc.positions.Count() > 0)
                    {
                        //交易员,管理员
                        Accounts.Add(acc);
                    }
                }
            }

            return(Accounts);
        }
示例#22
0
        /// <summary>
        /// 添加新委托
        /// </summary>
        /// <param name="record"></param>
        /// <returns>
        /// 0: 添加成功
        /// 1: record orderRef 冲突, 可能该委托已经存在
        /// 2: log中查看错误具体信息
        /// </returns>
        public static int AddEntrustRecord(ERecord record)
        {
            var tmp = (from item in EntrustRecordList where item.OrderRef == record.OrderRef select item);

            if (tmp.Count() > 0)
            {
                GlobalErrorLog.LogInstance.LogEvent("添加委托失败,原因是该委托已经存在,策略号: " + record.StrategyNo + "  代码: " + record.Code + "  本地编号: " + record.OrderRef);
                return(1);
            }

            try
            {
                EntrustRecordList.Add(record);
            }
            catch (Exception ex)
            {
                DBAccessLayer.LogSysInfo("EntrustRecord-AddEntrustRecord", ex.ToString());
                GlobalErrorLog.LogInstance.LogEvent("添加委托失败,原因:" + ex.ToString());
                return(2);
            }

            return(0);
        }
示例#23
0
        public ActionResult SysRegister()
        {
            try
            {
                ViewBag.STOCKADDR      = DBAccessLayer.GetParameter("STOCKADDR");
                ViewBag.STOCKPORT      = DBAccessLayer.GetParameter("STOCKPORT");
                ViewBag.STOCKACCOUNT   = DBAccessLayer.GetParameter("STOCKACCOUNT");
                ViewBag.STOCKDEPTNO    = DBAccessLayer.GetParameter("STOCKDEPTNO");
                ViewBag.STOCKNO        = DBAccessLayer.GetParameter("STOCKNO");
                ViewBag.STOCKPASSWORD  = DBAccessLayer.GetParameter("STOCKPASSWORD");
                ViewBag.FUTUREADDR     = DBAccessLayer.GetParameter("FUTUREADDR");
                ViewBag.FUTUREBROKER   = DBAccessLayer.GetParameter("FUTUREBROKER");
                ViewBag.FUTUREACCOUNT  = DBAccessLayer.GetParameter("FUTUREACCOUNT");
                ViewBag.FUTUREPASSWORD = DBAccessLayer.GetParameter("FUTUREPASSWORD");
            }
            catch (Exception ex)
            {
                GlobalErrorLog.LogInstance.LogEvent(ex.ToString());
                DBAccessLayer.LogSysInfo("HomeController-SysRegister", ex.ToString());
            }

            return(View());
        }
示例#24
0
        public static void Init()
        {
            //初始化加载风控参数
            List <BWNameTable> BWRecords = DBAccessLayer.GetWBNamwList();

            if (BWRecords == null || BWRecords.Count == 0)
            {
                riskPara.WhiteNameList.Clear();

                riskPara.WhiteNameList.Add("600001|210000|0.05|1000000|0.1");
                riskPara.WhiteNameList.Add("600002|230000|0.05|1000000|0.1");
                riskPara.WhiteNameList.Add("600003|270000|0.05|1000000|0.1");

                riskPara.BlackNameList.Clear();

                riskPara.BlackNameList.Add("600004|210000|0.05|1000000|0.1");
                riskPara.BlackNameList.Add("600005|230000|0.05|1000000|0.1");
                riskPara.BlackNameList.Add("600006|270000|0.05|1000000|0.1");
            }
            else
            {
                riskPara.WhiteNameList.Clear();
                riskPara.BlackNameList.Clear();

                foreach (BWNameTable record in BWRecords)
                {
                    if (record.flag == true)
                    {
                        riskPara.WhiteNameList.Add(record.Code + "|" + record.Amount + "|" + record.PercentageA + "|" + record.Value + "|" + record.PercentageB);
                    }
                    else
                    {
                        riskPara.BlackNameList.Add(record.Code + "|" + record.Amount + "|" + record.PercentageA + "|" + record.Value + "|" + record.PercentageB);
                    }
                }
            }
        }
示例#25
0
        public static double future_margin_factor = 0.12; //期货保证金系数

        public static void RUN()
        {
            //首次启动需要load全部持仓到本地
            List <UserInfo> users = DBAccessLayer.GetUser();

            foreach (UserInfo user in users)
            {
                List <CC_TAOLI_TABLE> records = new List <CC_TAOLI_TABLE>();
                DBAccessLayer.LoadCCList(user.alias, out records);

                if (records.Count != 0)
                {
                    ChangeLocalCC(user.alias, records);
                }
            }

            //初始化 stockAccountDictionary futureAccountDictionary
            foreach (UserInfo user in users)
            {
                StockAccountTable stockAccount = DBAccessLayer.GetStockAccount(user.alias);
                StockAccountDictionary.Add(user.alias, stockAccount);

                FutureAccountTable futureAccount = DBAccessLayer.GetFutureAccount(user.alias);
                FutureAccountDictionary.Add(user.alias, futureAccount);
            }

            //初始化 riskFrozenDictionary
            foreach (UserInfo user in users)
            {
                RiskFrozenDictionary.Add(user.alias, new List <RiskFrozenInfo>());
            }



            excuteThread.Start();
            Thread.Sleep(1000);
        }
示例#26
0
        /// <summary>
        /// 期货交易工作线程
        /// </summary>
        /// <param name="para"></param>
        public void FutureTradeSubThreadProc(object para)
        {
            string ErrorMsg = string.Empty;

            //令该线程为前台线程
            Thread.CurrentThread.IsBackground = true;

            DateTime lastmessagetime = DateTime.Now;

            TradeParaPackage _tpp = (TradeParaPackage)para;

            //当前线程编号
            int _threadNo = _tpp._threadNo;

            sublog.LogEvent("线程 :" + _threadNo.ToString() + " 开始执行");

            //用作发送心跳包的时间标记
            DateTime _markedTime = DateTime.Now;

            //控制期货交易线程执行
            bool _threadRunControl = true;

            //获取未成交期货委托
            List <ER_TAOLI_TABLE> ERs = DBAccessLayer.GetInCompletedERRecord("F");

            if (ERs != null)
            {
                foreach (ER_TAOLI_TABLE ER in ERs)
                {
                    decimal price = (ER.ER_VOLUME_TOTAL_ORIGINAL == 0 ? 0 : Convert.ToDecimal(ER.ER_FROZEN_MONEY / ER.ER_VOLUME_TOTAL_ORIGINAL));
                    string  code  = ER.ER_CODE;

                    TradeRecord.GetInstance().SubscribeIncompleteOrder("F", ER.ER_CODE, ER.ER_ID, ER.ER_DIRECTION.ToString(), Convert.ToInt16(ER.ER_VOLUME_TOTAL_ORIGINAL), price, Convert.ToInt16(ER.ER_ORDER_REF), Convert.ToInt16("0"), Convert.ToInt16(ER.ER_OFFSETFLAG.Trim()), ER.ER_USER);
                }
            }

            while (_threadRunControl)
            {
                //初始化完成前,不接收实际交易
                queue_future_excuteThread.SetThreadBusy(_threadNo);

                _client.Connect();

                //状态 DISCONNECTED -> CONNECTED
                while (status != FutureTradeThreadStatus.CONNECTED)
                {
                    Thread.Sleep(10);
                }

                _client.ReqUserLogin();

                //状态 CONNECTED -> LOGIN
                while (status != FutureTradeThreadStatus.LOGIN)
                {
                    Thread.Sleep(10);
                }


                if (ERs != null)
                {
                    foreach (ER_TAOLI_TABLE ER in ERs)
                    {
                        _client.QryOrder(ER.ER_ORDER_EXCHANGE_ID, "", "", "", ER.ER_ID.PadLeft(12));
                    }
                }

                while (true)
                {
                    Thread.Sleep(10);

                    if ((DateTime.Now - GlobalHeartBeat.GetGlobalTime()).TotalMinutes > 10)
                    {
                        sublog.LogEvent("线程 :" + _threadNo.ToString() + "心跳停止 , 最后心跳 : " + GlobalHeartBeat.GetGlobalTime().ToString());
                        _threadRunControl = false;
                        break;
                    }

                    if (lastmessagetime.Second != DateTime.Now.Second)
                    {
                        KeyValuePair <string, object> message1 = new KeyValuePair <string, object>("THREAD_FUTURE_TRADE_WORKER", (object)_threadNo);
                        queue_system_status.GetQueue().Enqueue((object)message1);
                    }

                    if (queue_future_excuteThread.GetQueue(_threadNo).Count < 2)
                    {
                        queue_future_excuteThread.SetThreadFree(_threadNo);
                        status = FutureTradeThreadStatus.FREE;
                    }
                    else
                    {
                        status = FutureTradeThreadStatus.BUSY;
                    }

                    if (queue_future_excuteThread.GetQueue(_threadNo).Count > 0)
                    {
                        List <TradeOrderStruct> trades = (List <TradeOrderStruct>)queue_future_excuteThread.FutureExcuteQueue[_threadNo].Dequeue();
                        if (trades == null)
                        {
                            continue;
                        }
                        if (trades.Count > 0)
                        {
                            sublog.LogEvent("线程 :" + _threadNo.ToString() + " 执行交易数量 : " + trades.Count);
                        }

                        if (trades.Count == 0)
                        {
                            continue;
                        }

                        foreach (TradeOrderStruct order in trades)
                        {
                            CTP_CLI.CThostFtdcInputOrderField_M args = new CThostFtdcInputOrderField_M();

                            //填写委托参数

                            args.BrokerID            = CommConfig.BROKER;
                            args.InvestorID          = CommConfig.INVESTOR;
                            args.InstrumentID        = order.cSecurityCode;
                            args.Direction           = Convert.ToByte(order.cTradeDirection);
                            args.CombOffsetFlag_0    = Convert.ToByte(order.cOffsetFlag);
                            args.VolumeTotalOriginal = Convert.ToInt16(order.nSecurityAmount);
                            args.LimitPrice          = Convert.ToDouble(order.dOrderPrice);
                            args.OrderRef            = order.OrderRef.ToString();
                            args.OrderPriceType      = Convert.ToByte("50");
                            args.CombHedgeFlag_0     = Convert.ToByte('1');
                            args.MinVolume           = 1;
                            args.ContingentCondition = Convert.ToByte('1');
                            args.TimeCondition       = Convert.ToByte('3');
                            args.VolumeCondition     = Convert.ToByte('1');
                            args.UserID           = order.cUser;
                            args.ForceCloseReason = Convert.ToByte('0');
                            args.IsAutoSuspend    = 0;
                            args.UserForceClose   = 0;

                            //提交报单委托
                            //步骤完成后线程任务结束
                            //返回工作交由回调函数处理
                            _client.OrderInsert(args);

                            //创建记录
                            RecordItem item = new RecordItem();
                            item.AveragePrice        = 0;
                            item.Code                = order.cSecurityCode;
                            item.CombOffsetFlag      = Convert.ToInt16(order.cOffsetFlag);
                            item.OrderRef            = order.OrderRef;
                            item.OrderStatus         = 0;
                            item.OrderSysID          = "0";
                            item.Orientation         = order.cTradeDirection;
                            item.Price               = Convert.ToDecimal(order.dOrderPrice);
                            item.Status              = TradeDealStatus.ORDERING;
                            item.StrategyId          = order.belongStrategy;
                            item.Type                = "1";
                            item.VolumeTotalOriginal = item.VolumeTotal = Convert.ToInt32(order.nSecurityAmount);
                            item.VolumeTraded        = 0;
                            item.User                = order.cUser;


                            TradeRecord.GetInstance().CreateOrder(order.OrderRef, item);
                        }
                    }
                }
            }
        }
示例#27
0
        /// <summary>
        /// 预处理线程启动
        /// </summary>
        private static void ThreadProc()
        {
            log.LogEvent("交易预处理线程开始执行");


            while (true)
            {
                Thread.Sleep(10);

                /*****************************
                 * 生成交易List之前的例行工作
                 * **************************/

                #region 策略生成交易队列
                List <TradeOrderStruct> tos = PreTradeModule.instance.DeQueue();


                if (tos != null)
                {
                    log.LogEvent("来自策略的交易数:" + tos.Count.ToString());

                    if (tos.Count == 0)
                    {
                        continue;
                    }

                    string user       = tos[0].cUser;
                    string strategyid = tos[0].belongStrategy;

                    //风控检测
                    string result = string.Empty;
                    bool   brisk  = riskmonitor.RiskDetection(user, tos, out result);


                    //DBAccessLayer.AddRiskRecord(user, result, strategyid, "00", 0, 0, "0");

                    //List<RISK_TABLE> risks = DBAccessLayer.GetRiskRecord(user);

                    //int count = 0;

                    //if (risks.Count > 0)
                    //{
                    //    List<TMRiskInfo> riskinfos = new List<TMRiskInfo>();

                    //    foreach (RISK_TABLE risk in risks)
                    //    {
                    //        count++;
                    //        if (count > 10) break;
                    //        riskinfos.Add(new TMRiskInfo() { code = risk.code, hand = risk.amount.ToString(), price = risk.price.ToString(), orientation = risk.orientation, time = risk.time.ToString(), strategy = "00", user = risk.alias, errinfo = risk.err });
                    //    }


                    //    TradeMonitor.Instance.updateRiskList(user, JsonConvert.SerializeObject(riskinfos), JsonConvert.SerializeObject(riskmonitor.riskPara));

                    //}



                    if (!brisk)
                    {
                        continue;
                    }

                    //获取到新的list
                    List <TradeOrderStruct> stocks_sh = (from item in tos where item.cExhcnageID == ExchangeID.SH select item).OrderBy(i => i.cOrderLevel).ToList();

                    List <TradeOrderStruct> stocks_sz = (from item in tos where item.cExhcnageID == ExchangeID.SZ select item).OrderBy(i => i.cOrderLevel).ToList();

                    List <TradeOrderStruct> future = (from item in tos where item.cExhcnageID == ExchangeID.CF select item).OrderBy(i => i.cOrderLevel).ToList();

                    //将新的list推送到对应的线程控制器
                    #region 交易送入队列

                    List <TradeOrderStruct> unit = new List <TradeOrderStruct>();

                    #region SH股票交易送入队列
                    if (stocks_sh.Count > 0)
                    {
                        log.LogEvent("上海交易所入队交易数量:" + stocks_sh.Count.ToString());

                        foreach (TradeOrderStruct stu in stocks_sh)
                        {
                            TradeOrderStruct _tos = CreateNewTrade(stu);
                            unit.Add(_tos);

                            if (unit.Count == 15)
                            {
                                List <TradeOrderStruct> _li = CreateList(unit);
                                unit.Clear();

                                lock (QUEUE_SH_TRADE.GetQueue().SyncRoot)
                                {
                                    QUEUE_SH_TRADE.GetQueue().Enqueue((object)_li);
                                }
                            }
                        }

                        if (unit.Count != 0)
                        {
                            List <TradeOrderStruct> _li = CreateList(unit);
                            unit.Clear();

                            lock (QUEUE_SH_TRADE.GetQueue().SyncRoot)
                            {
                                QUEUE_SH_TRADE.GetQueue().Enqueue((object)_li);
                            }
                        }
                    }
                    #endregion

                    #region SZ股票交易送入队列
                    if (stocks_sz.Count > 0)
                    {
                        log.LogEvent("深圳交易所入队交易数量:" + stocks_sz.Count.ToString());
                        foreach (TradeOrderStruct stu in stocks_sz)
                        {
                            TradeOrderStruct _tos = CreateNewTrade(stu);
                            unit.Add(_tos);

                            if (unit.Count == 15)
                            {
                                List <TradeOrderStruct> _li = CreateList(unit);
                                unit.Clear();

                                lock (QUEUE_SZ_TRADE.GetQueue().SyncRoot)
                                {
                                    QUEUE_SZ_TRADE.GetQueue().Enqueue((object)_li);
                                }

                                unit.Clear();
                            }
                        }

                        if (unit.Count != 0)
                        {
                            List <TradeOrderStruct> _li = CreateList(unit);
                            unit.Clear();

                            lock (QUEUE_SZ_TRADE.GetQueue().SyncRoot)
                            {
                                QUEUE_SZ_TRADE.GetQueue().Enqueue((object)_li);
                            }

                            //unit.Clear();
                        }
                    }
                    #endregion

                    #region 期货交易送入队列
                    if (future.Count > 0)
                    {
                        log.LogEvent("期货交易入队交易数量:" + future.Count.ToString());
                        foreach (TradeOrderStruct stu in future)
                        {
                            TradeOrderStruct _tos = stu;
                            unit.Add(_tos);

                            List <TradeOrderStruct> _li = CreateList(unit);
                            unit.Clear();

                            if (_li.Count == 15)
                            {
                                lock (QUEUE_FUTURE_TRADE.GetQueue().SyncRoot)
                                {
                                    QUEUE_FUTURE_TRADE.GetQueue().Enqueue((object)_li);
                                }
                            }

                            if (_li.Count != 0)
                            {
                                lock (QUEUE_FUTURE_TRADE.GetQueue().SyncRoot)
                                {
                                    QUEUE_FUTURE_TRADE.GetQueue().Enqueue((object)_li);
                                }
                            }
                        }
                    }
                    #endregion

                    #endregion
                }

                #endregion

                #region 交易管理界面直接发起交易
                List <MakeOrder> mos = PreTradeModule.instance.DeQueueMonitorOrder();


                if (mos != null)
                {
                    if (mos.Count == 0)
                    {
                        continue;
                    }

                    if (mos.Count > 1)
                    {
                        GlobalTestLog.LogInstance.LogEvent("批量交易已到交易预处理模块,数量:" + mos.Count + "时间:" + DateTime.Now.ToString("yyyy-MM-dd hh-mm-ss") + " : " + DateTime.Now.Millisecond.ToString());
                    }
                    else if (mos.Count == 1)
                    {
                        GlobalTestLog.LogInstance.LogEvent("单笔交易已到交易预处理模块,数量:" + mos.Count + "时间:" + DateTime.Now.ToString("yyyy-MM-dd hh-mm-ss") + " : " + DateTime.Now.Millisecond.ToString());
                    }

                    List <TradeOrderStruct> _TradeList = new List <TradeOrderStruct>();
                    string User = String.Empty;
                    foreach (MakeOrder mo in mos)
                    {
                        User = mo.User;
                        TradeOrderStruct _tradeUnit = new TradeOrderStruct()
                        {
                            cExhcnageID         = mo.exchangeId,
                            cSecurityCode       = mo.cSecurityCode,
                            nSecurityAmount     = mo.nSecurityAmount,
                            dOrderPrice         = mo.dOrderPrice,
                            cTradeDirection     = mo.cTradeDirection,
                            cOffsetFlag         = mo.offsetflag,
                            SecurityName        = String.Empty,
                            cOrderPriceType     = "0",
                            cUser               = mo.User,
                            cSecurityType       = mo.cSecurityType,
                            cOrderLevel         = "1",
                            cOrderexecutedetail = "0",
                            belongStrategy      = mo.belongStrategy,
                            OrderRef            = REQUEST_ID.ApplyNewID()
                        };

                        if (mo.cSecurityType.ToUpper() == "F")
                        {
                            _tradeUnit.cTradeDirection = ((_tradeUnit.cTradeDirection == "0") ? "48" : "49");
                            _tradeUnit.cOffsetFlag     = (_tradeUnit.cOffsetFlag == "0" ? "48" : "49");
                        }
                        if (mo.cSecurityType.ToUpper() == "S")
                        {
                            _tradeUnit.cTradeDirection = ((_tradeUnit.cTradeDirection == "0") ? "1" : "2");
                        }

                        UserRequestMap.GetInstance().AddOrUpdate(_tradeUnit.OrderRef, mo.User, (key, oldValue) => oldValue = mo.User);

                        _TradeList.Add(_tradeUnit);
                    }

                    //风控检测
                    string result = string.Empty;
                    //bool brisk = riskmonitor.RiskDetection(User, _TradeList, out result);
                    bool brisk = true;
                    if (_TradeList.Count > 10)
                    {
                        GlobalTestLog.LogInstance.LogEvent("交易经过风控,时间:" + DateTime.Now.ToString("yyyy-MM-dd hh-mm-ss") + " : " + DateTime.Now.Millisecond.ToString() + "数量:" + _TradeList.Count.ToString());
                    }

                    if (!brisk)
                    {
                        continue;
                    }

                    log.LogEvent("来自交易管理页面的交易");

                    List <TradeOrderStruct> shTradeList     = new List <TradeOrderStruct>();
                    List <TradeOrderStruct> szTradeList     = new List <TradeOrderStruct>();
                    List <TradeOrderStruct> futureTradeList = new List <TradeOrderStruct>();
                    foreach (TradeOrderStruct tradeUnit in _TradeList)
                    {
                        if (tradeUnit.cSecurityType.ToUpper() == "S")
                        {
                            if (tradeUnit.cExhcnageID.ToUpper() == ExchangeID.SH)
                            {
                                shTradeList.Add(tradeUnit);
                                continue;
                            }
                            else if (tradeUnit.cExhcnageID.ToUpper() == ExchangeID.SZ)
                            {
                                szTradeList.Add(tradeUnit);
                                continue;
                            }
                        }
                        else if (tradeUnit.cSecurityType.ToUpper() == "F")
                        {
                            futureTradeList.Add(tradeUnit);
                        }
                    }

                    if (shTradeList.Count > 0)
                    {
                        lock (QUEUE_SH_TRADE.GetQueue().SyncRoot)
                        {
                            QUEUE_SH_TRADE.GetQueue().Enqueue((object)shTradeList);
                        }
                    }
                    if (szTradeList.Count > 0)
                    {
                        lock (QUEUE_SZ_TRADE.GetQueue().SyncRoot)
                        {
                            QUEUE_SZ_TRADE.GetQueue().Enqueue((object)szTradeList);
                        }
                    }
                    if (futureTradeList.Count > 0)
                    {
                        lock (QUEUE_FUTURE_TRADE.GetQueue().SyncRoot)
                        {
                            QUEUE_FUTURE_TRADE.GetQueue().Enqueue((object)futureTradeList);
                        }
                    }

                    List <RISK_TABLE> risks = DBAccessLayer.GetRiskRecord(User);

                    int count = 0;

                    if (risks.Count > 0)
                    {
                        List <TMRiskInfo> riskinfos = new List <TMRiskInfo>();

                        foreach (RISK_TABLE risk in risks)
                        {
                            count++;
                            if (count > 10)
                            {
                                break;
                            }
                            riskinfos.Add(new TMRiskInfo()
                            {
                                code = risk.code, hand = risk.amount.ToString(), price = risk.price.ToString(), orientation = risk.orientation, time = risk.time.ToString(), strategy = "00", user = risk.alias, errinfo = risk.err
                            });
                        }


                        TradeMonitor.Instance.updateRiskList(User, JsonConvert.SerializeObject(riskinfos), JsonConvert.SerializeObject(riskmonitor.riskPara));
                    }
                }

                #endregion

                if (DateTime.Now.Second != PreTradeModule.isRunning.Second)
                {
                    KeyValuePair <string, object> message1 = new KeyValuePair <string, object>("THREAD_PRE_TRADE", (object)true);
                    queue_system_status.GetQueue().Enqueue((object)message1);
                    PreTradeModule.isRunning = DateTime.Now;
                }
            }
        }
        /// <summary>a
        /// 创建新的策略实例
        /// </summary>
        /// <param name="para"></param>
        /// <param name="orderList"></param>
        private void RecruitNewWorker(object v)
        {
            //创建新的策略实例
            StrategyWorker newWorker = new StrategyWorker();

            if (v is OPENCREATE)
            {
                //开仓策略
                OPENCREATE value = (OPENCREATE)v;
                newWorker.open_para       = new OPENPARA();
                newWorker.open_para.INDEX = value.INDEX;
                newWorker.open_para.OP    = value.OP;
                Dictionary <string, int> oli = new Dictionary <string, int>();

                foreach (var item in value.orderli.Split('\n'))
                {
                    if (item.Trim() == string.Empty)
                    {
                        continue;
                    }
                    else
                    {
                        oli.Add(item.Split(';')[1] + item.Split(';')[0], Convert.ToInt32(item.Split(';')[2]));
                    }
                }

                newWorker.LiStockOrder = oli;

                newWorker.bAllow = false;
                newWorker.bRun   = false;
                newWorker.CT     = value.CT;

                newWorker.HD = value.HD;
                newWorker.StrategyInstanceID = value.basic.ID;
                newWorker.User = value.basic.USER;

                newWorker.Type = "OPEN";

                Dictionary <string, double> wli = new Dictionary <string, double>();

                foreach (var item in value.weightli.Split('\n'))
                {
                    if (item.Trim() == String.Empty)
                    {
                        continue;
                    }
                    else
                    {
                        wli.Add(item.Split(';')[1] + item.Split(';')[0], Convert.ToDouble(item.Split(';')[2]));
                    }
                }

                newWorker.open_para.WeightList = wli;

                if (DBAccessLayer.DBEnable)
                {
                    DBAccessLayer.InsertSGOPEN((object)value);
                }
            }
            else
            {
                //平仓策略
                CLOSECREATE value = (CLOSECREATE)v;
                newWorker.close_para         = new CLOSEPARA();
                newWorker.User               = value.basic.USER;
                newWorker.StrategyInstanceID = value.basic.ID;
                newWorker.CT            = value.CT;
                newWorker.close_para.SP = value.SP;
                newWorker.HD            = value.HD;
                Dictionary <string, int>    oli   = new Dictionary <string, int>();
                Dictionary <string, double> weili = new Dictionary <string, double>();

                foreach (var item in value.POSITION.Split('\n'))
                {
                    if (item.Trim() == string.Empty)
                    {
                        continue;
                    }
                    else
                    {
                        oli.Add(item.Split(';')[1] + item.Split(';')[0], Convert.ToInt32(item.Split(';')[2]));
                    }
                }


                newWorker.LiStockOrder          = oli;
                newWorker.close_para.WeightList = weili;
                newWorker.Type = "CLOSE";

                newWorker.bAllow = false;
                newWorker.bRun   = false;

                newWorker.close_para.SP     = value.SP;
                newWorker.close_para.COE    = value.COSTOFEQUITY;
                newWorker.close_para.SD     = value.STOCKDIVIDENDS;
                newWorker.close_para.SA     = value.STOCKALLOTMENT;
                newWorker.close_para.PE     = value.PROSPECTIVEARNINGS;
                newWorker.close_para.BASIS  = value.OB;
                newWorker.close_para.Charge = value.CHARGE;

                if (DBAccessLayer.DBEnable)
                {
                    DBAccessLayer.InsertSGCLOSE((object)value);
                    DBAccessLayer.UpdateSGOPENStatus(value.Open_STR_ID, 4);
                }
            }


            try
            {
                WorkersStratus.Add(newWorker.StrategyInstanceID, 0);
                Workers.Add(newWorker.StrategyInstanceID, newWorker);

                newWorker.RUN();

                //向行情模块添加消息列表映射
                MarketInfo.SetStrategyQueue(new KeyValuePair <String, Queue>(newWorker.StrategyInstanceID, newWorker.GetRefQueue()));
            }
            catch (Exception ex)
            {
                DBAccessLayer.LogSysInfo("StrategyMonitorClass-RecruitNewWorker", ex.ToString());
                GlobalErrorLog.LogInstance.LogEvent(ex.ToString() + ":StrategyMonitorClass.cs" + ":" + newWorker.StrategyInstanceID);
            }
        }
        /// <summary>
        /// 策略管理线程工作函数
        /// 任务:
        /// 1. 获取用户请求队列中的指令
        /// 2. 巡检工作组中订阅列表修改
        /// </summary>
        private void ThreadProc()
        {
            while (true)
            {
                if ((DateTime.Now - GlobalHeartBeat.GetGlobalTime()).TotalMinutes > 15)
                {
                    log.LogEvent("系统供血模块无响应,策略管理线程即将停止!");
                    KeyValuePair <string, object> message2 = new KeyValuePair <string, object>("THREAD_STRATEGY_MANAGEMENT", (object)false);
                    queue_system_status.GetQueue().Enqueue((object)message2);
                    //管理策略线程退出前,对正在运行的工作策略执行“绞杀”,并维护数据库记录,这个过程称为 grace broken
                    break;
                }


                while (QCommands.Count > 0)
                {
                    object obj = QCommands.Dequeue();

                    #region 指令类型判断
                    if (obj is OPENCREATE)
                    {
                        RecruitNewWorker(obj);
                    }
                    else if (obj is OPENMODIFY)
                    {
                        UpdateWorker(obj);
                    }
                    else if (obj is OPENALLOW)
                    {
                        OPENALLOW value = (OPENALLOW)obj;
                        AllowOperater((object)obj);
                    }
                    else if (obj is OPENRUN)
                    {
                        OPENRUN value = (OPENRUN)obj;
                        RunOperater((object)value);
                    }
                    else if (obj is OPENDELETE)
                    {
                        DeleteWorker(obj);
                    }
                    else if (obj is CLOSECREATE)
                    {
                        RecruitNewWorker(obj);
                    }
                    else if (obj is CLOSEMODIFY)
                    {
                        UpdateWorker(obj);
                    }
                    else if (obj is CLOSERUN)
                    {
                        CLOSERUN value = (CLOSERUN)obj;
                        RunOperater((object)value);
                    }
                    else if (obj is CLOSEALLOW)
                    {
                        CLOSEALLOW value = (CLOSEALLOW)obj;
                        AllowOperater((object)obj);
                    }
                    else if (obj is CLOSEDELETE)
                    {
                        DeleteWorker(obj);
                    }
                    else
                    {
                        continue;
                    }

                    #endregion
                }


                if (DateTime.Now.Second % 2 == 0)
                {
                    if (_logUpdateTime.Second != DateTime.Now.Second)
                    {
                        _logUpdateTime = DateTime.Now;

                        KeyValuePair <string, object> message1 = new KeyValuePair <string, object>("THREAD_STRATEGY_MANAGEMENT", (object)true);
                        queue_system_status.GetQueue().Enqueue((object)message1);

                        int count_0  = (from item in WorkersStratus where item.Value == 0 select item).Count();
                        int count_12 = (from item in WorkersStratus where item.Value == 1 || item.Value == 2 select item).Count();


                        if (DateTime.Now.Second % 31 == 0 || DateTime.Now.Second % 32 == 0)
                        {
                            log.LogEvent("运行策略: " + (count_0 + count_12).ToString() + "\n问题或结束策略: " + count_0.ToString());
                        }

                        Dictionary <String, StrategyInfo> strategyInfo = new Dictionary <string, StrategyInfo>();
                        foreach (var item in Workers)
                        {
                            WorkersStratus[item.Key] = item.Value.Status;
                            item.Value.Status        = 0;

                            StrategyInfo info = new StrategyInfo()
                            {
                                BelongUser         = item.Value.User,
                                StrType            = item.Value.Type,
                                Contract           = item.Value.CT,
                                Status             = item.Value.Status,
                                StrategyInstanceID = item.Value.StrategyInstanceID,
                                HandNum            = item.Value.HD,
                                SubscribeList      = new List <string>(item.Value.SubscribeList.Count)
                            };

                            strategyInfo.Add(item.Value.StrategyInstanceID, info);

                            foreach (string s in item.Value.SubscribeList)
                            {
                                info.SubscribeList.Add(s);
                            }
                        }

                        int count = Workers.Count;
                        KeyValuePair <string, object> message2 = new KeyValuePair <string, object>("STRATEGY_N", (object)count);
                        queue_system_status.GetQueue().Enqueue((object)message2);

                        Dictionary <string, StrategyInfo> value = new Dictionary <string, StrategyInfo>();
                        foreach (KeyValuePair <string, StrategyWorker> pair in Workers)
                        {
                            StrategyInfo info = new StrategyInfo()
                            {
                                BelongUser         = pair.Value.User,
                                Contract           = pair.Value.CT,
                                HandNum            = pair.Value.HD,
                                Status             = pair.Value.Status,
                                StrategyInstanceID = pair.Value.StrategyInstanceID,
                                StrType            = pair.Value.Type,
                                SubscribeList      = pair.Value.SubscribeList
                            };
                            value.Add(pair.Value.StrategyInstanceID, info);
                        }
                        KeyValuePair <string, object> message3 = new KeyValuePair <string, object>("STRATEGY_P", (object)value);
                        queue_system_status.GetQueue().Enqueue((object)message3);

                        KeyValuePair <string, object> message4 = new KeyValuePair <string, object>("THREAD_STRATEGY_WORKER", (object)WorkersStratus);
                        queue_system_status.GetQueue().Enqueue((object)message4);
                    }
                }

                //巡检工作组订阅内容修改
                try
                {
                    CheckSubscribeUpdate();
                }
                catch (Exception ex) { DBAccessLayer.LogSysInfo("StrategyMonitorClass-ThreadProc", ex.ToString()); ex.ToString(); }

                Thread.Sleep(10);
            }
        }
示例#30
0
 public void Update(int OrderRef, RecordItem Record)
 {
     this.AddOrUpdate(OrderRef, Record, (key, oldValue) => oldValue = Record);
     DBAccessLayer.DeleteERRecord((object)OrderRef);
     DBAccessLayer.CreateFutureDLRecord((object)Record);
 }