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 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 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 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); }
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 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 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; }
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 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; }