//tick加载 private void LoadDataTick(int rid) { DataGridViewRow row = this.DataGridViewStrategies.Rows[rid]; var inst = row.Cells["Instrument"].Value.ToString(); var instOrder = row.Cells["InstrumentOrder"].Value.ToString(); var interval = row.Cells["Interval"].Value.ToString(); var stra = _dicStrategies[row.Cells["StraName"].Value.ToString()]; var begin = ((DateTime)row.Cells["BeginDate"].Value).ToString("yyyyMMdd"); var end = row.Cells["EndDate"].Value == null?DateTime.Today.ToString("yyyyMMdd") : ((DateTime)row.Cells["EndDate"].Value).ToString("yyyyMMdd"); Data data = new Data { Interval = int.Parse(interval.Split(' ')[1]), IntervalType = (EnumIntervalType)Enum.Parse(typeof(EnumIntervalType), interval.Split(' ')[0]), Instrument = inst, InstrumentOrder = instOrder, }; //需处理成按合约取品种(期权规则与期货不同) Instrument instInfo; Product procInfo; if (!_dataProcess.InstrumentInfo.TryGetValue(inst, out instInfo) || !_dataProcess.ProductInfo.TryGetValue(instInfo.ProductID, out procInfo)) { LogError("无合约对应的品种信息"); return; } data.InstrumentInfo = new InstrumentInfo { InstrumentID = inst, ProductID = instInfo.ProductID, PriceTick = procInfo.PriceTick, VolumeMultiple = procInfo.VolumeTuple, }; this.DataGridViewStrategies.EndEdit(); this.DataGridViewStrategies.Refresh(); new Thread(() => { row.Cells["TickLoad"].Value = "加载中..."; //=>初始化策略/回测 stra.Init(data); stra.EnableTick = true; //允许接收tick数据 List <string> insts = new List <string>(); //需要处理的合约 if (data.Instrument.EndsWith("000")) { //_dicTick000[data.Instrument] = new Tick { InstrumentID = data.Instrument };//对于xx000需要先有数据保存 insts.AddRange(_dataProcess.InstrumentInfo.Where(n => n.Value.ProductID == _dataProcess.InstrumentInfo[data.Instrument].ProductID).Select(n => n.Key).ToArray()); } else { insts.Add(data.Instrument); } foreach (var day in new DirectoryInfo("Y:\\_tick").GetFiles("*.csv").Select(n => n.Name.Replace(n.Extension, "")).OrderBy(n => n)) { if (day.CompareTo(begin) < 0 || day.CompareTo(end) > 0) { continue; } _tradingDay = day; //var reader = new StreamReader($"y:\\_tick\\{day}.csv"); //while (!string.IsNullOrEmpty(line = reader.ReadLine())) var list = new List <MarketData>(); foreach (var line in File.ReadAllLines($"y:\\_tick\\{day}.csv")) { //ag1209,5929,2,5915,9,5929,8,19542,88935,20120814,08:59:00,500 string[] fs = line.Split(','); if (insts.IndexOf(fs[0]) < 0) { continue; } list.Add(new MarketData { InstrumentID = fs[0], AskPrice = double.Parse(fs[1]), AskVolume = int.Parse(fs[2]), BidPrice = double.Parse(fs[3]), BidVolume = int.Parse(fs[4]), LastPrice = double.Parse(fs[5]), Volume = int.Parse(fs[6]), OpenInterest = double.Parse(fs[7]), AveragePrice = double.Parse(fs[8]), UpdateTime = $"{fs[9]} {fs[10]}", //模仿原始tick不加日期 $"{fs[9]} {fs[10]}", UpdateMillisec = int.Parse(fs[11]), }); } list = list.OrderBy(n => n.UpdateTime).ToList(); int i = 0; foreach (var tick in list) { tick.UpdateTime = tick.UpdateTime.Split(' ')[1]; quote_OnRtnTick(null, new TickEventArgs { Tick = tick }); row.Cells["TickLoad"].Value = $"{++i}/{list.Count}"; Thread.Sleep(1); //行情太快时由于多线程处理,造成bug } } LogInfo($"{stra.Name,8},策略加载数据完成."); this.DataGridViewStrategies.Rows[rid].Cells["TickLoad"].Value = "已加载"; this.DataGridViewStrategies.Rows[rid].Cells["Loaded"].Value = "已加载"; this.DataGridViewStrategies.Rows[rid].ReadOnly = true; }).Start(); }
//加载测试指定行的策略的 private void LoadDataBar(int rid) { DataGridViewRow row = this.DataGridViewStrategies.Rows[rid]; var inst = row.Cells["Instrument"].Value.ToString(); var instOrder = row.Cells["InstrumentOrder"].Value.ToString(); var interval = row.Cells["Interval"].Value.ToString(); var stra = _dicStrategies[row.Cells["StraName"].Value.ToString()]; var begin = ((DateTime)row.Cells["BeginDate"].Value).ToString("yyyyMMdd"); var end = row.Cells["EndDate"].Value == null?DateTime.Today.AddDays(7).ToString("yyyyMMdd") : ((DateTime)row.Cells["EndDate"].Value).AddDays(1).ToString("yyyyMMdd"); this.DataGridViewStrategies.Rows[rid].Cells["Loaded"].Value = "加载中..."; Data data = new Data { Interval = int.Parse(interval.Split(' ')[1]), IntervalType = (EnumIntervalType)Enum.Parse(typeof(EnumIntervalType), interval.Split(' ')[0]), Instrument = inst, InstrumentOrder = instOrder, }; //需处理成按合约取品种(期权规则与期货不同) Instrument instInfo; Product procInfo; if (!_dataProcess.InstrumentInfo.TryGetValue(inst, out instInfo) || !_dataProcess.ProductInfo.TryGetValue(instInfo.ProductID, out procInfo)) { LogError("无合约对应的品种信息"); return; } data.InstrumentInfo = new InstrumentInfo { InstrumentID = inst, ProductID = instInfo.ProductID, PriceTick = procInfo.PriceTick, VolumeMultiple = procInfo.VolumeTuple, }; this.DataGridViewStrategies.EndEdit(); this.DataGridViewStrategies.Refresh(); List <Bar> bars = null; if (data.IntervalType != EnumIntervalType.Sec) // == EnumIntervalType.Min || data.IntervalType == EnumIntervalType.Hour) { bars = _dataProcess.QueryMin(inst, begin, end).Select(n => new Bar { D = DateTime.ParseExact(n._id, "yyyyMMdd HH:mm:ss", null), TradingDay = int.Parse(n.TradingDay), O = n.Open, H = n.High, L = n.Low, C = n.Close, V = n.Volume, I = n.OpenInterest, }).ToList(); // 取当日数据 if (row.Cells["EndDate"].Value == null) { var listReal = _dataProcess.QueryReal(inst); bars = (bars ?? new List <Bar>()); if (listReal != null) { bars.AddRange(listReal.Select(n => new Bar { D = DateTime.ParseExact(n._id, "yyyyMMdd HH:mm:ss", null), TradingDay = int.Parse(n.TradingDay), O = n.Open, H = n.High, L = n.Low, C = n.Close, V = n.Volume, I = n.OpenInterest }).ToList()); } } } //else //取日线数据 // bars = _dataProcess.QueryDay(inst, begin, end).Select(n => new Bar // { // D = DateTime.ParseExact(n._id, "yyyyMMdd", null), // O = n.Open, // H = n.High, // L = n.Low, // C = n.Close, // V = n.Volume, // I = n.OpenInterest // }).ToList(); //=>初始化策略/回测 stra.Init(data); stra.LoadHistory(Tuple.Create(data, bars)); //未设置结束日期=>可订阅并接收行情 if (row.Cells["EndDate"].Value == null && _q != null) { stra.EnableTick = true; foreach (var v in stra.Datas) { LogInfo($"行情订阅:{v.Instrument}"); SubscribeInstrument(v.Instrument); SubscribeInstrument(v.InstrumentOrder); } } LogInfo($"{stra.Name,8},策略加载数据完成."); this.DataGridViewStrategies.Rows[rid].Cells["Loaded"].Value = "已加载"; this.DataGridViewStrategies.Rows[rid].Cells["TickLoad"].Value = "已加载"; if (!_offline) { var colIdx = this.DataGridViewStrategies.Columns.IndexOf(this.DataGridViewStrategies.Columns["Order"]); if (!(bool)this.DataGridViewStrategies[colIdx, rid].Value) //未被选中 { var rect = this.DataGridViewStrategies.GetCellDisplayRectangle(colIdx, rid, false); this.toolTip1.Show("勾选'委托',对接口下单.", this.DataGridViewStrategies, rect.X + 30, rect.Y + 20, 3000); } } }
public UpperPeriod UpperPeriod(Data data, int inteval, EnumIntervalType type) { return(Indicator.UpperPeriod(data.C, data.CurrentMinBar, inteval, type)); }