/// <summary> /// 读取主力合约映射文件 /// </summary> /// <param name="strFile">映射文件</param> /// <param name="fmgr">期货管理器</param> private static void ReadRefIndex(string strFile, FutureManager fmgr) { FileStream fs = null; try { #region fs = new FileStream(strFile, FileMode.Open, FileAccess.Read, FileShare.Read); StreamReader reader = new StreamReader(fs, Encoding.UTF8); while (!reader.EndOfStream) { string strline = reader.ReadLine(); // = 分割 string[] linelist = strline.Split(new char[] { '=' }, StringSplitOptions.RemoveEmptyEntries); if (linelist.Length == 2) { fmgr.AddRefFuture(linelist[0].Trim(), linelist[1].Trim()); } } #endregion } catch (Exception) { fmgr.Clear(); } if (fs != null) { fs.Close(); } }
public void Merge(FutureManager fmgr) { foreach (Future stk in fmgr.AllInstruments) { if (!_allInstruments.ContainsKey(stk.ID)) { _allInstruments.Add(stk.ID, stk); } } foreach (Exchange exchange in fmgr.AllExchanges) { if (!_allExchanges.ContainsKey(exchange.ExchangeID)) { _allExchanges.Add(exchange.ExchangeID, exchange); } } foreach (FutureProduct product in fmgr.AllProducts) { if (!_allProducts.ContainsKey(product.ProductID)) { _allProducts.Add(product.ProductID, product); } } }
/// <summary> /// 读取文件 /// </summary> /// <param name="strDir">目录</param> /// <param name="mgr"></param> /// <param name="futurelist"></param> /// <param name="blive"></param> /// <returns></returns> public static bool Read( string strDir, FutureManager mgr, List <string> futurelist, bool blive) { try { mgr.Clear(); string strIndexFile = strDir + "\\" + IndexFile; if (File.Exists(strIndexFile)) { ReadRefIndex(strIndexFile, mgr); } string strFile = strDir + "\\" + FileName; if (!File.Exists(strFile)) { return(false); } XmlDocument doc = new XmlDocument(); doc.Load(strFile); foreach (XmlNode node in doc.DocumentElement.ChildNodes) { XmlElement tagNode = node as XmlElement; if (tagNode == null) { continue; } if (tagNode.Name != ExchangeTag) { continue; } Exchange exchange = new Exchange(); FutureExchangeXml.Get(tagNode, exchange, mgr, futurelist, blive); if (exchange.ExchangeID != "") { mgr.AddExchange(exchange); } } //Check(mgr); return(true); } catch (Exception ex) { ILog logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); logger.Error("读取期货品种失败", ex); mgr.Clear(); } return(false); }
/// <summary> /// 载入股票 /// </summary> /// <param name="strDir">配置目录</param> /// <param name="instrIdlist">品种代码表</param> /// <param name="market">市场</param> /// <param name="isLive">是否实盘</param> /// <returns></returns> public bool Load( string strDir, List <string> instrIdlist, EnumMarket market, bool isLive) { _tfMgr.LoadData(strDir + "\\TradingFrame.xml"); switch (market) { case EnumMarket.期货: #region FutureManager fmgr = new FutureManager(); if (isLive) { if (!FutureFile.Read(strDir, fmgr, instrIdlist, isLive)) { Clear(); return(false); } } else { if (!FutureFile.Read(strDir, fmgr)) { Clear(); return(false); } } Merge(fmgr); return(true); #endregion } return(false); }
static void BuildRef(FutureManager mgr, string exchangeid, string productid) { List <Future> lstfuture = mgr.GetFutures(exchangeid, productid); List <IndexFuture> lstidx = new List <IndexFuture>(); foreach (Future future in lstfuture) { if (future.FutureType == EnumFutureType.Reference) { string futureid = mgr.GetRealFuture(future.ID); if (futureid.Length > 0 && mgr.HasFuture(futureid)) { future.RealFuture = mgr[futureid]; } } else if (future.FutureType == EnumFutureType.Index) { lstidx.Add(future as IndexFuture); } } foreach (IndexFuture idxfuture in lstidx) { foreach (Future future in lstfuture) { if (future.FutureType == EnumFutureType.Normal) { idxfuture.Add(future); } } if (mgr.HasFuture(productid + "9999")) { idxfuture.RealFuture = mgr[productid + "9999"].RealFuture; } } }
internal static void Get( XmlElement root, FutureProduct product, FutureManager mgr, List <string> futurelist, bool blive) { product.ProductID = root.GetAttribute(IdAttr); product.ProductName = root.GetAttribute(NameAttr); if (root.HasAttribute(TradingTimeAttr)) { #region tradingtime string strtradingtime = root.GetAttribute(TradingTimeAttr); string[] strlist = strtradingtime.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); int icount = strlist.Length / 2; TimeSpan tsvalue; for (int i = 0; i < icount; ++i) { TimeSlice slice = new TimeSlice(); if (!TimeSpan.TryParse(strlist[i * 2], out tsvalue)) { product.AllSlice.Clear(); throw new Exception("配置文件future.xml格式不对, Product/tradingtime解析出错"); } slice.BeginTime = tsvalue; if (!TimeSpan.TryParse(strlist[i * 2 + 1], out tsvalue)) { product.AllSlice.Clear(); throw new Exception("配置文件future.xml格式不对, Product/tradingtime解析出错"); } slice.EndTime = tsvalue; product.AllSlice.Add(slice); } #endregion } Dictionary <string, Future> normalmap = new Dictionary <string, Future>(); Dictionary <string, Future> refmap = new Dictionary <string, Future>(); Dictionary <string, Future> idxmap = new Dictionary <string, Future>(); foreach (XmlNode subNode in root.ChildNodes) { #region XmlElement subTagNode = subNode as XmlElement; if (subTagNode == null) { continue; } if (subTagNode.Name != FutureTag) { continue; } Future future; FutureXml.Get(subTagNode, out future, blive); if (future.ID != "") { future.ExchangeID = product.ExchangeID; future.ProductID = product.ProductID; if (future.FutureType == EnumFutureType.Index) { if (!idxmap.ContainsKey(future.ID)) { idxmap.Add(future.ID, future); } else { throw new Exception("Future.xml出错,重复的合约ID: " + future.ID); } } else if (future.FutureType == EnumFutureType.Reference) { if (!refmap.ContainsKey(future.ID)) { refmap.Add(future.ID, future); } else { throw new Exception("Future.xml出错,重复的合约ID: " + future.ID); } } else { if (!normalmap.ContainsKey(future.ID)) { normalmap.Add(future.ID, future); } else { throw new Exception("Future.xml出错,重复的合约ID: " + future.ID); } } } #endregion } foreach (string futureid in normalmap.Keys) { if (futurelist == null || futurelist.Count == 0 || futurelist.Contains(futureid)) { mgr.AddFuture(normalmap[futureid]); } } foreach (string futureid in refmap.Keys) { Future future = refmap[futureid]; string refid = mgr.GetRealFuture(future.ID); if (refid != "" && normalmap.ContainsKey(refid)) { future.RealFuture = normalmap[refid]; } if (futurelist == null || futurelist.Count == 0 || futurelist.Contains(futureid)) { mgr.AddFuture(future); mgr.AddFuture(future.RealFuture); } } foreach (string futureid in idxmap.Keys) { if (futurelist == null || futurelist.Count == 0 || futurelist.Contains(futureid)) { Future future = idxmap[futureid]; future.RealFuture = refmap[future.ProductID + "9999"].RealFuture; mgr.AddFuture(future); mgr.AddFuture(future.RealFuture); foreach (string normalid in normalmap.Keys) { mgr.AddFuture(normalmap[normalid]); } } } BuildRef(mgr, product.ExchangeID, product.ProductID); }
internal static void Get(XmlElement root, FutureProduct product, FutureManager mgr) { product.ProductID = root.GetAttribute(IdAttr); product.ProductName = root.GetAttribute(NameAttr); if (root.HasAttribute(TradingTimeAttr)) { #region tradingtime string strtradingtime = root.GetAttribute(TradingTimeAttr); string[] strlist = strtradingtime.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); int icount = strlist.Length / 2; TimeSpan tsvalue; for (int i = 0; i < icount; ++i) { TimeSlice slice = new TimeSlice(); if (!TimeSpan.TryParse(strlist[i * 2], out tsvalue)) { product.AllSlice.Clear(); throw new Exception("配置文件future.xml格式不对, Product/tradingtime解析出错"); } slice.BeginTime = tsvalue; if (!TimeSpan.TryParse(strlist[i * 2 + 1], out tsvalue)) { product.AllSlice.Clear(); throw new Exception("配置文件future.xml格式不对, Product/tradingtime解析出错"); } slice.EndTime = tsvalue; product.AllSlice.Add(slice); } #endregion } foreach (XmlNode subNode in root.ChildNodes) { XmlElement subTagNode = subNode as XmlElement; if (subTagNode == null) { continue; } if (subTagNode.Name != FutureTag) { continue; } Future future; FutureXml.Get(subTagNode, out future, false); if (future.ID != "") { future.ExchangeID = product.ExchangeID; future.ProductID = product.ProductID; mgr.AddFuture(future); } } BuildRef(mgr, product.ExchangeID, product.ProductID); }
internal static void Set(XmlDocument doc, XmlElement root, FutureProduct product, FutureManager mgr) { XmlAttribute attr = doc.CreateAttribute(IdAttr); attr.Value = product.ProductID; root.Attributes.Append(attr); attr = doc.CreateAttribute(NameAttr); attr.Value = product.ProductName; root.Attributes.Append(attr); if (product.AllSlice != null && product.AllSlice.Count > 0) { StringBuilder builder = new StringBuilder(); foreach (TimeSlice slice in product.AllSlice) { builder.Append(slice.BeginTime.ToString()).Append(",") .Append(slice.EndTime.ToString()).Append(","); } builder.Remove(builder.Length - 1, 1); attr = doc.CreateAttribute(TradingTimeAttr); attr.Value = builder.ToString(); root.Attributes.Append(attr); } List <Future> futurelist = mgr.GetFutures(product.ExchangeID, product.ProductID); foreach (Future future in futurelist) { XmlElement subTagNode = doc.CreateElement(FutureTag); root.AppendChild(subTagNode); FutureXml.Set(doc, subTagNode, future); } }
internal static void Set(XmlDocument doc, XmlElement root, Exchange exchange, FutureManager mgr) { XmlAttribute attr = doc.CreateAttribute(IdAttr); attr.Value = exchange.ExchangeID; root.Attributes.Append(attr); attr = doc.CreateAttribute(NameAttr); attr.Value = exchange.ExchangeName; root.Attributes.Append(attr); StringBuilder builder = new StringBuilder(); foreach (TimeSlice slice in exchange.AllSlice) { builder.Append(slice.BeginTime.ToString()).Append(",").Append(slice.EndTime.ToString()).Append(","); } if (exchange.AllSlice.Count > 0) { builder.Remove(builder.Length - 1, 1); } XmlElement subTagNode = doc.CreateElement(SliceTag); root.AppendChild(subTagNode); XmlText subValueNode = doc.CreateTextNode(builder.ToString()); subTagNode.AppendChild(subValueNode); subTagNode = doc.CreateElement(OpenTimeTag); root.AppendChild(subTagNode); subValueNode = doc.CreateTextNode(exchange.OpenTime.ToShortTimeString()); subTagNode.AppendChild(subValueNode); subTagNode = doc.CreateElement(CloseTimeTag); root.AppendChild(subTagNode); subValueNode = doc.CreateTextNode(exchange.CloseTime.ToShortTimeString()); subTagNode.AppendChild(subValueNode); List<FutureProduct> productlist = mgr.GetProducts(exchange.ExchangeID); foreach (FutureProduct product in productlist) { subTagNode = doc.CreateElement(ProductTag); root.AppendChild(subTagNode); FutureProductXml.Set(doc, subTagNode, product, mgr); } }
/// <summary> /// 解析内容 /// </summary> /// <param name="root"></param> /// <param name="exchange"></param> /// <param name="mgr"></param> internal static void Get(XmlElement root, Exchange exchange, FutureManager mgr) { exchange.ExchangeID = root.GetAttribute(IdAttr); exchange.ExchangeName = root.GetAttribute(NameAttr); XmlText txtNode = null; DateTime dtime = default(DateTime); TimeSpan tsvalue; foreach (XmlNode subNode in root.ChildNodes) { XmlElement subTagNode = subNode as XmlElement; if (subTagNode == null) continue; switch (subTagNode.Name) { case ProductTag: FutureProduct product = new FutureProduct(); product.ExchangeID = exchange.ExchangeID; FutureProductXml.Get(subTagNode, product, mgr); if (product.ProductID != "") mgr.AddProduct(product); break; case SliceTag: txtNode = subTagNode.FirstChild as XmlText; if (txtNode == null || txtNode.Value.Trim() == "") throw new Exception("配置文件格式不对"); string[] strlist = txtNode.Value.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); int icount = strlist.Length / 2; for (int i = 0; i < icount; ++i) { TimeSlice slice = new TimeSlice(); if (!TimeSpan.TryParse(strlist[i * 2], out tsvalue)) { exchange.AllSlice.Clear(); throw new Exception("配置文件格式不对"); } slice.BeginTime = tsvalue; if (!TimeSpan.TryParse(strlist[i * 2 + 1], out tsvalue)) { exchange.AllSlice.Clear(); throw new Exception("配置文件格式不对"); } slice.EndTime = tsvalue; exchange.AllSlice.Add(slice); } break; case OpenTimeTag: txtNode = subTagNode.FirstChild as XmlText; if (txtNode == null || txtNode.Value.Trim() == "") throw new Exception("配置文件格式不对"); if (!DateTime.TryParse(txtNode.Value, out dtime)) throw new Exception("配置文件格式不对"); exchange.OpenTime = dtime; break; case CloseTimeTag: txtNode = subTagNode.FirstChild as XmlText; if (txtNode == null || txtNode.Value.Trim() == "") throw new Exception("配置文件格式不对"); if (!DateTime.TryParse(txtNode.Value, out dtime)) throw new Exception("配置文件格式不对"); exchange.CloseTime = dtime; break; } } }