public void TestGetIndex() { var ts = new TickSeries("test"); for (int i = 0; i < 10; ++i) ts.Add(new Tick { DateTime = new DateTime(2000, 1, 1, 10, i, 30) }); var firstDt = new DateTime(2000, 1, 1, 10, 3, 30); var firstTick = new Tick { DateTime = firstDt }; var lastDt = new DateTime(2000, 1, 1, 10, 9, 30); var lastTick = new Tick { DateTime = lastDt }; // DateTime is in the middle; Assert.Equal(3, ts.GetIndex(firstDt, IndexOption.Null)); Assert.Equal(-1, ts.GetIndex(new DateTime(2000, 1, 1, 10, 4, 25), IndexOption.Null)); Assert.Equal(4, ts.GetIndex(new DateTime(2000, 1, 1, 10, 4, 30), IndexOption.Null)); Assert.Equal(4, ts.GetIndex(new DateTime(2000, 1, 1, 10, 4, 30), IndexOption.Prev)); Assert.Equal(4, ts.GetIndex(new DateTime(2000, 1, 1, 10, 4, 30), IndexOption.Next)); Assert.Equal(-1, ts.GetIndex(new DateTime(2000, 1, 1, 10, 4, 25), IndexOption.Null)); Assert.Equal(3, ts.GetIndex(new DateTime(2000, 1, 1, 10, 4, 25), IndexOption.Prev)); Assert.Equal(4, ts.GetIndex(new DateTime(2000, 1, 1, 10, 4, 25), IndexOption.Next)); Assert.Equal(-1, ts.GetIndex(new DateTime(2000, 1, 1, 10, 4, 40), IndexOption.Null)); Assert.Equal(4, ts.GetIndex(new DateTime(2000, 1, 1, 10, 4, 40), IndexOption.Prev)); Assert.Equal(5, ts.GetIndex(new DateTime(2000, 1, 1, 10, 4, 40), IndexOption.Next)); // DateTime > LastDateTime Assert.Equal(5, ts.GetIndex(new DateTime(2000, 1, 1, 10, 4, 40), IndexOption.Next)); Assert.Equal(-1, ts.GetIndex(new DateTime(2000, 1, 1, 10, 11, 30), IndexOption.Null)); Assert.Equal(9, ts.GetIndex(new DateTime(2000, 1, 1, 10, 11, 30), IndexOption.Prev)); Assert.Equal(-1, ts.GetIndex(new DateTime(2000, 1, 1, 10, 11, 30), IndexOption.Next)); // DateTime < FirstDateTime Assert.Equal(-1, ts.GetIndex(new DateTime(2000, 1, 1, 9, 31, 30), IndexOption.Null)); Assert.Equal(-1, ts.GetIndex(new DateTime(2000, 1, 1, 9, 31, 30), IndexOption.Prev)); Assert.Equal(0, ts.GetIndex(new DateTime(2000, 1, 1, 9, 31, 30), IndexOption.Next)); }
public static BarSeries TimeCompress(this TickSeries series, long barSize, byte type = DataObjectType.Trade) { if (series.Count == 0) { return(new BarSeries()); } return(TimeCompress(series, GetInstrument(series), barSize, type)); }
public static BarSeries TimeCompress(this TickSeries series, Instrument inst, long barSize, byte type = DataObjectType.Trade) { if (series.Count == 0) { return(new BarSeries()); } return(Data.Compression.BarCompressor .GetCompressor(inst, 0, barSize) .Compress(new Data.Compression.TickDataEnumerator(series, type))); }
public void OutputSeries(out IDataSeries trades, out IDataSeries bids, out IDataSeries asks) { trades = new TickSeries(); bids = new TickSeries(); asks = new TickSeries(); PbTickCodec codec = new PbTickCodec(); int TradingDay = -1; int _lastTradeSize = 0; foreach (var s in Series) { if (TradingDay != s.TradingDay) { _lastTradeSize = 0; TradingDay = s.TradingDay; } var dateTime = codec.GetDateTime(s.ActionDay == 0 ? s.TradingDay : s.ActionDay).Add(codec.GetUpdateTime(s)); var tick = PbTick2DepthMarketDataNClass(codec, s); if (SubscribeExternData) { var trade = new TradeEx(dateTime, 0, _InstrumentId, tick.LastPrice, (int)tick.Volume); trade.Size -= _lastTradeSize; trade.DepthMarketData = tick; trades.Add(trade); } else { var trade = new Trade(dateTime, 0, _InstrumentId, tick.LastPrice, (int)tick.Volume); trade.Size -= _lastTradeSize; trades.Add(trade); } if (tick.Bids != null && tick.Bids.Length > 0) { var bid = new Bid(dateTime, 0, _InstrumentId, tick.Bids[0].Price, tick.Bids[0].Size); bids.Add(bid); } if (tick.Asks != null && tick.Asks.Length > 0) { var ask = new Ask(dateTime, 0, _InstrumentId, tick.Asks[0].Price, tick.Asks[0].Size); asks.Add(ask); } _lastTradeSize = (int)tick.Volume; } }
public void ReadFile(int instrumentId, string path) { Bars = new BarSeries(); Trades = new TickSeries(); Asks = new TickSeries(); Bids = new TickSeries(); PbTickSerializer pts = new PbTickSerializer(); PbTick restore = null; using (Stream stream = File.OpenRead(path)) { while (true) { restore = pts.ReadOne(stream); if (restore == null) { break; } Trade t = new Trade(); t.InstrumentId = instrumentId; t.DateTime = pts.Codec.GetActionDayDateTime(restore); t.Price = pts.Codec.GetLastPrice(restore); t.Size = (int)pts.Codec.GetVolume(restore); Trades.Add(t); Bid b = new Bid(); b.InstrumentId = instrumentId; b.DateTime = t.DateTime; b.Price = pts.Codec.GetBidPrice(restore, 1); b.Size = pts.Codec.GetBidSize(restore, 1); Bids.Add(b); Ask a = new Ask(); a.InstrumentId = instrumentId; a.DateTime = t.DateTime; a.Price = pts.Codec.GetAskPrice(restore, 1); a.Size = pts.Codec.GetAskSize(restore, 1); Asks.Add(a); } stream.Close(); } }
public void TestGetIndex() { var ts = new TickSeries("test"); for (int i = 0; i < 10; ++i) { ts.Add(new Tick { DateTime = new DateTime(2000, 1, 1, 10, i, 30) }); } var firstDt = new DateTime(2000, 1, 1, 10, 3, 30); var firstTick = new Tick { DateTime = firstDt }; var lastDt = new DateTime(2000, 1, 1, 10, 9, 30); var lastTick = new Tick { DateTime = lastDt }; // DateTime is in the middle; Assert.Equal(3, ts.GetIndex(firstDt, IndexOption.Null)); Assert.Equal(-1, ts.GetIndex(new DateTime(2000, 1, 1, 10, 4, 25), IndexOption.Null)); Assert.Equal(4, ts.GetIndex(new DateTime(2000, 1, 1, 10, 4, 30), IndexOption.Null)); Assert.Equal(4, ts.GetIndex(new DateTime(2000, 1, 1, 10, 4, 30), IndexOption.Prev)); Assert.Equal(4, ts.GetIndex(new DateTime(2000, 1, 1, 10, 4, 30), IndexOption.Next)); Assert.Equal(-1, ts.GetIndex(new DateTime(2000, 1, 1, 10, 4, 25), IndexOption.Null)); Assert.Equal(3, ts.GetIndex(new DateTime(2000, 1, 1, 10, 4, 25), IndexOption.Prev)); Assert.Equal(4, ts.GetIndex(new DateTime(2000, 1, 1, 10, 4, 25), IndexOption.Next)); Assert.Equal(-1, ts.GetIndex(new DateTime(2000, 1, 1, 10, 4, 40), IndexOption.Null)); Assert.Equal(4, ts.GetIndex(new DateTime(2000, 1, 1, 10, 4, 40), IndexOption.Prev)); Assert.Equal(5, ts.GetIndex(new DateTime(2000, 1, 1, 10, 4, 40), IndexOption.Next)); // DateTime > LastDateTime Assert.Equal(5, ts.GetIndex(new DateTime(2000, 1, 1, 10, 4, 40), IndexOption.Next)); Assert.Equal(-1, ts.GetIndex(new DateTime(2000, 1, 1, 10, 11, 30), IndexOption.Null)); Assert.Equal(9, ts.GetIndex(new DateTime(2000, 1, 1, 10, 11, 30), IndexOption.Prev)); Assert.Equal(-1, ts.GetIndex(new DateTime(2000, 1, 1, 10, 11, 30), IndexOption.Next)); // DateTime < FirstDateTime Assert.Equal(-1, ts.GetIndex(new DateTime(2000, 1, 1, 9, 31, 30), IndexOption.Null)); Assert.Equal(-1, ts.GetIndex(new DateTime(2000, 1, 1, 9, 31, 30), IndexOption.Prev)); Assert.Equal(0, ts.GetIndex(new DateTime(2000, 1, 1, 9, 31, 30), IndexOption.Next)); }
/// <summary> /// 下载 Tick 数据,返回值(ask,bid,trade) /// </summary> /// <param name="manager"></param> /// <param name="inst"></param> /// <param name="dateTime1"></param> /// <param name="dateTime2"></param> /// <returns></returns> public static (TickSeries asks, TickSeries bids, TickSeries trades) DownloadTicks(this DataManager manager, Instrument inst, DateTime dateTime1, DateTime dateTime2) { var asks = new TickSeries(); var bids = new TickSeries(); var trades = new TickSeries(); var request = new HistoricalDataRequest() { RequestId = Guid.NewGuid().ToString("N"), DataType = DataObjectType.Tick, Instrument = inst, DateTime1 = dateTime1, DateTime2 = dateTime2 }; DownloadDataRequest(manager.GetFramework(), request, OnHistoricalData); return(asks, bids, trades); void OnHistoricalData(HistoricalData data) { foreach (var item in data.Objects) { switch (item.TypeId) { case DataObjectType.Ask: asks.Add((Ask)item); break; case DataObjectType.Bid: bids.Add((Bid)item); break; case DataObjectType.Trade: trades.Add((Trade)item); break; default: break; } } } }
public Strategy(Framework framework, string name) { this.framework = framework; this.Name = name; this.strategiesByInstrument = new IdArray<LinkedList<Strategy>>(1000); this.strategyByOrderId = new IdArray<Strategy>(1000); this.strategies = new LinkedList<Strategy>(); this.status = StrategyStatus.Stopped; this.instruments = new InstrumentList(); this.instrumentCountTable = new IdArray<int>(1000); if (framework != null) { this.portfolio = new Portfolio(framework, this.Name); framework.PortfolioManager.Add(this.portfolio); } this.bars = new BarSeries("", ""); this.equity = new TimeSeries(); this.bids = new TickSeries(""); this.asks = new TickSeries(""); this.stops = new List<Stop>(); this.stopsByInstrument = new IdArray<List<Stop>>(1000); }
public TickSeries GetHistoricalTrades(IHistoricalDataProvider provider, Instrument instrument, DateTime dateTime1, DateTime dateTime2) { HistoricalDataRequest request = new HistoricalDataRequest(instrument, dateTime1, dateTime2, 4); provider.Send(request); this.handle = new ManualResetEventSlim(false); this.handle.Wait(); TickSeries tickSeries = new TickSeries(""); if (this.historicalData != null) { foreach (HistoricalData current in this.historicalData) { DataObject[] objects = current.Objects; for (int i = 0; i < objects.Length; i++) { DataObject dataObject = objects[i]; tickSeries.Add((Trade)dataObject); } } } this.historicalData = null; return tickSeries; }
public static (TickSeries, TickSeries, TickSeries) MarketDataToTick(IEnumerable <DepthMarketDataField> items, Instrument inst) { var asks = new TickSeries(); var bids = new TickSeries(); var trades = new TickSeries(); var last = EmptyMarketData; foreach (var item in items) { var dateTime = item.ExchangeDateTime(); var size = item.Volume - last.Volume; //var openInterest = item.OpenInterest - last.OpenInterest; var turnover = double.NaN; if (item.Turnover > last.Turnover) { turnover = item.Turnover - last.Turnover; } else { turnover = (item.Turnover / item.Volume) * size; } var trade = new Trade(dateTime, dateTime, QuantBoxConst.PIdCtp, inst.Id, item.LastPrice, (int)size); trade.SetMarketData(turnover, item.OpenInterest); trades.Add(trade); if (item.Asks?.Length > 0) { asks.Add(new Ask(dateTime, dateTime, QuantBoxConst.PIdCtp, inst.Id, item.Asks[0].Price, item.Asks[0].Size)); } if (item.Bids?.Length > 0) { bids.Add(new Bid(dateTime, dateTime, QuantBoxConst.PIdCtp, inst.Id, item.Bids[0].Price, item.Bids[0].Size)); } last = item; } return(asks, bids, trades); }
public TickSeries GetHistoricalTicks(TickType type, Instrument instrument, DateTime dateTime1, DateTime dateTime2) { DataSeries ds = null; switch (type) { case TickType.Bid: ds = GetDataSeries(instrument, DataObjectType.Bid, BarType.Time, 60); break; case TickType.Ask: ds = GetDataSeries(instrument, DataObjectType.Ask, BarType.Time, 60); break; case TickType.Trade: ds = GetDataSeries(instrument, DataObjectType.Trade, BarType.Time, 60); break; } var ts = new TickSeries(); if (ds != null && ds.Count != 0) { var index1 = ds.GetIndex(dateTime1, SearchOption.Next); var index2 = ds.GetIndex(dateTime2, SearchOption.Prev); for (long i = index1; i <= index2; i++) { var obj = ds[i]; switch (type) { case TickType.Bid: if (obj.TypeId == DataObjectType.Bid) ts.Add((Bid)obj); else Console.WriteLine($"DataManager::GetHistoricalTicks Error, object type is not Bid {obj}"); break; case TickType.Ask: if (obj.TypeId == DataObjectType.Ask) ts.Add((Ask)obj); else Console.WriteLine($"DataManager::GetHistoricalTicks Error, object type is not Ask {obj}"); break; case TickType.Trade: if (obj.TypeId == DataObjectType.Trade) ts.Add((Trade)obj); else Console.WriteLine($"DataManager::GetHistoricalTicks Error, object type is not Trade {obj}"); break; } } } return ts; }
public TickDataEnumerator(TickSeries series) : base(series.Count) { this.series = series; }
public void OutputSeries(out IDataSeries trades, out IDataSeries bids, out IDataSeries asks) { trades = new TickSeries(); bids = new TickSeries(); asks = new TickSeries(); PbTickCodec codec = new PbTickCodec(); int TradingDay = -1; int _lastTradeSize = 0; foreach (var s in Series) { if(TradingDay != s.TradingDay) { _lastTradeSize = 0; TradingDay = s.TradingDay; } var dateTime = codec.GetDateTime(s.ActionDay == 0 ? s.TradingDay : s.ActionDay).Add(codec.GetUpdateTime(s)); var tick = PbTick2DepthMarketDataNClass(codec, s); if(SubscribeExternData) { var trade = new TradeEx(dateTime, 0, _InstrumentId, tick.LastPrice, (int)tick.Volume); trade.Size -= _lastTradeSize; trade.DepthMarketData = tick; trades.Add(trade); } else { var trade = new Trade(dateTime, 0, _InstrumentId, tick.LastPrice, (int)tick.Volume); trade.Size -= _lastTradeSize; trades.Add(trade); } if (tick.Bids != null && tick.Bids.Length > 0) { var bid = new Bid(dateTime, 0, _InstrumentId, tick.Bids[0].Price, tick.Bids[0].Size); bids.Add(bid); } if (tick.Asks != null && tick.Asks.Length > 0) { var ask = new Ask(dateTime, 0, _InstrumentId, tick.Asks[0].Price, tick.Asks[0].Size); asks.Add(ask); } _lastTradeSize = (int)tick.Volume; } }
public TickDataEnumerator(TickSeries series, byte type = DataObjectType.Trade) : base(series.Count) { _series = series; _type = type; }
public override void Run() { // Prepare running. Console.WriteLine("Prepare running in {0} mode...", framework.StrategyManager.Mode); // Get trading instruments. Instrument ins1 = InstrumentManager.Instruments["IF1612"]; // Create SMA Crossover with Loading data on start strategy. // and add trading instruments. DoubleMA_Crossover smaCrossoverLOS = new DoubleMA_Crossover(framework, "SMACrossoverLOS"); smaCrossoverLOS.Instruments.Add(ins1); // Set strategy as main. strategy = smaCrossoverLOS; Console.WriteLine("Prepare running in {0} mode...", framework.StrategyManager.Mode); // 开始时间是前一个交易日,这个地方要按自己策略的实际情况进行调整 DateTime startDate = DateTime.Now.DayOfWeek == DayOfWeek.Monday ? DateTime.Now.AddDays(-3).Date : DateTime.Now.AddDays(-1).Date; DateTime historicalData1EndTime = startDate; // 取本地的数据的最后时间 DataSeries ins1DataSeries = framework.DataManager.GetDataSeries(ins1, DataObjectType.Trade); if (ins1DataSeries != null && ins1DataSeries.Count > 0) { historicalData1EndTime = ins1DataSeries.DateTime2; } // 以两个时间的最大值为起点 historicalData1EndTime = new DateTime(Math.Max(historicalData1EndTime.Ticks, startDate.Ticks)); // Load and save historical trades from QuantBase provider. IHistoricalDataProvider quantBase = framework.ProviderManager.GetHistoricalDataProvider(94); if (quantBase.Status == ProviderStatus.Disconnected) { quantBase.Connect(); } // 等待连接成功,订阅太快了不行 while (!quantBase.IsConnected) { Thread.Sleep(1000); } // Load historical trades. Console.WriteLine("Load historical data."); TickSeries ins1TickSeries = framework.DataManager.GetHistoricalTrades(quantBase, ins1, historicalData1EndTime, DateTime.Now); Console.WriteLine("Save historical data."); // Save historical trades. foreach (Trade trade in ins1TickSeries) { framework.DataManager.Save(ins1, trade); } // Set DataSimulator's dates. DataSimulator.DateTime1 = startDate; DataSimulator.DateTime2 = DateTime.Now; // Set null for event filter. framework.EventManager.Filter = null; // Set property for suspend trading during simulation. DoubleMA_Crossover.SuspendTrading = true; // Add 5 minute bars (300 seconds) for trading instruments. BarFactory.Add(ins1, SmartQuant.BarType.Time, barSize); // Run in simulation. Console.WriteLine("Run in Backtest mode."); // Save current strategy mode. StrategyMode mode = framework.StrategyManager.Mode; // Set backtest mode. framework.StrategyManager.Mode = StrategyMode.Backtest; StartStrategy(StrategyMode.Backtest); // Run. Console.WriteLine("Run in {0} mode.", framework.StrategyManager.Mode); // Restore strategy mode. framework.StrategyManager.Mode = mode; // Get provider for realtime. Provider quantRouter = framework.ProviderManager.GetProvider(99) as Provider; if (quantRouter.Status == ProviderStatus.Disconnected) { quantRouter.Connect(); } while (!quantRouter.IsConnected) { Thread.Sleep(1000); } // Set property for trading. DoubleMA_Crossover.SuspendTrading = false; if (framework.StrategyManager.Mode == StrategyMode.Paper) { // Set QuantRouter as data provider. strategy.DataProvider = quantRouter as IDataProvider; } else if (framework.StrategyManager.Mode == StrategyMode.Live) { // Set QuantRouter as data and execution provider. strategy.DataProvider = quantRouter as IDataProvider; strategy.ExecutionProvider = quantRouter as IExecutionProvider; } StartStrategy(framework.StrategyManager.Mode); }
public void Save(TickSeries series, SaveMode option = SaveMode.Add) { foreach (var tick in series) Save(tick, option); }
private static Instrument GetInstrument(TickSeries series) { return(Framework.Current.InstrumentManager.GetById(series[0].InstrumentId)); }
/// <summary> /// 生成日线 /// </summary> /// <param name="series"></param> /// <returns></returns> public static BarSeries DayCompress(this TickSeries series) { return(TimeCompress(series, QuantBoxConst.DayBarSize)); }
/// <summary> /// 生成1分钟Bar /// </summary> /// <param name="series"></param> /// <returns></returns> public static BarSeries MinuteCompress(this TickSeries series, byte type = DataObjectType.Trade) { return(TimeCompress(series, 60, type)); }
static void _Main(string[] args) { CsvDataImport cdi = new CsvDataImport(); string symbol = "AAPL2"; Framework framework = Framework.Current; Instrument instrument = framework.InstrumentManager.Get(symbol); if (instrument == null) { instrument = new Instrument(SmartQuant.InstrumentType.Stock, symbol, "", CurrencyId.CNY); framework.InstrumentManager.Add(instrument); } TickSeries trades = new TickSeries(); TickSeries bids = new TickSeries(); TickSeries asks = new TickSeries(); BarSeries bars = new BarSeries(); //using (StreamReader file = File.OpenText(@"d:\wukan\Desktop\AAPL.Bar Time 86400.csv")) FileInfo fi = new FileInfo(@"D:\AAPL.BarTime86400.csv"); using (StreamReader file = new StreamReader(fi.OpenRead())) { int i = 0; string str = file.ReadLine(); do { ++i; str = file.ReadLine(); if (str == null) { break; } string[] arr = str.Split(','); Trade trade = null; Bid bid = null; Ask ask = null; Bar bar = null; //cdi.ReadLine(arr, instrument.Id, out trade, out bid, out ask); cdi.ReadLine(arr, instrument.Id, SmartQuant.BarType.Time, 86400, out bar); if (trade != null) { trades.Add(trade); } if (bid != null) { bids.Add(bid); } if (ask != null) { asks.Add(ask); } if (bar != null) { bars.Add(bar); } } while (str != null); file.Close(); } if (trades.Count > 0) { framework.DataManager.Save(trades); } if (bids.Count > 0) { framework.DataManager.Save(bids); } if (asks.Count > 0) { framework.DataManager.Save(asks); } if (bars.Count > 0) { framework.DataManager.Save(bars); } framework.Dispose(); }
public TickSeries GetHistoricalTicks(IHistoricalDataProvider provider, TickType type, Instrument instrument, DateTime dateTime1, DateTime dateTime2) { if (provider.IsDisconnected) provider.Connect(); DataNotifier @class = new DataNotifier(); string text = Guid.NewGuid().ToString(); lock (this.dictionary_0) { this.dictionary_0.Add(text, @class); } HistoricalDataRequest request = null; switch (type) { case TickType.Bid: request = new HistoricalDataRequest(instrument, dateTime1, dateTime2, DataObjectType.Bid); break; case TickType.Ask: request = new HistoricalDataRequest(instrument, dateTime1, dateTime2, DataObjectType.Ask); break; case TickType.Trade: request = new HistoricalDataRequest(instrument, dateTime1, dateTime2, DataObjectType.Trade); break; } request.RequestId = text; provider.Send(request); @class.ReadyEvent.WaitOne(); lock (this.dictionary_0) { this.dictionary_0.Remove(text); } var ts = new TickSeries("", ""); foreach (var data in @class.Data) { var objs = data.Objects; foreach (var tick in objs) ts.Add((Tick)tick); } return ts; }