public bool BatchTradeTest(TradeOrderStruct_M[] mytraderoder, int nSize, out QueryEntrustOrderStruct_M[] myEntrust, out string Errormsg) { myEntrust = new QueryEntrustOrderStruct_M[nSize]; for (int i = 0; i < mytraderoder.Count(); i++) { Thread.Sleep(1000); if (mytraderoder[i] == null) { break; } myEntrust[i] = new QueryEntrustOrderStruct_M(); myEntrust[i].Code = mytraderoder[i].SecurityCode; myEntrust[i].Direction = mytraderoder[i].TradeDirection; myEntrust[i].ExchangeID = mytraderoder[i].ExchangeID; myEntrust[i].OrderPrice = mytraderoder[i].OrderPrice; myEntrust[i].SecurityType = mytraderoder[i].SecurityType; Random rando = new Random(); myEntrust[i].OrderSysID = "T" + rando.Next(1, 99999).ToString(); } Errormsg = "success"; return(true); }
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); } } }
public bool SingleTradeTest(TradeOrderStruct_M mytraderoder, out QueryEntrustOrderStruct_M myEntrust, out string Errormsg) { myEntrust = new QueryEntrustOrderStruct_M(); myEntrust.Code = mytraderoder.SecurityCode; myEntrust.Direction = mytraderoder.TradeDirection; myEntrust.ExchangeID = mytraderoder.ExchangeID; myEntrust.OrderPrice = mytraderoder.OrderPrice; myEntrust.SecurityType = mytraderoder.SecurityType; Random rando = new Random(); myEntrust.OrderSysID = "T" + rando.Next(1, 99999).ToString(); Errormsg = "success"; return true; }
public bool SingleTradeTest(TradeOrderStruct_M mytraderoder, out QueryEntrustOrderStruct_M myEntrust, out string Errormsg) { myEntrust = new QueryEntrustOrderStruct_M(); myEntrust.Code = mytraderoder.SecurityCode; myEntrust.Direction = mytraderoder.TradeDirection; myEntrust.ExchangeID = mytraderoder.ExchangeID; myEntrust.OrderPrice = mytraderoder.OrderPrice; myEntrust.SecurityType = mytraderoder.SecurityType; Random rando = new Random(); myEntrust.OrderSysID = "T" + rando.Next(1, 99999).ToString(); Errormsg = "success"; return(true); }
public managedBargainreturnstruct QueryTrader(QueryEntrustOrderStruct_M queryEntrust) { managedBargainreturnstruct bargain = new managedBargainreturnstruct(); bargain.bargain_money = 0; bargain.bargain_price = 0; bargain.bargain_time = DateTime.Now.Hour.ToString() + DateTime.Now.Minute + DateTime.Now.Second; bargain.bargain_no = queryEntrust.OrderRef; bargain.direction = queryEntrust.Direction; bargain.OrderStatus = Convert.ToSByte(EntrustStatus.Dealed); bargain.OrderSysID = queryEntrust.OrderSysID; bargain.OrderType = queryEntrust.SecurityType; bargain.Security_code = queryEntrust.Code; bargain.Security_name = "TEST CODE"; bargain.stock_amount = 0; bargain.strategyId = queryEntrust.StrategyId; return(bargain); }
public managedEntrustreturnstruct QueryEntrust(QueryEntrustOrderStruct_M queryEntrust) { managedEntrustreturnstruct entrust = new managedEntrustreturnstruct(); entrust.cCancelTime = String.Empty; entrust.cInsertDate = DateTime.Now.Year.ToString() + DateTime.Now.Month + DateTime.Now.Day; entrust.cInsertTime = DateTime.Now.Hour.ToString() + DateTime.Now.Minute + DateTime.Now.Second; entrust.cOrderStatus = ((int)(EntrustStatus.Dealed)); entrust.cOrderSysID = queryEntrust.OrderSysID; entrust.cOrderType = queryEntrust.SecurityType; entrust.frozen_amount = 0; entrust.frozen_money = 0; entrust.nVolumeTotal = 0; entrust.nVolumeTotalOriginal = 0; entrust.nVolumeTraded = 0; entrust.security_name = "TEST CODE"; entrust.withdraw_ammount = 0; return entrust; }
public managedEntrustreturnstruct QueryEntrust(QueryEntrustOrderStruct_M queryEntrust) { managedEntrustreturnstruct entrust = new managedEntrustreturnstruct(); entrust.cCancelTime = String.Empty; entrust.cInsertDate = DateTime.Now.Year.ToString() + DateTime.Now.Month + DateTime.Now.Day; entrust.cInsertTime = DateTime.Now.Hour.ToString() + DateTime.Now.Minute + DateTime.Now.Second; entrust.cOrderStatus = ((int)(EntrustStatus.Dealed)); entrust.cOrderSysID = queryEntrust.OrderSysID; entrust.cOrderType = queryEntrust.SecurityType; entrust.frozen_amount = 0; entrust.frozen_money = 0; entrust.nVolumeTotal = 0; entrust.nVolumeTotalOriginal = 0; entrust.nVolumeTraded = 0; entrust.security_name = "TEST CODE"; entrust.withdraw_ammount = 0; return(entrust); }
public bool BatchTradeTest(TradeOrderStruct_M[] mytraderoder, int nSize, out QueryEntrustOrderStruct_M[] myEntrust, out string Errormsg) { myEntrust = new QueryEntrustOrderStruct_M[nSize]; for (int i = 0; i < mytraderoder.Count(); i++) { Thread.Sleep(1000); if (mytraderoder[i] == null) break; myEntrust[i] = new QueryEntrustOrderStruct_M(); myEntrust[i].Code = mytraderoder[i].SecurityCode; myEntrust[i].Direction = mytraderoder[i].TradeDirection; myEntrust[i].ExchangeID = mytraderoder[i].ExchangeID; myEntrust[i].OrderPrice = mytraderoder[i].OrderPrice; myEntrust[i].SecurityType = mytraderoder[i].SecurityType; Random rando = new Random(); myEntrust[i].OrderSysID = "T" + rando.Next(1, 99999).ToString(); } Errormsg = "success"; return true; }
private void threadproc() { while (true) { Thread.Sleep(1); if ((DateTime.Now - GlobalHeartBeat.GetGlobalTime()).TotalMinutes > 5) { log.LogEvent("由于供血不足,委托查询线程即将退出。"); break; } //单次循环最多查询100个交易的委托情况 int maxCount = 100; if (!_classTradeStock.getConnectStatus()) { _classTradeStock.Init(login, ErrorMsg); } if (lastmessagetime.Second != DateTime.Now.Second) { KeyValuePair <string, object> message1 = new KeyValuePair <string, object>("THREAD_ENTRUST_WORKER", (object)(DateTime.Now)); queue_system_status.GetQueue().Enqueue((object)message1); lastmessagetime = DateTime.Now; } while (maxCount > 0 && queue_query_entrust.GetQueueNumber() > 0) { maxCount--; //获取新委托 QueryEntrustOrderStruct_M item = (QueryEntrustOrderStruct_M)queue_query_entrust.GetQueue().Dequeue(); string err = string.Empty; //查询委托及获取实例 managedEntrustreturnstruct ret = new managedEntrustreturnstruct(); //ordersysid 首字母 为 'T' 是测试交易 if (item.OrderSysID.Length > 0 && item.OrderSysID[0] == 'T') { var temps = test.QueryEntrust(item); ret = temps; } else { var temps = _classTradeStock.QueryEntrust(item, err); if (temps.Length == 0) { continue; } ret = temps.ToList()[0]; } if (ret == null) { continue; } OrderViewItem order = new OrderViewItem( item.OrderRef.ToString(), ret.cOrderSysID, ret.cSecurity_code, item.Direction.ToString(), "NA", ret.nVolumeTotalOriginal.ToString(), ret.nVolumeTotal.ToString(), item.OrderPrice.ToString(), GetStatusWord(ret.cOrderStatus), ret.cInsertTime); if (!UserRequestMap.GetInstance().Keys.Contains(item.OrderRef)) { UserRequestMap.GetInstance().AddOrUpdate(item.OrderRef, item.User, (key, oldValue) => oldValue = item.User); } String USERNAME = UserRequestMap.GetInstance()[item.OrderRef]; TradeMonitor.Instance.updateOrderList(USERNAME, order); //目前仅考虑 1对1 返回的情况,不考虑出现1对多 ,类似基金交易的情况 //将委托变动返回更新数据库 if (DBAccessLayer.DBEnable == true) { //更新数据,记录入数据库 ThreadPool.QueueUserWorkItem(new WaitCallback(DBAccessLayer.UpdateERRecord), (object)(ret)); //修改委托缓存数据 EntrustRecord.ModifyEntrustPosition(item.OrderRef, Convert.ToInt32(ret.frozen_amount), Convert.ToDouble(ret.frozen_money)); //此处判断,相应代码的委托是否完成 //此处逻辑需要待返回报文内容确认后修改 //测试使用 if ((ret.cOrderStatus.ToString() != ((int)(EntrustStatus.Dealed)).ToString()) && (!(ret.cOrderStatus.ToString() == ((int)EntrustStatus.Canceled).ToString() && ret.nVolumeTotal == 0))) { queue_query_entrust.GetQueue().Enqueue((object)item); continue; } //委托已经完成,进入成交状态查询 managedBargainreturnstruct bargin = new managedBargainreturnstruct(); if (item.OrderSysID.Length > 0 && item.OrderSysID[0] == 'T') { bargin = test.QueryTrader(item); } else { var retbargin = _classTradeStock.QueryTrader(item, err).ToList(); //将查询信息记录成交表 if (retbargin.Count > 0) { bargin = retbargin.ToList()[0]; } } bargin.strategyId = item.StrategyId; bargin.direction = item.Direction; bargin.User = USERNAME; bargin.OrderType = Convert.ToSByte("49"); if (ret.cOrderStatus.ToString() == ((int)(EntrustStatus.Dealed)).ToString()) { bargin.OrderMark = Deal_Status.DEAL; } else if (ret.cOrderStatus.ToString() == ((int)EntrustStatus.Canceled).ToString()) { bargin.OrderMark = Deal_Status.CANCELED; } else if (ret.nVolumeTotal == 0) { bargin.OrderMark = Deal_Status.PARTIALDEAL; } ThreadPool.QueueUserWorkItem(new WaitCallback(DBAccessLayer.CreateDLRecord), (object)bargin); EntrustRecord.DeleteEntrustRecord(item.OrderRef); ThreadPool.QueueUserWorkItem(new WaitCallback(DBAccessLayer.DeleteERRecord), (object)(item.OrderRef)); //更新持仓列表 if (ret.nVolumeTraded != 0) { //需要修改数据 //仅存在成交记录时才更改持仓 ThreadPool.QueueUserWorkItem(new WaitCallback(DBAccessLayer.UpdateCCRecords), (object)bargin); } } } } }
public managedBargainreturnstruct QueryTrader(QueryEntrustOrderStruct_M queryEntrust) { managedBargainreturnstruct bargain = new managedBargainreturnstruct(); bargain.bargain_money = 0; bargain.bargain_price = 0; bargain.bargain_time = DateTime.Now.Hour.ToString() + DateTime.Now.Minute + DateTime.Now.Second; bargain.bargain_no = queryEntrust.OrderRef; bargain.direction = queryEntrust.Direction; bargain.OrderStatus = Convert.ToSByte(EntrustStatus.Dealed); bargain.OrderSysID = queryEntrust.OrderSysID; bargain.OrderType = queryEntrust.SecurityType; bargain.Security_code = queryEntrust.Code; bargain.Security_name = "TEST CODE"; bargain.stock_amount = 0; bargain.strategyId = queryEntrust.StrategyId; return bargain; }
/// <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); queue_system_status.GetQueue().Enqueue((object)message1); lastmessagetime = DateTime.Now; } //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> trades = (List<TradeOrderStruct>)queue_stock_excuteThread.StockExcuteQueues[_threadNo].Dequeue(); 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++; } if (DebugMark == true) { test.BatchTradeTest(tradesUnit, trades.Count, out entrustUnit, out s); } else { entrustUnit = _classTradeStock.BatchTrade(tradesUnit, trades.Count, s); } if (entrustUnit != null && entrustUnit.ToList().Count() > 0) { foreach (QueryEntrustOrderStruct_M unit in entrustUnit.ToList()) { if (unit == null) continue; if (unit.OrderSysID != null && unit.OrderSysID != String.Empty && unit.OrderSysID != "0" ) { entrustorli.Add(unit); } } } } 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; if (DebugMark == true) { test.SingleTradeTest(tradesUnit, out entrustUnit, out s); } else { _classTradeStock.SingleTrade(tradesUnit, entrustUnit, s); } if (entrustUnit.OrderSysID != null && entrustUnit.OrderSysID != String.Empty && entrustUnit.OrderSysID != "0") { entrustorli.Add(entrustUnit); } } //********************************* // 交易成功后执行的特殊处理 // 交易生成委托存入数据库,并将委托送往查询成交线程 //********************************* 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; ThreadPool.QueueUserWorkItem(new WaitCallback(DBAccessLayer.CreateERRecord), (object)(entrustorli[i])); queue_query_entrust.GetQueue().Enqueue((object)entrustorli[i]); } } } } //线程结束 Thread.CurrentThread.Abort(); }
/// <summary> /// 股票总控线程函数 /// </summary> private static void StockThreadProc() { log.LogEvent("股票退货线程启动!"); 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); //标记心跳包发送时间 DateTime _markedTime = DateTime.Now; DateTime lastmessage = DateTime.Now; string ErrorMsg = string.Empty; //初始化通信 //功能1 _classTradeStock.Init(login, ErrorMsg); while (true) { Thread.Sleep(10); if ((DateTime.Now - GlobalHeartBeat.GetGlobalTime()).TotalMinutes > 10) { log.LogEvent("股票退货线程心跳停止 , 最后心跳 : " + GlobalHeartBeat.GetGlobalTime().ToString()); KeyValuePair <string, object> message1 = new KeyValuePair <string, object>("THREAD_Stock_Refund_Control_MONITOR", (object)false); queue_system_status.GetQueue().Enqueue((object)message1); break; } if (lastmessage.Second != DateTime.Now.Second) { KeyValuePair <string, object> message1 = new KeyValuePair <string, object>("THREAD_Stock_Refund_Control_MONITOR", (object)true); queue_system_status.GetQueue().Enqueue((object)message1); lastmessage = DateTime.Now; } if (_markedTime.Minute != DateTime.Now.Minute) { //发送心跳包 //功能2 //_stockTradeAPI.heartBeat(); _classTradeStock.HeartBeat(); _markedTime = DateTime.Now; } if (queue_stock_refund_thread.GetQueueNumber() > 0) { RefundStruct refundItem = (RefundStruct)queue_stock_refund_thread.GetQueue().Dequeue(); QueryEntrustOrderStruct_M item = new QueryEntrustOrderStruct_M() { Code = refundItem.SecurityCode, Direction = Convert.ToInt32(refundItem.Direction), ExchangeID = (refundItem.ExchangeId == "SH" ? "1" : "2"), OrderPrice = 0, //撤单不用考虑价格 OrderRef = Convert.ToInt32(refundItem.OrderRef), OrderSysID = refundItem.OrderSysId, SecurityType = (sbyte)115, StrategyId = string.Empty //撤单不考虑策略编号 }; if (!_classTradeStock.getConnectStatus()) { _classTradeStock.Init(login, ErrorMsg); } String err = String.Empty; //发出撤单交易 _classTradeStock.CancelTrade(item, err); log.LogEvent("股票撤单已发出,本地编号:" + refundItem.OrderRef + " 系统编号:" + refundItem.OrderSysId); } } }
/// <summary> /// 更新委托信息 /// </summary> /// <param name="volumeTraded"></param> /// <param name="OrderRef"></param> /// <param name="OrderSysID"></param> /// <param name="StatusMsg"></param> /// <param name="OrderStatus"></param> /// <param name="VolumeTotal"></param> /// <param name="ExchangeID">退货使用</param> public void UpdateOrder(int volumeTraded, int OrderRef, String OrderSysID, String StatusMsg, int OrderStatus, int VolumeTotal, String ExchangeID) { RecordItem _record = new RecordItem(); _record = this.GetOrAdd(OrderRef, _record); _record.VolumeTraded = volumeTraded; _record.VolumeTotal = VolumeTotal; _record.ErrMsg = StatusMsg; _record.OrderStatus = OrderStatus; _record.OrderSysID = OrderSysID; _record.ExchangeID = ExchangeID; _record.Status = TradeDealStatus.ORDERING; if (_record.OrderSysID.Trim() == "0" && _record.OrderSysID != String.Empty) { QueryEntrustOrderStruct_M record = new QueryEntrustOrderStruct_M() { Code = _record.Code, User = _record.User, OrderRef = _record.OrderRef, Direction = Convert.ToInt32(_record.Orientation), ExchangeID = ExchangeID, OrderPrice = Convert.ToDouble(_record.Price), OrderSysID = _record.OrderSysID.Trim(), SecurityType = Convert.ToSByte(_record.Type), StrategyId = _record.StrategyId, OffsetFlag = _record.CombOffsetFlag, Amount = _record.VolumeTotalOriginal }; ThreadPool.QueueUserWorkItem(new WaitCallback(DBAccessLayer.CreateFutureERRecord), ((object)record)); } //若交易已撤单 或者 全部成交则标记该委托完成 if (OrderStatus == 53 || _record.VolumeTotalOriginal == _record.VolumeTraded) { _record.OrderTime_Completed = DateTime.Now; _record.Status = TradeDealStatus.ORDERCOMPLETED; } this.AddOrUpdate(OrderRef, _record, (key, oldValue) => oldValue = _record ); if (UserRequestMap.GetInstance().Count == 0) { return; } String USERNAME = string.Empty; try { USERNAME = UserRequestMap.GetInstance()[OrderRef]; } catch (Exception ex) { DBAccessLayer.LogSysInfo("TradeAdditionalClass->UpdateOrder", ex.ToString()); } OrderViewItem order = new OrderViewItem(_record.OrderRef.ToString(), _record.OrderSysID, _record.Code, _record.Orientation, _record.CombOffsetFlag.ToString(), _record.VolumeTotalOriginal.ToString(), _record.VolumeTotal.ToString(), _record.Price.ToString(), _record.ErrMsg, _record.OrderTime_Start.ToString()); TradeMonitor.Instance.updateOrderList(USERNAME, order); if (_record.Status == TradeDealStatus.ORDERCOMPLETED) { CompletedTradeRecord.GetInstance().Update(_record.OrderRef, _record); } }
/// <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(); }