/// <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); }
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); }
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); } } }
/// <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); } } }
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"); } }
/// <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()); } }
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()); } }
/// <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)); }
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()); } }
/// <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)); }
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; } } }
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()); } }
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()); } }
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()); } }
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()); } }
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()); } }
//向客户端传递参数 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); } } }
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)); }
/// <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); }
/// <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); }
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()); }
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); } } } }
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); }
/// <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); } } } } }
/// <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); } }
public void Update(int OrderRef, RecordItem Record) { this.AddOrUpdate(OrderRef, Record, (key, oldValue) => oldValue = Record); DBAccessLayer.DeleteERRecord((object)OrderRef); DBAccessLayer.CreateFutureDLRecord((object)Record); }