//获取某个证券某天以前的N条日线数据 public static ISeriesObject[] GetNDailysBeforeDate(Instrument inst, DateTime date, int n) { FileSeries dailySeries = (FileSeries)inst.GetDataSeries(DataManager.EDataSeries.Daily); if (dailySeries == null || dailySeries.Count <= 0) { return new ISeriesObject[] {} } ; DateTime lastDate = date; int i; do { lastDate = lastDate.AddDays(-1); i = dailySeries.IndexOf(lastDate); }while(i < 0 && lastDate > dailySeries.FirstDateTime); if (i < 0) { return new ISeriesObject[] {} } ; int j = i - n + 1 > 0?i - n + 1:0; return(dailySeries.GetArray(j, i)); }
public List <Bar> GetLastNBars(string symbol, int barSize, int n, DateTime lastTime) { Instrument inst = InstrumentManager.Instruments[symbol]; List <Bar> bars = new List <Bar>(); if (inst != null) { string seriesName = "Bar.Time." + barSize.ToString(); FileSeries series = (FileSeries)inst.GetDataSeries(seriesName); if (series != null) { int last = series.IndexOf(lastTime, SearchOption.Prev); if (last >= 0) { int first = last - n + 1; first = first < 0 ? 0 : first; ISeriesObject[] seriesObjects = series.GetArray(first, last); foreach (ISeriesObject seriesObject in seriesObjects) { bars.Add((Bar)seriesObject); } } } } return(bars); }
public List <Daily> GetLastNDailys(string symbol, int n, DateTime lastDate) { Instrument inst = InstrumentManager.Instruments[symbol]; List <Daily> dailys = new List <Daily>(); if (inst != null) { FileSeries series = (FileSeries)inst.GetDataSeries("Daily"); if (series != null) { int last = series.IndexOf(lastDate, SearchOption.Prev); if (last >= 0) { int first = last - n + 1; first = first < 0 ? 0 : first; ISeriesObject[] seriesObjects = series.GetArray(first, last); foreach (ISeriesObject seriesObject in seriesObjects) { dailys.Add((Daily)seriesObject); } } } } return(dailys); }
public override void OnInit() { DateTime curDate = Clock.Now.Date; ISeriesObject[] dailyBars = Util.GetNDailiesBeforeDate(this.instrument, curDate, 60); foreach (Daily dBar in dailyBars) { this.Bar.Add(dBar); } bool overWrite = false; FileSeries series = (FileSeries)this.instrument.GetDataSeries("RiskLevel"); if (series == null) { series = (FileSeries)this.instrument.AddDataSeries("RiskLevel"); } float prevRiskLevel = 1.0F; if (series.Count > 0) { DateTime lastDate = curDate; int i; do { lastDate = lastDate.AddDays(-1); i = series.IndexOf(lastDate); }while(i < 0 && lastDate > series.FirstDateTime); if (i >= 0) { ISeriesObject[] riskArray = series.GetArray(i, i); GMData gmData = (GMData)riskArray[0]; prevRiskLevel = gmData.DataValue; } } GMDaily gmLastDaily = (GMDaily)this.DailyBar.Last; double inc = (gmLastDaily.Close / gmLastDaily.LastClose - 1) * 100; double abs = Math.Abs(inc); double riskLevel = prevRiskLevel + inc / abs * (int)(abs / 0.5) * 0.1; riskLevel = riskLevel < 0.5?0.5:(riskLevel > 1.2?1.2:riskLevel); GMData gmData1 = new GMData(curDate, (float)riskLevel); if (overWrite) { series.Remove(curDate); series.Add(gmData1); } else if (!series.Contains(curDate)) { series.Add(gmData1); } //this.PositionLevel=(float)riskLevel; Console.WriteLine("昨日涨跌幅:{0},今日风险水平为:{1}", inc, riskLevel); }
public DailySeries GetDailySeries(string seriesName, DateTime datetime1, DateTime datetime2) { DailySeries dailies = new DailySeries(); FileSeries fs = this.file.Series[seriesName]; if (fs != null) { foreach (Daily daily in fs.GetArray(datetime1, datetime2)) { dailies.Add(daily); } } return(dailies); }
public MarketDepthArray GetMarketDepthArray(string seriesName, DateTime datetime1, DateTime datetime2) { MarketDepthArray array = new MarketDepthArray(); FileSeries fs = this.file.Series[seriesName]; if (fs != null) { foreach (MarketDepth marketDepth in fs.GetArray(datetime1, datetime2)) { array.Add(marketDepth); } } return(array); }
public List <Trade> GetTrades(string symbol, DateTime beginTime, DateTime endTime) { List <Trade> trades = new List <Trade>(); if (this.seriesNamesToPartitionStore.Contains("Trade")) { this.ChangeStoreFileForTime(beginTime); if (this.lastFile != null) { string seriesName = symbol + ".Trade"; if (this.lastFile.Series.Contains(seriesName)) { FileSeries series = this.lastFile.Series[seriesName]; ISeriesObject[] seriesObjs = series.GetArray(beginTime, endTime); foreach (ISeriesObject seriesObj in seriesObjs) { trades.Add((Trade)seriesObj); } } } } else { Instrument inst = InstrumentManager.Instruments[symbol]; if (inst != null) { FileSeries series = (FileSeries)inst.GetDataSeries("Trade"); if (series != null) { ISeriesObject[] seriesObjs = series.GetArray(beginTime, endTime); foreach (ISeriesObject seriesObj in seriesObjs) { trades.Add((Trade)seriesObj); } } } } return(trades); }
public static List <Daily> GetLastNDailys(Instrument inst, DateTime lastDate, int n) { List <Daily> ret = new List <Daily>(); FileSeries dailySeries = (FileSeries)inst.GetDataSeries(DataManager.EDataSeries.Daily); if (dailySeries == null || dailySeries.Count <= 0) { return(ret); } int i = dailySeries.IndexOf(lastDate, SearchOption.Prev); if (i < 0) { return(ret); } int j = i - n + 1 > 0?i - n + 1:0; foreach (ISeriesObject isObj in dailySeries.GetArray(j, i)) { ret.Add((Daily)isObj); } return(ret); }
protected override bool doJob() { Console.WriteLine("正在读取Tick数据生成涨停板数据分析表..."); /*Console.WriteLine("测试作业........."); * return true;*/ try { GMRealTimeProvider provider = (GMRealTimeProvider)ProviderManager.MarketDataProviders["GMRealTimeProvider"]; provider.Connect(10000); if (!provider.IsConnected) { return(false); } string dateString = this.curDate.ToString("yyyy-MM-dd"); DateTime endTime = this.curDate.Add(new TimeSpan(24, 0, 0)); string endString = endTime.ToString("yyyy-MM-dd HH:mm:ss"); List <AnalysisItem> analysisList = new List <AnalysisItem>(); foreach (Instrument inst in InstrumentManager.Instruments) { if (inst.SecurityDesc.IndexOf("B") >= 0) { continue; //除去B股 } if (inst.SecurityType == "IDX") { continue; //除去指数 } FileSeries dailySeries = (FileSeries)inst.GetDataSeries(DataManager.EDataSeries.Daily); if (dailySeries == null || dailySeries.Count <= 0) { continue; } int i = dailySeries.IndexOf(this.curDate); if (i < 0) { continue; //没有日线,当日不开盘 } i = i - 10 > 0 ? i - 10 : 0; //往前推10个交易日 DateTime firstDate = dailySeries[i].DateTime; ISeriesObject[] dailys = dailySeries.GetArray(firstDate, this.curDate); int k = dailys.Length - 1; GMDaily gmDaily = (GMDaily)dailys[k]; if (gmDaily.Close / gmDaily.LastClose > 1.095) {//今日涨停 AnalysisItem ai = new AnalysisItem(); ai.Date = gmDaily.DateTime; ai.Symbol = inst.Symbol; GMSDK.ShareIndex si = null; //先读取当日股本,如果没有,则读取最近股本。一般情况下当日股本与最近股本相同,除非当天正好是除权日 List <GMSDK.ShareIndex> shareIndexList = provider.MdApi.GetShareIndex(ai.Symbol, dateString, dateString); if (shareIndexList.Count <= 0) { shareIndexList = provider.MdApi.GetLastShareIndex(ai.Symbol); } if (shareIndexList.Count > 0) { si = shareIndexList[0]; } if (si != null) { ai.FlowAShare = si.flow_a_share; } else { ai.FlowAShare = 0.0; } ai.LastClose = gmDaily.LastClose; ai.Open = gmDaily.Open; ai.High = gmDaily.High; ai.Low = gmDaily.Low; ai.Close = gmDaily.Close; //换手率 if (ai.FlowAShare > 0) { ai.TurnoverRate = gmDaily.Volume / ai.FlowAShare * 100; } else { ai.TurnoverRate = 0.0; } //当日量与前5日均量比 int m = k - 1; double sumVol = 0.0; while (m >= 0 && m >= k - 5) { sumVol += ((Daily)dailys[m]).Volume; m--; } double last5AvgVol = sumVol / (k - m - 1); ai.VolDivLast5AvgVol = gmDaily.Volume / last5AvgVol; //最后一笔判断是否是涨停 List <GMSDK.Tick> lastTicks = provider.MdApi.GetLastNTicks(inst.Symbol, 1, endString); if (lastTicks.Count <= 0) { continue; } GMTrade gmLastTrade = (GMTrade)GSKToGM.ConvertTrade(lastTicks[0]);//最后一笔交易数据 if (gmLastTrade.Price < gmLastTrade.UpperLimit) { continue; } //封成比 GMQuote gmLastQuote = (GMQuote)GSKToGM.ConvertQuote(lastTicks[0]);//最后一刻报价数据 ai.BidSizeDivVol = (double)gmLastQuote.BidSize / gmDaily.Volume; if (k > 0) { GMDaily lastGMDaily = (GMDaily)dailys[k - 1]; if (lastGMDaily.Close / lastGMDaily.LastClose >= 1.099) { ai.LastUpLimited = true; } } analysisList.Add(ai); } } Console.WriteLine("今日共有{0}只涨停。", analysisList.Count); foreach (AnalysisItem ai in analysisList) { Console.WriteLine(@"Date:{0},Symbol:{1},昨收价:{2},昨日是否涨停:{3},开盘价:{4}, 最高价:{5},最低价:{6},收盘价:{7},涨停时间:{8},是否开板:{9},涨停时长:{10}, 成交量与昨日5日均量比:{11},收盘买一量与成交量比:{12},流通A股:{13},换手率:{14}" , ai.Date, ai.Symbol, ai.LastClose, ai.LastUpLimited, ai.Open, ai.High, ai.Low, ai.Close, ai.WhenUpLimit, ai.UpLimitBreaked, ai.HowLongUpLimit, ai.VolDivLast5AvgVol, ai.BidSizeDivVol, ai.FlowAShare, ai.TurnoverRate); } MongoClient client = new MongoClient("mongodb://localhost:27017"); MongoServer server = client.GetServer(); MongoDatabase database = server.GetDatabase("finance"); MongoCollection <BsonDocument> collection = database.GetCollection <BsonDocument>("UpLimitAnalysis"); foreach (AnalysisItem ai in analysisList) { BsonElement[] eleArray = new BsonElement[2]; eleArray[0] = new BsonElement("date", ai.Date.ToString("yyyy-MM-dd")); eleArray[1] = new BsonElement("symbol", ai.Symbol); QueryDocument query = new QueryDocument(eleArray); collection.Remove(query); BsonElement[] eleArray1 = new BsonElement[19]; eleArray1[0] = new BsonElement("date", ai.Date.ToString("yyyy-MM-dd")); eleArray1[1] = new BsonElement("symbol", ai.Symbol); eleArray1[2] = new BsonElement("flowashare", ai.FlowAShare); eleArray1[3] = new BsonElement("lastclose", ai.LastClose); eleArray1[4] = new BsonElement("lastuplimited", ai.LastUpLimited); eleArray1[5] = new BsonElement("open", ai.Open); eleArray1[6] = new BsonElement("high", ai.High); eleArray1[7] = new BsonElement("low", ai.Low); eleArray1[8] = new BsonElement("close", ai.Close); eleArray1[9] = new BsonElement("whenuplimit", ai.WhenUpLimit.ToString()); eleArray1[10] = new BsonElement("uplimitbreaked", ai.UpLimitBreaked); eleArray1[11] = new BsonElement("howlonguplimit", ai.HowLongUpLimit.ToString()); eleArray1[12] = new BsonElement("turnoverrate", ai.TurnoverRate); eleArray1[13] = new BsonElement("voldivlast5avgvol", ai.VolDivLast5AvgVol); eleArray1[14] = new BsonElement("bidsizedivvol", ai.BidSizeDivVol); BsonDocument insert = new BsonDocument(eleArray1); collection.Insert(insert); } return(true); } catch (Exception ex) { Console.WriteLine(ex.Message); } return(false); }
protected override bool doJob() { Console.WriteLine("正在读取Tick数据生成涨停板数据分析表..."); /*Console.WriteLine("测试作业........."); * return true;*/ try { GMRealTimeProvider provider = (GMRealTimeProvider)ProviderManager.MarketDataProviders["GMRealTimeProvider"]; provider.Connect(10000); if (!provider.IsConnected) { return(false); } string path = this.dataPath + "/" + this.curDate.Year.ToString() + "/" + this.curDate.Month.ToString(); if (!Directory.Exists(path)) { Console.WriteLine("Trade数据目录不存在!"); return(false); } string dateString = this.curDate.ToString("yyyy-MM-dd"); List <AnalysisItem> analysisList = new List <AnalysisItem>(); DataFile file = null; try { file = DataFile.Open(path); foreach (Instrument inst in InstrumentManager.Instruments) { if (inst.SecurityDesc.IndexOf("B") >= 0) { continue; //除去B股 } if (inst.SecurityType == "IDX") { continue; //除去指数 } FileSeries dailySeries = (FileSeries)inst.GetDataSeries(DataManager.EDataSeries.Daily); if (dailySeries == null || dailySeries.Count <= 0) { continue; } int i = dailySeries.IndexOf(this.curDate); if (i < 0) { continue; //没有日线,当日不开盘 } i = i - 10 > 0?i - 10:0; //往前推10个交易日 DateTime firstDate = dailySeries[i].DateTime; ISeriesObject[] dailys = dailySeries.GetArray(firstDate, this.curDate); int k = dailys.Length - 1; GMDaily gmDaily = (GMDaily)dailys[k]; if (gmDaily.Close / gmDaily.LastClose > 1.095) //今日涨停 { AnalysisItem ai = new AnalysisItem(); ai.Date = gmDaily.DateTime; ai.Symbol = inst.Symbol; GMSDK.ShareIndex si = null; //先读取当日股本,如果没有,则读取最近股本。一般情况下当日股本与最近股本相同,除非当天正好是除权日 List <GMSDK.ShareIndex> shareIndexList = provider.MdApi.GetShareIndex(ai.Symbol, dateString, dateString); if (shareIndexList.Count <= 0) { shareIndexList = provider.MdApi.GetLastShareIndex(ai.Symbol); } if (shareIndexList.Count > 0) { si = shareIndexList[0]; } if (si != null) { ai.FlowAShare = si.flow_a_share; } else { ai.FlowAShare = 0.0; } ai.LastClose = gmDaily.LastClose; ai.Open = gmDaily.Open; ai.High = gmDaily.High; ai.Low = gmDaily.Low; ai.Close = gmDaily.Close; //换手率 if (ai.FlowAShare > 0) { ai.TurnoverRate = gmDaily.Volume / ai.FlowAShare * 100; } else { ai.TurnoverRate = 0.0; } //当日量与前5日均量比 int m = k - 1; double sumVol = 0.0; while (m >= 0 && m >= k - 5) { sumVol += ((Daily)dailys[m]).Volume; m--; } double last5AvgVol = sumVol / (k - m - 1); ai.VolDivLast5AvgVol = gmDaily.Volume / last5AvgVol; //计算封板时间、时长等 bool flag = false; string name = inst.Symbol + ".Trade"; if (!file.Series.Contains(name)) { continue; } FileSeries series = file.Series[name]; ISeriesObject[] trades = series.GetArray(gmDaily.DateTime, gmDaily.DateTime.AddDays(1)); if (trades.Length <= 0) { continue; } GMTrade gmLastTrade = (GMTrade)trades[trades.Length - 1]; //最后一笔交易数据 if (gmLastTrade.Price < gmLastTrade.UpperLimit) { continue; } GMTrade lastGMTrade = null; DateTime openTimeAM = gmDaily.Date.Add(new TimeSpan(9, 25, 0)); DateTime openTimePM = gmDaily.Date.Add(new TimeSpan(13, 0, 0)); foreach (ISeriesObject aTrade in trades) { GMTrade gmTrade = (GMTrade)aTrade; if (!flag && gmTrade.Price == gmTrade.UpperLimit && gmTrade.DateTime >= openTimeAM) { ai.WhenUpLimit = gmTrade.DateTime - ai.Date; flag = true; } if (flag && gmTrade.Price < gmTrade.UpperLimit) { ai.UpLimitBreaked = true; } //将下午13:00之后的每笔时间减去90分钟,这样便于计算封涨停的时长 if (gmTrade.DateTime >= openTimePM) { gmTrade.DateTime = gmTrade.DateTime.AddMinutes(-90); } if (flag && lastGMTrade != null && gmTrade.Price == gmTrade.UpperLimit && lastGMTrade.Price == gmTrade.UpperLimit) { ai.HowLongUpLimit += gmTrade.DateTime - lastGMTrade.DateTime; } if (flag) { lastGMTrade = gmTrade; } } //封成比 name = inst.Symbol + ".Quote"; if (!file.Series.Contains(name)) { continue; } series = file.Series[name]; ISeriesObject[] quotes = series.GetArray(gmDaily.DateTime, gmDaily.DateTime.AddDays(1)); if (quotes.Length <= 0) { continue; } GMQuote gmLastQuote = (GMQuote)quotes[quotes.Length - 1]; //最后一刻报价数据 ai.BidSizeDivVol = (double)gmLastQuote.BidSize / gmDaily.Volume; if (k > 0) { GMDaily lastGMDaily = (GMDaily)dailys[k - 1]; if (lastGMDaily.Close / lastGMDaily.LastClose >= 1.099) { ai.LastUpLimited = true; } } if (flag) { analysisList.Add(ai); } } } }catch (Exception ex) { throw ex; }finally{ file.Close(); } Console.WriteLine("今日共有{0}只涨停。", analysisList.Count); foreach (AnalysisItem ai in analysisList) { Console.WriteLine(@"Date:{0},Symbol:{1},昨收价:{2},昨日是否涨停:{3},开盘价:{4}, 最高价:{5},最低价:{6},收盘价:{7},涨停时间:{8},是否开板:{9},涨停时长:{10}, 成交量与昨日5日均量比:{11},收盘买一量与成交量比:{12},流通A股:{13},换手率:{14}" , ai.Date, ai.Symbol, ai.LastClose, ai.LastUpLimited, ai.Open, ai.High, ai.Low, ai.Close, ai.WhenUpLimit, ai.UpLimitBreaked, ai.HowLongUpLimit, ai.VolDivLast5AvgVol, ai.BidSizeDivVol, ai.FlowAShare, ai.TurnoverRate); } MongoClient client = new MongoClient("mongodb://localhost:27017"); MongoServer server = client.GetServer(); MongoDatabase database = server.GetDatabase("finance"); MongoCollection <BsonDocument> collection = database.GetCollection <BsonDocument>("UpLimitAnalysis"); foreach (AnalysisItem ai in analysisList) { BsonElement[] eleArray = new BsonElement[2]; eleArray[0] = new BsonElement("date", ai.Date.ToString("yyyy-MM-dd")); eleArray[1] = new BsonElement("symbol", ai.Symbol); QueryDocument query = new QueryDocument(eleArray); collection.Remove(query); BsonElement[] eleArray1 = new BsonElement[19]; eleArray1[0] = new BsonElement("date", ai.Date.ToString("yyyy-MM-dd")); eleArray1[1] = new BsonElement("symbol", ai.Symbol); eleArray1[2] = new BsonElement("flowashare", ai.FlowAShare); eleArray1[3] = new BsonElement("lastclose", ai.LastClose); eleArray1[4] = new BsonElement("lastuplimited", ai.LastUpLimited); eleArray1[5] = new BsonElement("open", ai.Open); eleArray1[6] = new BsonElement("high", ai.High); eleArray1[7] = new BsonElement("low", ai.Low); eleArray1[8] = new BsonElement("close", ai.Close); eleArray1[9] = new BsonElement("whenuplimit", ai.WhenUpLimit.ToString()); eleArray1[10] = new BsonElement("uplimitbreaked", ai.UpLimitBreaked); eleArray1[11] = new BsonElement("howlonguplimit", ai.HowLongUpLimit.ToString()); eleArray1[12] = new BsonElement("turnoverrate", ai.TurnoverRate); eleArray1[13] = new BsonElement("voldivlast5avgvol", ai.VolDivLast5AvgVol); eleArray1[14] = new BsonElement("bidsizedivvol", ai.BidSizeDivVol); BsonDocument insert = new BsonDocument(eleArray1); collection.Insert(insert); } return(true); }catch (Exception ex) { Console.WriteLine(ex.Message); } return(false); }
static void Main(string[] args) { // TO DO: Add your code here DateTime beginDate = new DateTime(2017, 3, 24); DateTime endDate = new DateTime(2017, 3, 25); MongoClient client = new MongoClient("mongodb://localhost:27017"); MongoServer server = client.GetServer(); MongoDatabase database = server.GetDatabase("finance"); string username = "******"; string password = "******"; int ret = _md.Init(username, password, GMSDK.MDMode.MD_MODE_NULL, "", "", ""); if (ret != 0) { string msg = _md.StrError(ret); Console.WriteLine(msg); return; } DateTime curDate = beginDate; //获取交易日历,以确定是否开市日 string dateString1 = ""; if (endDate.AddMonths(-1) > beginDate) { dateString1 = beginDate.ToString("yyyy-MM-dd"); } else { dateString1 = endDate.AddMonths(-1).ToString("yyyy-MM-dd"); } string dateString2 = endDate.AddDays(1).ToString("yyyy-MM-dd"); List <DateTime> tradeDates = GetTradeDates("SHSE", dateString1, dateString2); while (curDate < endDate) { Console.WriteLine("日期:" + curDate.ToString("yyyy-MM-dd")); if ((tradeDates.Count <= 0) || (!tradeDates.Contains(curDate))) { Console.WriteLine("今天不是交易日"); curDate = curDate.AddDays(1); continue; } string monthString = curDate.ToString("yyyy-MM"); //区域统计数据准备 MongoCollection <BsonDocument> collection = database.GetCollection <BsonDocument>("Areas." + monthString); Dictionary <string, List <string> > areaDict = new Dictionary <string, List <string> >(); foreach (BsonDocument document in collection.FindAll()) { List <string> ls = null; if (!areaDict.TryGetValue((string)document["code"], out ls)) { ls = new List <string>(); areaDict.Add((string)document["code"], ls); } if (!(document["area"] is BsonNull)) { ls.Add((string)document["area"]); } } Dictionary <string, StatisItem> areaUpLimitStatis = new Dictionary <string, StatisItem>(); //行业统计数据准备 collection = database.GetCollection <BsonDocument>("Industries." + monthString); Dictionary <string, List <string> > industryDict = new Dictionary <string, List <string> >(); foreach (BsonDocument document in collection.FindAll()) { List <string> ls = null; if (!industryDict.TryGetValue((string)document["code"], out ls)) { ls = new List <string>(); industryDict.Add((string)document["code"], ls); } if (!(document["c_name"] is BsonNull)) { ls.Add((string)document["c_name"]); } } Dictionary <string, StatisItem> industryUpLimitStatis = new Dictionary <string, StatisItem>(); //概念统计数据准备 collection = database.GetCollection <BsonDocument>("Concepts." + monthString); Dictionary <string, List <string> > conceptDict = new Dictionary <string, List <string> >(); foreach (BsonDocument document in collection.FindAll()) { List <string> ls = null; if (!conceptDict.TryGetValue((string)document["code"], out ls)) { ls = new List <string>(); conceptDict.Add((string)document["code"], ls); } if (!(document["c_name"] is BsonNull)) { ls.Add((string)document["c_name"]); } } Dictionary <string, StatisItem> conceptUpLimitStatis = new Dictionary <string, StatisItem>(); //找出日线当天接近涨停股 List <Instrument> toUpLimit = new List <Instrument>(); foreach (Instrument instrument in InstrumentManager.Instruments) { if (instrument.SecurityType == "CS" && instrument.SecurityDesc.IndexOf('B') < 0) { DailySeries series = instrument.GetDailySeries(curDate.AddMonths(-3), curDate); //下面这里要求日线数大于20,是为了排除新股 if (series.Count > 20) { GMDaily gmDaily = (GMDaily)series[series.Count - 1]; //最近一天的日线 if (gmDaily.Date != curDate) { continue; } //下面是对于st,*st的,因为名字判断不准确,故去掉 //if ((instrument.SecurityDesc.IndexOf("ST")>=0||instrument.SecurityDesc.IndexOf('S')>=0) //&&(gmDaily.Close/gmDaily.LastClose>1.044)){ // toUpLimit.Add(instrument); //} //下面是对于普通股 if (gmDaily.Close / gmDaily.LastClose > 1.094) { toUpLimit.Add(instrument); } } } } //读出Trade数据,确定是否真的涨停及涨停时间,交统计数据 string dataPath = "e:/QDData"; string path = dataPath + "/" + curDate.Year.ToString() + "/" + curDate.Month.ToString(); if (!Directory.Exists(path)) { Console.WriteLine("Trade数据目录不存在!"); return; } try { DataFile file = DataFile.Open(path); try { foreach (Instrument instrument in toUpLimit) { string name = instrument.Symbol + ".Trade"; if (!file.Series.Contains(name)) { throw new Exception(instrument.Symbol + "的Trade数据不存在,请补充完整。"); } FileSeries series = file.Series[name]; ISeriesObject[] trades = series.GetArray(curDate, curDate.AddDays(1)); if (trades.Length <= 0) { continue; } GMTrade gmLastTrade = (GMTrade)trades[trades.Length - 1]; //最后一笔交易数据 if (gmLastTrade.Price < gmLastTrade.UpperLimit) { continue; } foreach (ISeriesObject aTrade in trades) { GMTrade gmTrade = (GMTrade)aTrade; if (gmTrade.Price == gmTrade.UpperLimit && gmTrade.DateTime >= curDate.Add(new TimeSpan(9, 25, 0))) { Console.WriteLine(instrument.Symbol + instrument.SecurityDesc + "在" + gmTrade.DateTime + "时涨停"); //区域统计 if (areaDict.ContainsKey(instrument.SecurityID)) { List <string> areaList = areaDict[instrument.SecurityID]; foreach (string area in areaList) { StatisItem si = null; if (!areaUpLimitStatis.TryGetValue(area, out si)) { si = new StatisItem(); areaUpLimitStatis.Add(area, si); } si.AddSymbol(instrument.Symbol, gmTrade.DateTime); } } //行业统计 if (industryDict.ContainsKey(instrument.SecurityID)) { List <string> industryList = industryDict[instrument.SecurityID]; foreach (string industry in industryList) { StatisItem si = null; if (!industryUpLimitStatis.TryGetValue(industry, out si)) { si = new StatisItem(); industryUpLimitStatis.Add(industry, si); } si.AddSymbol(instrument.Symbol, gmTrade.DateTime); } } //概念统计 if (conceptDict.ContainsKey(instrument.SecurityID)) { List <string> conceptList = conceptDict[instrument.SecurityID]; foreach (string concept in conceptList) { StatisItem si = null; if (!conceptUpLimitStatis.TryGetValue(concept, out si)) { si = new StatisItem(); conceptUpLimitStatis.Add(concept, si); } si.AddSymbol(instrument.Symbol, gmTrade.DateTime); } } break; } } } }catch (Exception ex) { throw ex; } finally{ file.Close(); } //区域统计写入数据库 MongoCollection <BsonDocument> collection1 = database.GetCollection <BsonDocument>("AreasUpLimitStatis"); BsonElement[] eleArray = new BsonElement[1]; eleArray[0] = new BsonElement("date", curDate.ToString("yyyy-MM-dd")); QueryDocument query = new QueryDocument(eleArray); collection1.Remove(query); foreach (KeyValuePair <string, StatisItem> kvp in areaUpLimitStatis) { BsonElement[] eleArray1 = new BsonElement[4]; eleArray1[0] = new BsonElement("date", curDate.ToString("yyyy-MM-dd")); eleArray1[1] = new BsonElement("area", kvp.Key); eleArray1[2] = new BsonElement("count", kvp.Value.Count); BsonArray bsonArray = new BsonArray(kvp.Value.Count); foreach (KeyValuePair <string, DateTime> kvp1 in kvp.Value.Securities) { bsonArray.Add(new BsonDocument(new BsonElement[2] { new BsonElement("symbol", kvp1.Key), new BsonElement("time", kvp1.Value.ToString("yyyy-MM-dd HH:mm:ss")) })); } eleArray1[3] = new BsonElement("securities", bsonArray); BsonDocument insert = new BsonDocument(eleArray1); collection1.Insert(insert); } //行业统计写入数据库 MongoCollection <BsonDocument> collection2 = database.GetCollection <BsonDocument>("IndustriesUpLimitStatis"); collection2.Remove(query); foreach (KeyValuePair <string, StatisItem> kvp in industryUpLimitStatis) { BsonElement[] eleArray1 = new BsonElement[4]; eleArray1[0] = new BsonElement("date", curDate.ToString("yyyy-MM-dd")); eleArray1[1] = new BsonElement("industry", kvp.Key); eleArray1[2] = new BsonElement("count", kvp.Value.Count); BsonArray bsonArray = new BsonArray(kvp.Value.Count); foreach (KeyValuePair <string, DateTime> kvp1 in kvp.Value.Securities) { bsonArray.Add(new BsonDocument(new BsonElement[2] { new BsonElement("symbol", kvp1.Key), new BsonElement("time", kvp1.Value.ToString("yyyy-MM-dd HH:mm:ss")) })); } eleArray1[3] = new BsonElement("securities", bsonArray); BsonDocument insert = new BsonDocument(eleArray1); collection2.Insert(insert); } //概念统计写入数据库 MongoCollection <BsonDocument> collection3 = database.GetCollection <BsonDocument>("ConceptsUpLimitStatis"); collection3.Remove(query); foreach (KeyValuePair <string, StatisItem> kvp in conceptUpLimitStatis) { BsonElement[] eleArray1 = new BsonElement[4]; eleArray1[0] = new BsonElement("date", curDate.ToString("yyyy-MM-dd")); eleArray1[1] = new BsonElement("concept", kvp.Key); eleArray1[2] = new BsonElement("count", kvp.Value.Count); BsonArray bsonArray = new BsonArray(kvp.Value.Count); foreach (KeyValuePair <string, DateTime> kvp1 in kvp.Value.Securities) { bsonArray.Add(new BsonDocument(new BsonElement[2] { new BsonElement("symbol", kvp1.Key), new BsonElement("time", kvp1.Value.ToString("yyyy-MM-dd HH:mm:ss")) })); } eleArray1[3] = new BsonElement("securities", bsonArray); BsonDocument insert = new BsonDocument(eleArray1); collection3.Insert(insert); } }catch (Exception ex) { Console.WriteLine(ex.Message); } curDate = curDate.AddDays(1); } }
static void Main(string[] args) { // TO DO: Add your code here string dataPath = "e:/QDData"; bool overwrite = false; DateTime beginDate = new System.DateTime(2017, 1, 1); DateTime endDate = new System.DateTime(2017, 4, 1); string username = "******"; string password = "******"; int ret = _md.Init(username, password, MDMode.MD_MODE_NULL, "", "", ""); if (ret != 0) { string msg = _md.StrError(ret); Console.WriteLine(msg); return; } DateTime curDate = beginDate; //获取交易日历,以确定是否开市日 string dateString1 = ""; if (endDate.AddMonths(-1) > beginDate) { dateString1 = beginDate.ToString("yyyy-MM-dd"); } else { dateString1 = endDate.AddMonths(-1).ToString("yyyy-MM-dd"); } string dateString2 = endDate.AddDays(1).ToString("yyyy-MM-dd"); List <DateTime> tradeDates = GetTradeDates("SHSE", dateString1, dateString2); while (curDate < endDate) { Console.WriteLine("日期:" + curDate.ToString("yyyy-MM-dd")); if ((tradeDates.Count <= 0) || (!tradeDates.Contains(curDate))) { Console.WriteLine("今天不是交易日"); curDate = curDate.AddDays(1); continue; } string path = dataPath + "/" + curDate.Year.ToString() + "/" + curDate.Month.ToString(); if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } DateTime beginTime = curDate.Add(new TimeSpan(9, 0, 0)); DateTime endTime = curDate.Add(new TimeSpan(24, 0, 0)); string beginString = beginTime.ToString("yyyy-MM-dd HH:mm:ss"); string endString = endTime.ToString("yyyy-MM-dd HH:mm:ss"); Console.WriteLine("时间段:" + beginString + "----" + endString); try { DataFile file = DataFile.Open(path); try { //获取股票代码列表 List <string> symbols = new List <string>(); symbols.Add("SHSE.000001"); symbols.Add("SHSE.000002"); symbols.Add("SZSE.399001"); symbols.Add("SZSE.399006"); //symbols=GetSymbols("SHSE",1); //symbols.AddRange(GetSymbols("SZSE",1)); foreach (string symbol in symbols) { Console.WriteLine("正在处理证券" + symbol + "的Tick数据..."); List <GMSDK.Tick> gskTicksCache = _md.GetTicks(symbol, beginString, endString); Console.WriteLine(symbol + "有" + gskTicksCache.Count.ToString() + "笔数据。"); if (gskTicksCache.Count > 0) { //添加trades Console.WriteLine("存储Trade数据..."); List <ISeriesObject> trades = GSKToGM.ConvertTrades(gskTicksCache); string name1 = symbol + ".Trade"; if (!file.Series.Contains(name1)) { file.Series.Add(name1); } FileSeries series1 = file.Series[name1]; ISeriesObject[] hasTrades = series1.GetArray(beginTime, endTime); if (overwrite || hasTrades.Length != trades.Count) { foreach (ISeriesObject aTrade in hasTrades) { series1.Remove(aTrade.DateTime); } foreach (ISeriesObject trade in trades) { series1.Add(trade); } } series1.Reindex(Indexer.Daily); //添加quotes Console.WriteLine("存储Quote数据..."); List <ISeriesObject> quotes = GSKToGM.ConvertQuotes(gskTicksCache); string name2 = symbol + ".Quote"; if (!file.Series.Contains(name2)) { file.Series.Add(name2); } FileSeries series2 = file.Series[name2]; ISeriesObject[] hasQuotes = series2.GetArray(beginTime, endTime); if (overwrite || hasQuotes.Length != quotes.Count) { foreach (ISeriesObject aQuote in hasQuotes) { series2.Remove(aQuote.DateTime); } foreach (ISeriesObject quote in quotes) { series2.Add(quote); } } series2.Reindex(Indexer.Daily); } } } catch (Exception ex) { throw ex; } finally { file.Close(); } }catch (Exception ex) { Console.WriteLine(ex.Message); } curDate = curDate.AddDays(1); } }
protected override bool doJob() { Console.WriteLine("正在下载Tick数据..."); try { GMRealTimeProvider provider = (GMRealTimeProvider)ProviderManager.MarketDataProviders["GMRealTimeProvider"]; provider.Connect(10000); if (!provider.IsConnected) { return(false); } bool overwrite = false; string path = this.dataPath + "/" + this.curDate.Year.ToString() + "/" + this.curDate.Month.ToString(); if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } DateTime beginTime = this.curDate.Add(new TimeSpan(9, 0, 0)); DateTime endTime = this.curDate.Add(new TimeSpan(24, 0, 0)); string beginString = beginTime.ToString("yyyy-MM-dd HH:mm:ss"); string endString = endTime.ToString("yyyy-MM-dd HH:mm:ss"); Console.WriteLine("时间段:" + beginString + "----" + endString); DataFile file = DataFile.Open(path); try { //获取股票代码列表 foreach (Instrument inst in InstrumentManager.Instruments) { string symbol = inst.Symbol; Console.WriteLine("正在处理证券" + symbol + "的Tick数据..."); List <GMSDK.Tick> gskTicksCache = provider.MdApi.GetTicks(symbol, beginString, endString); Console.WriteLine(symbol + "有" + gskTicksCache.Count.ToString() + "笔数据。"); if (gskTicksCache.Count > 0) { //添加trades Console.WriteLine("存储Trade数据..."); List <ISeriesObject> trades = GSKToGM.ConvertTrades(gskTicksCache); string name1 = symbol + ".Trade"; if (!file.Series.Contains(name1)) { file.Series.Add(name1); } FileSeries series1 = file.Series[name1]; ISeriesObject[] hasTrades = series1.GetArray(beginTime, endTime); if (overwrite || hasTrades.Length != trades.Count) { foreach (ISeriesObject aTrade in hasTrades) { series1.Remove(aTrade.DateTime); } foreach (ISeriesObject trade in trades) { series1.Add(trade); } } series1.Reindex(Indexer.Daily); //添加quotes if (inst.SecurityType == "IDX") { continue; //指数没有报价数据 } Console.WriteLine("存储Quote数据..."); List <ISeriesObject> quotes = GSKToGM.ConvertQuotes(gskTicksCache); string name2 = symbol + ".Quote"; if (!file.Series.Contains(name2)) { file.Series.Add(name2); } FileSeries series2 = file.Series[name2]; ISeriesObject[] hasQuotes = series2.GetArray(beginTime, endTime); if (overwrite || hasQuotes.Length != quotes.Count) { foreach (ISeriesObject aQuote in hasQuotes) { series2.Remove(aQuote.DateTime); } foreach (ISeriesObject quote in quotes) { series2.Add(quote); } } series2.Reindex(Indexer.Daily); Console.WriteLine("证券:{0}的Tick数据存储完毕.", symbol); } } return(true); } catch (Exception ex) { throw ex; } finally { file.Close(); } } catch (Exception ex) { Console.WriteLine(ex.Message); } return(false); }
static void Main(string[] args) { // TO DO: Add your code here string dataPath = "e:/QDData"; bool overwrite = false; DateTime beginDate = new System.DateTime(2017, 4, 5); DateTime endDate = new System.DateTime(2017, 4, 7); string username = "******"; string password = "******"; int ret = _md.Init(username, password, MDMode.MD_MODE_NULL, "", "", ""); if (ret != 0) { string msg = _md.StrError(ret); Console.WriteLine(msg); return; } DateTime curDate = beginDate; //获取交易日历,以确定是否开市日 string dateString1 = ""; if (endDate.AddMonths(-1) > beginDate) { dateString1 = beginDate.ToString("yyyy-MM-dd"); } else { dateString1 = endDate.AddMonths(-1).ToString("yyyy-MM-dd"); } string dateString2 = endDate.AddDays(1).ToString("yyyy-MM-dd"); List <DateTime> tradeDates = GetTradeDates("SHSE", dateString1, dateString2); while (curDate < endDate) { Console.WriteLine("日期:" + curDate.ToString("yyyy-MM-dd")); if ((tradeDates.Count <= 0) || (!tradeDates.Contains(curDate))) { Console.WriteLine("今天不是交易日"); curDate = curDate.AddDays(1); continue; } string path = dataPath + "/" + curDate.Year.ToString() + "/" + curDate.Month.ToString(); if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } DateTime beginTime = curDate.Add(new TimeSpan(9, 0, 0)); DateTime endTime = curDate.Add(new TimeSpan(24, 0, 0)); string beginString = beginTime.ToString("yyyy-MM-dd HH:mm:ss"); string endString = endTime.ToString("yyyy-MM-dd HH:mm:ss"); Console.WriteLine("时间段:" + beginString + "----" + endString); try { DataFile file = DataFile.Open(path); Random ra = new Random(); try { //获取股票代码列表 List <string> symbols = new List <string>(); symbols = GetSymbols("SHSE", 1); symbols.AddRange(GetSymbols("SZSE", 1)); foreach (string symbol in symbols) { //Console.WriteLine("正在检查证券"+symbol+"的Tick数据..."); string name = symbol + ".Trade"; if (!file.Series.Contains(name)) { file.Series.Add(name); } FileSeries series = file.Series[name]; ISeriesObject[] has = series.GetArray(beginTime, endTime); SmartQuant.Instruments.Instrument inst = InstrumentManager.Instruments[symbol]; //获取当天的日线数据 Daily dailyBar = null; if (inst == null) { List <GMSDK.DailyBar> gskDailyBars = _md.GetDailyBars(symbol, curDate.ToString("yyyy-MM-dd"), curDate.ToString("yyyy-MM-dd")); if (gskDailyBars.Count > 0) { List <ISeriesObject> dailys = GSKToGM.ConvertDailys(gskDailyBars); dailyBar = (Daily)dailys[0]; } } else { DailySeries dailySeries = inst.GetDailySeries(curDate, curDate); if (dailySeries.Count > 0) { dailyBar = dailySeries[0]; } } bool needRebuild = false; //检查是否丢失 if (has.Length <= 0) { if (dailyBar != null) { Console.WriteLine("证券:{0},在日期:{1}时丢失Tick数据", symbol, curDate); needRebuild = true; } } else { //检查是否有重复,一般情形下不会重复,所以这里注释掉 /*int r1=ra.Next(0,has.Length-1); * int r2=ra.Next(0,has.Length-1); * * ISeriesObject randTrade1=has[r1]; * ISeriesObject randTrade2=has[r2]; * * ISeriesObject[] repeat1=series.GetArray(randTrade1.DateTime,randTrade1.DateTime); * ISeriesObject[] repeat2=series.GetArray(randTrade2.DateTime,randTrade2.DateTime); * if (repeat1.Length>1&&repeat2.Length>1) { * Console.WriteLine("r1={0},r2={1}",r1,r2); * Console.WriteLine("证券:{0},在日期:{1}时有重复的Tick数据",symbol,curDate); * needRebuild=true; * }*/ //检查是否不完整 GMTrade lastTrade = (GMTrade)has[has.Length - 1]; if ((dailyBar != null) && (lastTrade.TotalSize < dailyBar.Volume)) { Console.WriteLine("证券:{0},在日期:{1}时Tick数据不全", symbol, curDate); needRebuild = true; } } if (needRebuild) { List <GMSDK.Tick> gskTicksCache = _md.GetTicks(symbol, beginString, endString); Console.WriteLine(symbol + "有" + gskTicksCache.Count.ToString() + "笔数据。"); if (gskTicksCache.Count > 0) { //添加trades Console.WriteLine("存储Trade数据..."); List <ISeriesObject> trades = GSKToGM.ConvertTrades(gskTicksCache); string name1 = symbol + ".Trade"; if (!file.Series.Contains(name1)) { file.Series.Add(name1); } FileSeries series1 = file.Series[name1]; ISeriesObject[] hasTrades = series1.GetArray(beginTime, endTime); if (overwrite || hasTrades.Length != trades.Count) { foreach (ISeriesObject aTrade in hasTrades) { series1.Remove(aTrade.DateTime); } foreach (ISeriesObject trade in trades) { series1.Add(trade); } } series1.Reindex(Indexer.Daily); //添加quotes Console.WriteLine("存储Quote数据..."); List <ISeriesObject> quotes = GSKToGM.ConvertQuotes(gskTicksCache); string name2 = symbol + ".Quote"; if (!file.Series.Contains(name2)) { file.Series.Add(name2); } FileSeries series2 = file.Series[name2]; ISeriesObject[] hasQuotes = series2.GetArray(beginTime, endTime); if (overwrite || hasQuotes.Length != quotes.Count) { foreach (ISeriesObject aQuote in hasQuotes) { series2.Remove(aQuote.DateTime); } foreach (ISeriesObject quote in quotes) { series2.Add(quote); } } series2.Reindex(Indexer.Daily); } } } }catch (Exception ex) { throw ex; } finally { file.Close(); } }catch (Exception ex) { Console.WriteLine(ex.Message); } curDate = curDate.AddDays(1); } }
static void Main(string[] args) { // TO DO: Add your code here string username = "******"; string password = "******"; int ret = _md.Init(username, password, GMSDK.MDMode.MD_MODE_NULL, "", "", ""); if (ret != 0) { string msg = _md.StrError(ret); Console.WriteLine(msg); return; } string dataPath = "e:/QDData"; DateTime beginDate = new System.DateTime(2017, 4, 10); DateTime endDate = new System.DateTime(2017, 4, 17); string beginDateString = beginDate.ToString("yyyy-MM-dd"); string endDateString = endDate.ToString("yyyy-MM-dd"); Dictionary <string, Dictionary <string, double> > shareDict = new Dictionary <string, Dictionary <string, double> >();//存放股本 List <AnalysisItem> analysisList = new List <AnalysisItem>(); foreach (Instrument inst in InstrumentManager.Instruments) { if (inst.SecurityDesc.IndexOf("B") >= 0) { continue; //除去B股 } FileSeries dailySeries = (FileSeries)inst.GetDataSeries(DataManager.EDataSeries.Daily); if (dailySeries == null || dailySeries.Count <= 0) { continue; } int i; DateTime firstDate = beginDate; do { i = dailySeries.IndexOf(firstDate); firstDate = firstDate.AddDays(1); }while(i < 0 && firstDate < endDate); if (i < 0) { continue; } i = i - 5 > 0?i - 5:0; firstDate = dailySeries[i].DateTime; ISeriesObject[] dailys = dailySeries.GetArray(firstDate, endDate); for (int k = 0; k < dailys.Length; k++) { GMDaily gmDaily = (GMDaily)dailys[k]; if (gmDaily.DateTime >= beginDate && gmDaily.DateTime < endDate) { if (gmDaily.Close / gmDaily.LastClose > 1.095) //今日涨停 { AnalysisItem ai = new AnalysisItem(); ai.Date = gmDaily.DateTime; ai.Symbol = inst.Symbol; Dictionary <string, double> sd = null; if (!shareDict.TryGetValue(inst.Symbol, out sd)) { sd = new Dictionary <string, double>(); List <GMSDK.ShareIndex> shareIndexList = _md.GetShareIndex(inst.Symbol, beginDateString, endDateString); foreach (GMSDK.ShareIndex si in shareIndexList) { sd.Add(si.pub_date, si.flow_a_share); } shareDict.Add(inst.Symbol, sd); } sd.TryGetValue(ai.Date.ToString("yyyy-MM-dd"), out ai.FlowAShare); ai.LastClose = gmDaily.LastClose; ai.Open = gmDaily.Open; ai.High = gmDaily.High; ai.Low = gmDaily.Low; ai.Close = gmDaily.Close; if (ai.FlowAShare > 0) { ai.TurnoverRate = gmDaily.Volume / ai.FlowAShare * 100; } int m = k - 1; double sumVol = 0.0; while (m >= 0 && m >= k - 5) { sumVol += ((Daily)dailys[m]).Volume; m--; } double last5AvgVol = sumVol / (k - m - 1); ai.VolDivLast5AvgVol = gmDaily.Volume / last5AvgVol; string path = dataPath + "/" + gmDaily.DateTime.Year.ToString() + "/" + gmDaily.DateTime.Month.ToString(); if (!Directory.Exists(path)) { Console.WriteLine("Trade数据目录不存在!"); return; } DataFile file = null; bool flag = false; try { file = DataFile.Open(path); string name = inst.Symbol + ".Trade"; if (!file.Series.Contains(name)) { continue; } FileSeries series = file.Series[name]; ISeriesObject[] trades = series.GetArray(gmDaily.DateTime, gmDaily.DateTime.AddDays(1)); if (trades.Length <= 0) { continue; } GMTrade gmLastTrade = (GMTrade)trades[trades.Length - 1]; //最后一笔交易数据 if (gmLastTrade.Price < gmLastTrade.UpperLimit) { continue; } GMTrade lastGMTrade = null; DateTime openTimeAM = gmDaily.Date.Add(new TimeSpan(9, 25, 0)); DateTime openTimePM = gmDaily.Date.Add(new TimeSpan(13, 0, 0)); foreach (ISeriesObject aTrade in trades) { GMTrade gmTrade = (GMTrade)aTrade; if (!flag && gmTrade.Price == gmTrade.UpperLimit && gmTrade.DateTime >= openTimeAM) { ai.WhenUpLimit = gmTrade.DateTime - ai.Date; flag = true; } if (flag && gmTrade.Price < gmTrade.UpperLimit) { ai.UpLimitBreaked = true; } //将下午13:00之后的每笔时间减去90分钟,这样便于计算封涨停的时长 if (gmTrade.DateTime >= openTimePM) { gmTrade.DateTime = gmTrade.DateTime.AddMinutes(-90); } if (flag && lastGMTrade != null && gmTrade.Price == gmTrade.UpperLimit && lastGMTrade.Price == gmTrade.UpperLimit) { ai.HowLongUpLimit += gmTrade.DateTime - lastGMTrade.DateTime; } if (flag) { lastGMTrade = gmTrade; } } //封成比 name = inst.Symbol + ".Quote"; if (!file.Series.Contains(name)) { continue; } series = file.Series[name]; ISeriesObject[] quotes = series.GetArray(gmDaily.DateTime, gmDaily.DateTime.AddDays(1)); if (quotes.Length <= 0) { continue; } GMQuote gmLastQuote = (GMQuote)quotes[quotes.Length - 1]; //最后一笔报价数据 ai.BidSizeDivVol = (double)gmLastQuote.BidSize / gmDaily.Volume; }catch (Exception ex) { Console.WriteLine(ex.Message); }finally{ file.Close(); } if (k > 0) { GMDaily lastGMDaily = (GMDaily)dailys[k - 1]; if (lastGMDaily.Close / lastGMDaily.LastClose > 1.098) { ai.LastUpLimited = true; } } if (k < dailys.Length - 1) { GMDaily nextGMDaily = (GMDaily)dailys[k + 1]; ai.NextOpen = nextGMDaily.Open; ai.NextHigh = nextGMDaily.High; ai.NextLow = nextGMDaily.Low; ai.NextClose = nextGMDaily.Close; } if (flag) { analysisList.Add(ai); } } } } } Console.WriteLine(analysisList.Count); analysisList.Sort(delegate(AnalysisItem ai1, AnalysisItem ai2){ return(ai1.Date.CompareTo(ai2.Date)); }); foreach (AnalysisItem ai in analysisList) { Console.WriteLine(@"Date:{0},Symbol:{1},昨收价:{2},昨日是否涨停:{3},开盘价:{4}, 最高价:{5},最低价:{6},收盘价:{7},涨停时间:{8},是否开板:{9},涨停时长:{10}, 成交量与昨日5日均量比:{11},收盘买一量与成交量比:{12}, 明日开盘价:{13},明日最高价:{14},明日最低价:{15},明日收盘价:{16},流通A股:{17},换手率:{18}" , ai.Date, ai.Symbol, ai.LastClose, ai.LastUpLimited, ai.Open, ai.High, ai.Low, ai.Close, ai.WhenUpLimit, ai.UpLimitBreaked, ai.HowLongUpLimit, ai.VolDivLast5AvgVol, ai.BidSizeDivVol, ai.NextOpen, ai.NextHigh, ai.NextLow, ai.NextClose, ai.FlowAShare, ai.TurnoverRate); } MongoClient client = new MongoClient("mongodb://localhost:27017"); MongoServer server = client.GetServer(); MongoDatabase database = server.GetDatabase("finance"); MongoCollection <BsonDocument> collection = database.GetCollection <BsonDocument>("UpLimitAnalysis"); foreach (AnalysisItem ai in analysisList) { BsonElement[] eleArray = new BsonElement[2]; eleArray[0] = new BsonElement("date", ai.Date.ToString("yyyy-MM-dd")); eleArray[1] = new BsonElement("symbol", ai.Symbol); QueryDocument query = new QueryDocument(eleArray); collection.Remove(query); BsonElement[] eleArray1 = new BsonElement[19]; eleArray1[0] = new BsonElement("date", ai.Date.ToString("yyyy-MM-dd")); eleArray1[1] = new BsonElement("symbol", ai.Symbol); eleArray1[2] = new BsonElement("flowashare", ai.FlowAShare); eleArray1[3] = new BsonElement("lastclose", ai.LastClose); eleArray1[4] = new BsonElement("lastuplimited", ai.LastUpLimited); eleArray1[5] = new BsonElement("open", ai.Open); eleArray1[6] = new BsonElement("high", ai.High); eleArray1[7] = new BsonElement("low", ai.Low); eleArray1[8] = new BsonElement("close", ai.Close); eleArray1[9] = new BsonElement("whenuplimit", ai.WhenUpLimit.ToString()); eleArray1[10] = new BsonElement("uplimitbreaked", ai.UpLimitBreaked); eleArray1[11] = new BsonElement("howlonguplimit", ai.HowLongUpLimit.ToString()); eleArray1[12] = new BsonElement("turnoverrate", ai.TurnoverRate); eleArray1[13] = new BsonElement("voldivlast5avgvol", ai.VolDivLast5AvgVol); eleArray1[14] = new BsonElement("bidsizedivvol", ai.BidSizeDivVol); eleArray1[15] = new BsonElement("nextopen", ai.NextOpen); eleArray1[16] = new BsonElement("nexthigh", ai.NextHigh); eleArray1[17] = new BsonElement("nextlow", ai.NextLow); eleArray1[18] = new BsonElement("nextclose", ai.NextClose); BsonDocument insert = new BsonDocument(eleArray1); collection.Insert(insert); } }
protected override bool doJob() { Console.WriteLine("正在检查Tick数据的完整性..."); /*Console.WriteLine("测试作业........."); * for(int i=0;i<1000;i++) Console.WriteLine("tick{0}",i); * return false;*/ try { GMRealTimeProvider provider = (GMRealTimeProvider)ProviderManager.MarketDataProviders["GMRealTimeProvider"]; provider.Connect(10000); if (!provider.IsConnected) { return(false); } bool overwrite = false; string path = this.dataPath + "/" + this.curDate.Year.ToString() + "/" + this.curDate.Month.ToString(); if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } DateTime beginTime = this.curDate.Add(new TimeSpan(9, 0, 0)); DateTime endTime = this.curDate.Add(new TimeSpan(24, 0, 0)); string beginString = beginTime.ToString("yyyy-MM-dd HH:mm:ss"); string endString = endTime.ToString("yyyy-MM-dd HH:mm:ss"); Console.WriteLine("时间段:" + beginString + "----" + endString); DataFile file = DataFile.Open(path); try { //获取股票代码列表 foreach (Instrument inst in InstrumentManager.Instruments) { //获取当天的日线数据 Daily dailyBar = null; DailySeries dailySeries = inst.GetDailySeries(this.curDate, this.curDate); if (dailySeries.Count > 0) { dailyBar = dailySeries[0]; } else { continue; } string name = inst.Symbol + ".Trade"; if (!file.Series.Contains(name)) { file.Series.Add(name); } FileSeries series = file.Series[name]; ISeriesObject[] has = series.GetArray(beginTime, endTime); bool needRebuild = false; //检查是否丢失 if (has.Length <= 0) { Console.WriteLine("证券:{0},在日期:{1}时丢失Tick数据", inst.Symbol, this.curDate); needRebuild = true; } else { //检查是否不完整 GMTrade lastTrade = (GMTrade)has[has.Length - 1]; if (lastTrade.TotalSize < dailyBar.Volume) { Console.WriteLine("证券:{0},在日期:{1}时Tick数据不全", inst.Symbol, this.curDate); needRebuild = true; } } if (needRebuild) { List <GMSDK.Tick> gskTicksCache = provider.MdApi.GetTicks(inst.Symbol, beginString, endString); Console.WriteLine(inst.Symbol + "有" + gskTicksCache.Count.ToString() + "笔数据。"); if (gskTicksCache.Count > 0) { //添加trades Console.WriteLine("存储Trade数据..."); List <ISeriesObject> trades = GSKToGM.ConvertTrades(gskTicksCache); string name1 = inst.Symbol + ".Trade"; if (!file.Series.Contains(name1)) { file.Series.Add(name1); } FileSeries series1 = file.Series[name1]; ISeriesObject[] hasTrades = series1.GetArray(beginTime, endTime); if (overwrite || hasTrades.Length != trades.Count) { foreach (ISeriesObject aTrade in hasTrades) { series1.Remove(aTrade.DateTime); } foreach (ISeriesObject trade in trades) { series1.Add(trade); } } series1.Reindex(Indexer.Daily); //添加quotes if (inst.SecurityType == "IDX") { continue; //指数没有报价数据 } Console.WriteLine("存储Quote数据..."); List <ISeriesObject> quotes = GSKToGM.ConvertQuotes(gskTicksCache); string name2 = inst.Symbol + ".Quote"; if (!file.Series.Contains(name2)) { file.Series.Add(name2); } FileSeries series2 = file.Series[name2]; ISeriesObject[] hasQuotes = series2.GetArray(beginTime, endTime); if (overwrite || hasQuotes.Length != quotes.Count) { foreach (ISeriesObject aQuote in hasQuotes) { series2.Remove(aQuote.DateTime); } foreach (ISeriesObject quote in quotes) { series2.Add(quote); } } series2.Reindex(Indexer.Daily); } } } return(true); }catch (Exception ex) { throw ex; }finally { file.Close(); } }catch (Exception ex) { Console.WriteLine(ex.Message); } return(false); }