Beispiel #1
0
        //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();
        }
Beispiel #2
0
        //加载测试指定行的策略的
        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);
                }
            }
        }
Beispiel #3
0
 public UpperPeriod UpperPeriod(Data data, int inteval, EnumIntervalType type)
 {
     return(Indicator.UpperPeriod(data.C, data.CurrentMinBar, inteval, type));
 }