private static TradeOrderStruct CreateNewTrade(TradeOrderStruct tos) { TradeOrderStruct t = new TradeOrderStruct(); t.cExhcnageID = tos.cExhcnageID; t.cOffsetFlag = tos.cOffsetFlag; t.cOrderexecutedetail = tos.cOrderexecutedetail; t.cOrderLevel = tos.cOrderLevel; t.cOrderPriceType = tos.cOrderPriceType; t.cSecurityCode = tos.cSecurityCode; t.cSecurityType = tos.cSecurityType; t.cTradeDirection = tos.cTradeDirection; t.dOrderPrice = tos.dOrderPrice; t.nSecurityAmount = tos.nSecurityAmount; t.SecurityName = tos.SecurityName; t.belongStrategy = tos.belongStrategy; t.OrderRef = tos.OrderRef; t.cUser = tos.cUser; return(t); }
private static TradeOrderStruct_M CreateTradeUnit(TradeOrderStruct unit) { TradeOrderStruct_M _sorder = new TradeOrderStruct_M(); _sorder.ExchangeID = (unit.cExhcnageID.Length != 0) ? unit.cExhcnageID : "0"; _sorder.OffsetFlag = (unit.cOffsetFlag.Length != 0) ? Convert.ToSByte(unit.cOffsetFlag) : Convert.ToSByte("0"); _sorder.OrderExecutedDetail = (sbyte)0; _sorder.OrderLevel = (unit.cOrderLevel.Length != 0) ? Convert.ToSByte(unit.cOrderLevel) : Convert.ToSByte("0"); _sorder.OrderPrice = unit.dOrderPrice; _sorder.OrderPriceType = (unit.cOrderPriceType.Length != 0) ? Convert.ToSByte(unit.cOrderPriceType) : Convert.ToSByte("0"); _sorder.SecurityAmount = (int)(unit.nSecurityAmount); _sorder.SecurityCode = (unit.cSecurityCode.Length != 0) ? unit.cSecurityCode : "0"; _sorder.SecurityType = (unit.cSecurityType.Length != 0) ? (unit.cSecurityType == "115" ? (sbyte)115 : (sbyte)102) : (sbyte)115; if ((unit.cTradeDirection == "1") || (unit.cTradeDirection == "49")) { _sorder.TradeDirection = 49; } else { _sorder.TradeDirection = 50; } //_sorder.TradeDirection = Convert.ToSByte(Convert.ToInt16(unit.cTradeDirection)); //if (unit.cTradeDirection == "0") { _sorder.TradeDirection = 49; } //else if (unit.cTradeDirection == "1") { _sorder.TradeDirection = 50; } //else { _sorder.TradeDirection = 49; } return(_sorder); }
/// <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> /// 执行交易线程处理逻辑 /// 包含功能: /// 1. 连接股票交易所(上海,深圳) /// 2. 心跳包发送/接收 /// 3. 发送交易,等待响应 /// </summary> private static void StockTradeSubThreadProc(object para) { MCStockLib.managedStockClass _classTradeStock = new managedStockClass(); MCStockLib.managedLogin login = new managedLogin(CommConfig.Stock_ServerAddr, CommConfig.Stock_Port, CommConfig.Stock_Account, CommConfig.Stock_BrokerID, CommConfig.Stock_Password, CommConfig.Stock_InvestorID); string ErrorMsg = string.Empty; bool DebugMark = false; //测试交易标志 StockTradeTest test = new StockTradeTest(); //测试类 //令该线程为前台线程 Thread.CurrentThread.IsBackground = true; TradeParaPackage _tpp = (TradeParaPackage)para; //当前线程编号 int _threadNo = _tpp._threadNo; sublog.LogEvent("线程 :" + _threadNo.ToString() + " 开始执行"); //用作发送心跳包的时间标记 DateTime _markedTime = DateTime.Now; DateTime lastmessagetime = DateTime.Now; //初始化通信 //功能1 _classTradeStock.Init(login, ErrorMsg); while (true) { Thread.Sleep(10); if ((DateTime.Now - GlobalHeartBeat.GetGlobalTime()).TotalMinutes > 10) { sublog.LogEvent("线程 :" + _threadNo.ToString() + "心跳停止 , 最后心跳 : " + GlobalHeartBeat.GetGlobalTime().ToString()); break; } //Thread.CurrentThread.stat if (_markedTime.Minute != DateTime.Now.Minute) { //发送心跳包 //功能2 //_stockTradeAPI.heartBeat(); _classTradeStock.HeartBeat(); _markedTime = DateTime.Now; } if (lastmessagetime.Second != DateTime.Now.Second) { KeyValuePair <string, object> message1 = new KeyValuePair <string, object>("THREAD_STOCK_TRADE_WORKER", (object)_threadNo); try { queue_system_status.GetQueue().Enqueue((object)message1); lastmessagetime = DateTime.Now; } catch { //do nothing } } //if (!_classTradeStock.getConnectStatus()) //{ // _classTradeStock.Init(login, ErrorMsg); //} if (queue_stock_excuteThread.GetQueue(_threadNo).Count < 2) { queue_stock_excuteThread.SetThreadFree(_threadNo); } if (queue_stock_excuteThread.GetQueue(_threadNo).Count > 0) { List <TradeOrderStruct> Queuetrades = (List <TradeOrderStruct>)queue_stock_excuteThread.StockExcuteQueues[_threadNo].Dequeue(); List <TradeOrderStruct> trades = new List <TradeOrderStruct>(); int eni = 0; while (true) { try { TradeOrderStruct trade = Queuetrades[eni]; trades.Add(new TradeOrderStruct() { belongStrategy = trade.belongStrategy, cExhcnageID = trade.cExhcnageID, cOffsetFlag = trade.cOffsetFlag, cOrderexecutedetail = trade.cOrderexecutedetail, cOrderLevel = trade.cOrderLevel, cOrderPriceType = trade.cOrderPriceType, cSecurityCode = trade.cSecurityCode, cSecurityType = trade.cSecurityType, cTradeDirection = trade.cTradeDirection, cUser = trade.cUser, dOrderPrice = trade.dOrderPrice, nSecurityAmount = trade.nSecurityAmount, OrderRef = trade.OrderRef, SecurityName = trade.SecurityName }); eni++; } catch { break; } } Guid tradeuuid = Guid.NewGuid(); if (trades == null || trades.Count == 0) { continue; } if (trades[0].cUser == DebugMode.TestUser) { DebugMark = true; } else { DebugMark = false; } if (trades.Count > 0) { sublog.LogEvent("线程 :" + _threadNo.ToString() + " 执行交易数量 : " + trades.Count); } if (!_classTradeStock.getConnectStatus()) { _classTradeStock.Init(login, ErrorMsg); } //根据消息队列中发来的消息数量判断调用的接口 //当内容大于1 ,调用批量接口 //当内容等于1, 调用单笔接口 queue_stock_excuteThread.SetUpdateTime(_threadNo); List <QueryEntrustOrderStruct_M> entrustorli = new List <QueryEntrustOrderStruct_M>(); if (trades.Count > 1) { //trades Random seed = new Random(); sublog.LogEvent("线程 :" + _threadNo.ToString() + "进入执行环节 , 忙碌状态: " + queue_stock_excuteThread.GetThreadIsAvailiable(_threadNo)); TradeOrderStruct_M[] tradesUnit = new TradeOrderStruct_M[15]; int i = 0; QueryEntrustOrderStruct_M[] entrustUnit = new QueryEntrustOrderStruct_M[15]; string s = string.Empty; foreach (TradeOrderStruct unit in trades) { tradesUnit[i] = CreateTradeUnit(unit); i++; } string user = trades[0].cUser; //GlobalTestLog.LogInstance.LogEvent("线程 :" + _threadNo.ToString() + " 发送交易: " + tradeuuid.ToString() + " 时间: " + DateTime.Now.ToString("yyyy-MM-dd hh-mm-ss") + " : " + DateTime.Now.Millisecond.ToString()); if (DebugMark == true) { test.BatchTradeTest(tradesUnit, trades.Count, out entrustUnit, out s); } else { entrustUnit = _classTradeStock.BatchTrade(tradesUnit, trades.Count, s); } //GlobalTestLog.LogInstance.LogEvent("线程 :" + _threadNo.ToString() + " 收到交易回报: " + tradeuuid.ToString() + " 时间: " + DateTime.Now.ToString("yyyy-MM-dd hh-mm-ss") + " : " + DateTime.Now.Millisecond.ToString()); if (entrustUnit != null && entrustUnit.ToList().Count() > 0) { i = -1; foreach (QueryEntrustOrderStruct_M unit in entrustUnit.ToList()) { i++; if (unit == null) { continue; } if (unit.OrderSysID != null && unit.OrderSysID != String.Empty && unit.OrderSysID != "0") { entrustorli.Add(unit); } else { //委托失败处理 GlobalErrorLog.LogInstance.LogEvent("获取委托号失败!用户: " + user + ",代码:" + unit.Code); } if (unit.Direction == 49) { //清除风控冷冻金额 //只有股票买入,才需要移除风控列表 accountMonitor.UpdateRiskFrozonAccount(user, unit.Code, tradesUnit[i].SecurityAmount * (-1), tradesUnit[i].SecurityAmount * tradesUnit[i].OrderPrice * (-1), "S", "0"); } } } } else if (trades.Count == 1) { //trades Random seed = new Random(); TradeOrderStruct_M tradesUnit = CreateTradeUnit(trades[0]); QueryEntrustOrderStruct_M entrustUnit = new QueryEntrustOrderStruct_M(); string s = string.Empty; string user = trades[0].cUser; //GlobalTestLog.LogInstance.LogEvent("发送交易: " + tradeuuid.ToString() + " 时间: " + DateTime.Now.ToString("yyyy-MM-dd hh-mm-ss") + " : " + DateTime.Now.Millisecond.ToString()); if (DebugMark == true) { test.SingleTradeTest(tradesUnit, out entrustUnit, out s); } else { _classTradeStock.SingleTrade(tradesUnit, entrustUnit, s); } //GlobalTestLog.LogInstance.LogEvent("收到交易回报: " + tradeuuid.ToString() + " 时间: " + DateTime.Now.ToString("yyyy-MM-dd hh-mm-ss") + " : " + DateTime.Now.Millisecond.ToString()); if (entrustUnit.OrderSysID != null && entrustUnit.OrderSysID != String.Empty && entrustUnit.OrderSysID != "0") { entrustorli.Add(entrustUnit); } else { //委托失败处理 GlobalErrorLog.LogInstance.LogEvent("获取委托号失败!用户: " + user + ",代码:" + tradesUnit.SecurityCode); } if (entrustUnit.Direction.ToString() == TradeOrientationAndFlag.StockTradeDirectionBuy) { //清除风控冷冻金额,只有买入需要清除风控列表 accountMonitor.UpdateRiskFrozonAccount(user, tradesUnit.SecurityCode, tradesUnit.SecurityAmount * (-1), tradesUnit.SecurityAmount * tradesUnit.OrderPrice * (-1), "S", tradesUnit.TradeDirection.ToString()); } } //********************************* // 交易成功后执行的特殊处理 // 交易生成委托存入数据库,并将委托送往查询成交线程 //********************************* if (trades.Count != 0) { //存入数据库 if (entrustorli.Count() == 0) { continue; } for (int i = 0; i < trades.Count; i++) { entrustorli[i].Code = trades[i].cSecurityCode; entrustorli[i].StrategyId = trades[0].belongStrategy; entrustorli[i].Direction = Convert.ToInt32(trades[i].cTradeDirection); entrustorli[i].OrderRef = Convert.ToInt32(trades[i].OrderRef); entrustorli[i].OrderPrice = trades[i].dOrderPrice; entrustorli[i].SecurityType = (sbyte)115; entrustorli[i].User = trades[i].cUser; ThreadPool.QueueUserWorkItem(new WaitCallback(DBAccessLayer.CreateERRecord), (object)(entrustorli[i])); queue_query_entrust.GetQueue().Enqueue((object)entrustorli[i]); ERecord record = new ERecord() { UserName = trades[i].cUser, Amount = trades[i].nSecurityAmount, Code = trades[i].cSecurityCode, ExchangeId = trades[i].cExhcnageID, OrderPrice = trades[i].dOrderPrice, OrderRef = trades[i].OrderRef, StrategyNo = trades[i].belongStrategy, SysOrderRef = entrustorli[i].OrderSysID, Direction = trades[i].cTradeDirection }; EntrustRecord.AddEntrustRecord(record); } } } } //线程结束 Thread.CurrentThread.Abort(); }
/// <summary> /// 线程工作函数 /// </summary> private void _threadProc() { while (!bRun) { //标记最后扫描时间,交付上级判断 RunningMark = DateTime.Now; //尚未运行的策略,直接丢弃队列中新的行情 while (_marketQueue.Count > 0) { DeQueueInfo(); } //标记线程状态为正在空转 Status = 1; Thread.Sleep(10); } if (DBAccessLayer.DBEnable) { DBAccessLayer.UpdateStrategyStatusRecord(StrategyInstanceID, 1); } while (!breaklabel) { /**** * 循环工作: * 1. 更新行情信息 * 2. 计算中间参数 * 3. 判断运行条件 * 4. 生成交易列表 * ****/ //标记最后扫描时间,交付上级判断 RunningMark = DateTime.Now; if (Status == 1) { if (DBAccessLayer.DBEnable) { DBAccessLayer.UpdateStrategyStatusRecord(StrategyInstanceID, 2); } } if (bRun) { //标记线程状态为正在运行 Status = 2; Thread.Sleep(1); //策略实例运算 List <managedMarketInforStruct> infos = new List <managedMarketInforStruct>(); List <MarketData> dataList = new List <MarketData>(); while (_marketQueue.Count > 0) { MarketData d = (MarketData)DeQueueInfo(); if (d == null) { Thread.Sleep(10); continue; } dataList.Add(d); } foreach (MarketData data in dataList) { managedMarketInforStruct info = new managedMarketInforStruct(); info.dAskPrice = new double[10]; info.dAskVol = new double[10]; info.dBidPrice = new double[10]; info.dBidVol = new double[10]; if (data.AskPrice != null) { for (int i = 0; i < data.AskPrice.Count(); i++) { info.dAskPrice[i] = Convert.ToDouble(data.AskPrice[i]) / 10000; info.dAskVol[i] = Convert.ToDouble(data.AskVol[i]); info.dBidPrice[i] = Convert.ToDouble(data.BidPrice[i]) / 10000; info.dBidVol[i] = Convert.ToDouble(data.BidVol[i]); } } managedsecurityindex index = new managedsecurityindex(); index.cSecurity_code = data.Code; info.msecurity = index; info.security_name = data.Code; info.nTime = data.Time / 1000; info.nStatus = data.Status; info.nPreClose = Convert.ToDouble(data.PreClose) / 10000; info.dLastPrice = Convert.ToDouble(data.Match) / 10000; info.dHighLimited = Convert.ToDouble(data.HighLimited) / 10000; info.dLowLimited = Convert.ToDouble(data.LowLimited) / 10000; info.exchangeID = data.WindCode.Split('.')[1]; if (data.Status == 68) { info.bstoped = true; } switch (data.IOPV) { case 0: { index.cSecuritytype = 115; break; } case 1: { index.cSecuritytype = 102; break; } case 2: { index.cSecuritytype = 105; break; } } info.LastUpdateTime = Int32.Parse(DateTime.Now.Hour.ToString().PadLeft(2, '0') + DateTime.Now.Minute.ToString().PadLeft(2, '0') + DateTime.Now.Second.ToString().PadLeft(2, '0')); //MarketDelayCalculation.cal(data.Time, 3); if (data.Status == 68 || data.Status == 66) { info.bstoped = true; } else { info.bstoped = false; } info.nInfotLag = info.LastUpdateTime - info.nTime; infos.Add(info); } if (infos.Count > 0) { if (Type == "OPEN") { DateTime d1 = DateTime.Now; m_strategy_open.updateSecurityInfo(infos.ToArray(), infos.Count); d1 = DateTime.Now; m_strategy_open.calculateSimTradeStrikeAndDelta(); } else { m_strategy_close.updateSecurityInfo(infos.ToArray(), infos.Count); m_strategy_close.calculateSimTradeStrikeAndDelta(); } } else { continue; } } if (bRun && bAllow) { bool _reached = false; if (Type == "OPEN") { _reached = m_strategy_open.isOpenPointReached(); } else { _reached = m_strategy_close.isOpenPointReached(); } // _reached = true; //测试使用,注意删除 // 生成交易列表 if (_reached) { List <managedTraderorderstruct> ol = (Type == "OPEN") ? m_strategy_open.getTradeList().ToList() : m_strategy_close.getTradeList().ToList(); //交易列表送往交易线程下单(下单的线程,股票和期货是分开的) List <TradeOrderStruct> orderli = new List <TradeOrderStruct>(); foreach (managedTraderorderstruct item in ol) { TradeOrderStruct order = new TradeOrderStruct(); order.cExhcnageID = item.cExchangeID; order.cSecurityCode = item.cSecurity_code; order.SecurityName = item.cSecurity_code; order.nSecurityAmount = item.nSecurity_amount; order.dOrderPrice = item.dOrderprice; order.cTradeDirection = item.cTraderdirection.ToString(); order.cOffsetFlag = item.cOffsetFlag.ToString(); order.cOrderPriceType = item.cOrderPriceType.ToString(); order.cSecurityType = item.cSecuritytype.ToString(); order.cOrderLevel = item.cOrderlevel.ToString(); order.cOrderexecutedetail = item.cOrderexecutedetail.ToString(); order.belongStrategy = StrategyInstanceID; order.OrderRef = REQUEST_ID.ApplyNewID(); order.cUser = User; orderli.Add(order); UserRequestMap.GetInstance().AddOrUpdate(order.OrderRef, User, (key, oldvalue) => oldvalue = User); } if (DBAccessLayer.DBEnable == true) { string json = Json.Encode(orderli); DBAccessLayer.InsertORDERLIST(StrategyInstanceID, json); } //提交风控模块 //下单到交易预处理模块 queue_prd_trade.GetQueue().Enqueue((object)orderli); if (DBAccessLayer.DBEnable) { //写入数据库,策略状态为已下单 DBAccessLayer.UpdateStrategyStatusRecord(StrategyInstanceID, 3); DBAccessLayer.UpdateSGOPENStatus(StrategyInstanceID, 3); } // 列表只会生成一次 breaklabel = true; } } //获取中间显示参数 //gettaderargs getshowstatus if (Type == "OPEN") { string status = m_strategy_open.getshowstatus(); List <String> statusLi = status.Split(' ').ToList(); status = string.Empty; foreach (string i in statusLi) { if (i.Trim() != string.Empty) { status += (i + "&"); } } PushStrategyInfo.Instance.UpdateStrategyInfo(StrategyInstanceID, status); } else { string status = m_strategy_close.getshowstatus(); List <string> statusLi = status.Split(' ').ToList(); status = string.Empty; foreach (string i in statusLi) { if (i.Trim() != string.Empty) { status += (i + "&"); } } PushStrategyInfo.Instance.UpdateStrategyInfo(StrategyInstanceID, status); } Thread.Sleep(1); } }