/// <summary> /// 数据检查,查看是否需要根据历史成交进行补充。 /// </summary> /// <param name="st"></param> /// <param name="et"></param> /// <param name="o"></param> /// <param name="dt"></param> /// <param name="ErrInfo"></param> /// <param name="result"></param> /// <param name="ClientID"></param> private static void CheckDataIntegrity(DateTime st, DateTime et, 券商 o, DataTable dt, StringBuilder ErrInfo, StringBuilder result, int ClientID) { #region 成交金额修正 if (dt.Columns.Contains("成交金额")) { foreach (DataRow row in dt.Rows) { row["成交金额"] = Math.Abs(CommonUtils.GetDecimal(row["成交金额"])); } } else if (dt.Columns.Contains("成交数量") && dt.Columns.Contains("成交价格")) { dt.Columns.Add("成交金额"); foreach (DataRow row in dt.Rows) { row["成交金额"] = Math.Abs(CommonUtils.GetDecimal(row["成交价格"]) * CommonUtils.GetDecimal(row["成交数量"])); } } #endregion #region 买卖标志修正 if (dt.Columns.Contains("买卖标志") && dt.Rows.Count > 0 && Regex.IsMatch(dt.Rows[0]["买卖标志"] + "", "[012]")) { foreach (DataRow row in dt.Rows) { row["买卖标志"] = GetTradeSymble(row); } } else if (!dt.Columns.Contains("买卖标志") && !HasBuySaleColumn(dt) && dt.Columns.Contains("备注")) { dt.Columns.Add("买卖标志"); foreach (DataRow row in dt.Rows) { row["买卖标志"] = Regex.Match(row["备注"] + "", "买|卖").Value; } } #endregion List <string> VIPColumns = new List <string>() { "证券代码", "证券名称", "成交价格", "成交数量", "成交金额" }; var needAddColumn = VIPColumns.Where(_ => !dt.Columns.Contains(_)).ToList(); if (needAddColumn.Count > 0) { TdxApi.QueryHistoryData(ClientID, 1, st.ToString("yyyyMMdd"), et.ToString("yyyyMMdd"), result, ErrInfo); if (ErrInfo.Length == 0) { var dt1 = CommonUtils.ChangeDataStringToTable(result.ToString()); needAddColumn = needAddColumn.Where(_ => dt1.Columns.Contains(_)).ToList(); AddDataColumnFromHisTrade(dt, dt1, needAddColumn); } } }
/// <summary> /// 通达信接口-历史数据查询(默认查询交割单) /// </summary> /// <param name="st">开始时间</param> /// <param name="et">结束时间</param> /// <param name="o">券商</param> /// <param name="historyDataType">表示查询信息的种类,0历史委托 1历史成交 2交割单</param> /// <returns></returns> public static DataTable QueryHisData(DateTime st, DateTime et, 券商 o, int historyDataType = 2, bool originalData = false) { DataTable dt = null; StringBuilder ErrInfo = new StringBuilder(256); //StringBuilder result = new StringBuilder(1024 * 1024); queryHisResult.Clear(); if (o.营业部代码 == 8888) { if (DateTime.Today.DayOfWeek == DayOfWeek.Sunday || DateTime.Today.DayOfWeek == DayOfWeek.Saturday || DateTime.Now.Hour <= 9 || DateTime.Now.Hour >= 15) { o.营业部代码 = 24; o.IP = "124.74.242.150"; o.Port = 443; } } var ClientID = TdxApi.Logon(o.IP, o.Port, o.版本号, o.营业部代码, o.登录帐号, o.交易帐号, o.TradePsw, o.CommunicatePsw, ErrInfo); if (ErrInfo.Length > 0) { CommonUtils.Log(string.Format("通达信接口登录失败, 组合号:{0}, 起始日期:{1},结束日期:{2} ,错误信息:{3}", o.称, st.ToString(), et.ToString(), ErrInfo.ToString())); } else { DateTime searchEndDate = et; if (StrangeGroups.Contains(o.称) && st == et) { searchEndDate = et.AddDays(1); } TdxApi.QueryHistoryData(ClientID, historyDataType, st.ToString("yyyyMMdd"), searchEndDate.ToString("yyyyMMdd"), queryHisResult, ErrInfo); if (ErrInfo.Length == 0) { dt = CommonUtils.ChangeDataStringToTable(queryHisResult.ToString()); if (!originalData && historyDataType == 2) { FilteTableData(o, st, et, dt); CheckDataIntegrity(st, et, o, dt, ErrInfo, queryHisResult, ClientID); RepairData(o, dt); } } else { CommonUtils.Log("通达信接口查询失败,错误信息" + ErrInfo.ToString()); } } TdxApi.Logoff(ClientID); return(dt); }