/// <summary> /// Validates the e record. /// </summary> /// <param name="eRecord">The e record.</param> /// <returns></returns> private static string ValidateERecord(ERecord eRecord) { if (eRecord != null) { //FIXED-NOV15 - Check null condition for eRecord else return string.Empty return(string.Format(CultureInfo.InvariantCulture, "{0} {1}", ValidateClaimId(eRecord.ClaimId), ValidateSecondaryDiagnosis(eRecord.SecondaryDiagnosisCodes))); } return(string.Empty); }
/// <summary> /// Gets the e record line. /// </summary> /// <param name="eRecordData">The e record data.</param> /// <returns></returns> public string GetERecordLine(ERecord eRecordData) { string eRecord = string.Empty; ValidationErrors = ValidateERecord(eRecordData); if (eRecordData != null && string.IsNullOrEmpty(ValidationErrors.Trim())) { eRecord = BuildERecordString(eRecordData); } return(eRecord); }
public string RefundTrade(String orderRef) { if (orderRef == null || orderRef == string.Empty) { return("非法委托编号!"); } int reference = int.Parse(orderRef.Trim()); ERecord srecord = EntrustRecord.GetEntrustRecord(reference); if (srecord != null) { //找到股票委托交易信息 RefundStruct refund = new RefundStruct() { Direction = srecord.Direction.Trim(), ExchangeId = srecord.ExchangeId.Trim(), OffSetFlag = "0", SecurityCode = srecord.Code, SecurityType = "S", OrderRef = srecord.OrderRef.ToString(), OrderSysId = srecord.SysOrderRef }; queue_refund_thread.GetQueue().Enqueue(refund); return("success"); } RecordItem frecord = TradeRecord.GetInstance().getOrderInfo(reference); if (frecord != null) { //找到期货委托交易信息 RefundStruct refund = new RefundStruct() { Direction = frecord.Orientation, ExchangeId = String.Empty, OffSetFlag = frecord.CombOffsetFlag.ToString(), SecurityCode = frecord.Code, SecurityType = "F", OrderRef = frecord.OrderRef.ToString(), OrderSysId = frecord.OrderSysID }; queue_refund_thread.GetQueue().Enqueue(refund); return("success"); } return("未找到委托对应交易!"); }
public void ValidateERecordIfSecondaryDiagnosisCodesIsNull() { //Arrange _target = new ERecordLogic(); ERecord eRecordRaw = new ERecord { ClaimId = "1.04.2", AdmitDiagnosisCode = "1.04.2", PrincipalDiagnosisCode = "1.04.2", SecondaryDiagnosisCodes = null }; //Act string actual = _target.GetERecordLine(eRecordRaw); //Assert Assert.AreEqual(actual, ""); }
public void ValidateERecordIfClaimIdIsInvalid() { _target = new ERecordLogic(); ERecord eRecordRaw = new ERecord { ClaimId = "1.04.2260000000000000", AdmitDiagnosisCode = "1256", PrincipalDiagnosisCode = "3568", SecondaryDiagnosisCodes = new List <string> { "4444", "5555", "9981", "0381", "2918", "92", "30080", "5190", "5648", "7638", "30081", "5191", "5649", "7639" } }; string actual = _target.GetERecordLine(eRecordRaw); Assert.AreEqual(actual, ""); }
public void BuildERecordIfSecondaryDiagnosisCodeIsNull() { //Arrange ERecord eRecordRaw = new ERecord { ClaimId = "1.04.2", AdmitDiagnosisCode = "1.04.2", PrincipalDiagnosisCode = "1.04.2", SecondaryDiagnosisCodes = null }; const string expected = "E1.04.2 1042 1042 "; //Act string actual = ERecordLogic.BuildERecordString(eRecordRaw); //Assert Assert.AreEqual(actual, expected); }
public static string BuildERecordString(ERecord eRecord) { StringBuilder eRecordString = new StringBuilder(Constants.Stringlength); if (eRecord != null) { eRecordString = eRecordString.Append(Constants.ERecordString); eRecordString = eRecordString.Append(BuildClaimId(eRecord.ClaimId)); eRecordString = eRecordString.Append(BuildAdminDiagnosis(eRecord.AdmitDiagnosisCode)); eRecordString = eRecordString.Append(BuildPrincipalDiagnosis(eRecord.PrincipalDiagnosisCode)); eRecordString = eRecordString.Append(BuildSecondaryDiagnosis(eRecord.SecondaryDiagnosisCodes)); eRecordString = eRecordString.Append(BuildUnUsed()); if (eRecordString.Length == Constants.Stringlength) { return(eRecordString.ToString()); } return(string.Format(CultureInfo.InvariantCulture, "{0,-200}", eRecordString)); } return(string.Empty); }
public void BuildERecordIfPrincipalDiagnosisCodeIsNull() { //Arrange ERecord eRecordRaw = new ERecord { ClaimId = "1.04.2", AdmitDiagnosisCode = "1.04.2", PrincipalDiagnosisCode = null, SecondaryDiagnosisCodes = new List <string> { "4444", "5555", "9981", "0381", "2918", "92", "30080", "5190", "5648", "7638", "30081", "5191", "5649", "7639" } }; const string expected = "E1.04.2 1042 4444 5555 9981 0381 2918 92 30080 5190 5648 7638 30081 5191 5649 7639 "; //Act string actual = ERecordLogic.BuildERecordString(eRecordRaw); //Assert Assert.AreEqual(actual, expected); }
public void BuildERecordStringTestForNone() { //Arrange ERecord eRecordRaw = new ERecord { ClaimId = "422379168", AdmitDiagnosisCode = "1256", PrincipalDiagnosisCode = "NONE", SecondaryDiagnosisCodes = new List <string> { "4444", "5555", "9981", "0381", "2918", "9223", "30080", "5190", "5648", "7638" } }; const string expected = "E422379168 1256 4444 5555 9981 0381 2918 9223 30080 5190 5648 7638 "; //Act string actual = ERecordLogic.BuildERecordString(eRecordRaw); //Assert Assert.AreEqual(expected, actual); }
public void ValidateERecordIfClaimIdIsNull() { //Arrange _target = new ERecordLogic(); ERecord eRecordRaw = new ERecord { ClaimId = null, AdmitDiagnosisCode = "1.04.2", PrincipalDiagnosisCode = "1.04.2", SecondaryDiagnosisCodes = new List <string> { "4444", "5555", "9981", "0381", "2918", "92", "30080", "5190", "5648", "7638", "30081", "5191", "5649", "7639" } }; const string expected = "E 1042 1042 4444 5555 9981 0381 2918 92 30080 5190 5648 7638 30081 5191 5649 7639 "; //Act string actual = _target.GetERecordLine(eRecordRaw); //Assert Assert.AreEqual(actual, expected); }
public void BuildERecordStringTestForSecondaryDiagnosisCodeIfCountIsGreaterThenFourteen() { //Arrange ERecord eRecordRaw = new ERecord { ClaimId = "422379168", AdmitDiagnosisCode = "1256", PrincipalDiagnosisCode = "3568", SecondaryDiagnosisCodes = new List <string> { "4444789", "5555", "9981", "0381", "2918", "9223256354", "30080", "5190", "5648", "7638", "30081", "5191", "5649", "7639", "4444789", "5555", "9981", "0381", "2918", "9223256354", "30080", "5190", "5648", "7638", "30081", "5191", "5649", "7639" } }; const string expected = "E422379168 1256 3568 4444789 5555 9981 0381 2918 9223256330080 5190 5648 7638 30081 5191 5649 7639 "; //Act string actual = ERecordLogic.BuildERecordString(eRecordRaw); //Assert Assert.AreEqual(expected, actual); }
public void BuildERecordStringForGeaterThan() { //Arrange ERecord eRecordRaw = new ERecord { ClaimId = "1.04.223213265525888536", AdmitDiagnosisCode = "1.04.2", PrincipalDiagnosisCode = "1.04.2", SecondaryDiagnosisCodes = new List <string> { "4444", "5555", "9981", "0381", "2918", "92", "30080", "5190", "5648", "7638", "30081", "5191", "5649", "7639" } }; const string expected = "E1.04.2232132655258885361042 1042 4444 5555 9981 0381 2918 92 30080 5190 5648 7638 30081 5191 5649 7639 "; //Act string actual = ERecordLogic.BuildERecordString(eRecordRaw); //Assert Assert.AreEqual(expected, actual); }
public void ValidateERecordIfSecondaryDiagnosisLengthIsInvalid() { //Arrange _target = new ERecordLogic(); ERecord eRecordRaw = new ERecord { ClaimId = "422379168", AdmitDiagnosisCode = "1256", PrincipalDiagnosisCode = "3568", SecondaryDiagnosisCodes = new List <string> { "4444000", "5555", "9981", "0381", "2918", "92", "30080", "5190", "5648", "7638", "30081", "5191", "5649", "7639", "256363" } }; const string expected = "E422379168 1256 3568 4444000 5555 9981 0381 2918 92 30080 5190 5648 7638 30081 5191 5649 7639 "; //Act string actual = _target.GetERecordLine(eRecordRaw); //Assert Assert.AreEqual(actual, expected); }
public void GetERecordStringForGeaterThan200Length() { //Arrange _target = new ERecordLogic(); ERecord eRecordRaw = new ERecord { ClaimId = "1.04.223213265525888536", AdmitDiagnosisCode = "1.04.2", PrincipalDiagnosisCode = "1.04.2", SecondaryDiagnosisCodes = new List <string> { "4444", "5555", "9981", "0381", "2918", "92", "30080", "5190", "5648", "7638", "30081", "5191", "5649", "7639" } }; const int expected = 200; //Act int actual = _target.GetERecordLine(eRecordRaw).Length; //Assert Assert.AreNotEqual(expected, actual); }
/// <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(); }