public List <OHLCBar> GetData(EntityModel.Instrument instrument, DateTime from, DateTime to, BarSize frequency = BarSize.OneDay) { if (!_client.Connected) { return(null); } RefreshInstrumentsList(); var qdmsInst = instrument.GetQDMSInstrument(_instrumentsList); if (qdmsInst == null) //nothing like this in QDMS, just grab local data { return(null); } StoredDataInfo dataInfo = TryGetStorageInfo(qdmsInst); //Here we check if there's is absolutely no if ((dataInfo == null || dataInfo.LatestDate < from || dataInfo.EarliestDate > to) && !_allowFreshData) { return(null); } //grab the data return(RequestData(qdmsInst, from, to, frequency)); }
public List <OHLCBar> GetAllData(EntityModel.Instrument instrument, BarSize frequency = BarSize.OneDay) { if (!_client.Connected) { return(new List <OHLCBar>()); } RefreshInstrumentsList(); //find instrument var qdmsInst = instrument.GetQDMSInstrument(_instrumentsList); if (qdmsInst == null) //nothing like this in QDMS, just grab local data { return(new List <OHLCBar>()); } StoredDataInfo dataInfo = TryGetStorageInfo(qdmsInst); if (dataInfo == null) { return(new List <OHLCBar>()); } return(GetData( instrument, dataInfo.EarliestDate, dataInfo.LatestDate, frequency)); }
public decimal?GetLastPrice(EntityModel.Instrument instrument, out DateTime lastDate) { lastDate = new DateTime(1, 1, 1); var qdmsInst = instrument.GetQDMSInstrument(_instrumentsList); if (qdmsInst == null || !qdmsInst.ID.HasValue) { return(null); } StoredDataInfo dataInfo = TryGetStorageInfo(qdmsInst); if (dataInfo == null) { return(null); } var lastAvailableDate = dataInfo.LatestDate; //Send out the request for the data var req = new HistoricalDataRequest { Instrument = qdmsInst, StartingDate = lastAvailableDate.AddDays(-1), EndingDate = lastAvailableDate, Frequency = BarSize.OneDay, DataLocation = _allowFreshData ? DataLocation.Both : DataLocation.LocalOnly, RTHOnly = true, SaveDataToStorage = false }; var id = _client.RequestHistoricalData(req); _requestIDs.Add(id, false); //Wait until the data arrives int i = 0; while (i < 100) { Thread.Sleep(20); lock (_arrivedDataLock) { if (_requestIDs[id]) { var data = _arrivedData[qdmsInst.ID.Value].Last(); _arrivedData.Remove(qdmsInst.ID.Value); lastDate = data.DT; return(data.Close); } } i++; } return(null); }
/// <summary> /// Retrieve a list of sessions that describe the regular trading hours for this instrument. /// </summary> public List <InstrumentSession> GetSessions(EntityModel.Instrument instrument) { RefreshInstrumentsList(); var qdmsInstrument = instrument.GetQDMSInstrument(_instrumentsList); if (qdmsInstrument == null || qdmsInstrument.Sessions == null) { _logger.Log(LogLevel.Info, string.Format("QDMS instrument not found for local instrument: {0}", instrument)); return(new List <InstrumentSession>()); } return(qdmsInstrument.Sessions.ToList()); }
/// <summary> /// Returns the QPAS statistics for a QuantConnect Algorithm (uses Equity Curve) /// </summary> /// <param name="fromDate"></param> /// <param name="toDate"></param> /// <param name="trades"></param> /// <param name="totalPerformance"></param> /// <param name="rollingPerformances"></param> /// <param name="summary"></param> /// <param name="startingCapital"></param> /// <returns>QPAS Performance Statistics (JSON)</returns> public static string GetPerformanceQPAS( DateTime fromDate, DateTime toDate, List<Trade> trades, AlgorithmPerformance totalPerformance, Dictionary<string, AlgorithmPerformance> rollingPerformances, Dictionary<string, string> summary, decimal startingCapital) { if (trades.Count <= 0) return ""; // Equity Curve Statistics var qpasEC = new QPAS.EquityCurve((double)startingCapital, totalPerformance.TradeStatistics.StartDateTime); foreach (var trade in trades) qpasEC.AddChange((double)trade.ProfitLoss, trade.ExitTime); var equityCurveStatsQPAS = QPAS.PerformanceMeasurement.EquityCurveStats(qpasEC, (int)(toDate - fromDate).TotalDays); // Trade Statistics var instrument = new EntityModel.Instrument { ID = 1, Multiplier = 1, AssetCategory = EntityModel.AssetClass.Cash }; instrument.Symbol = trades[0].Symbol.Value; var qpasTrades = new List<EntityModel.Trade>(); foreach (var trade in trades) { var qpasTrade = new EntityModel.Trade(); qpasTrade.Orders = new List<EntityModel.Order> { // Open Order new EntityModel.Order { Instrument = instrument, Quantity = trade.Quantity, Price = trade.EntryPrice, BuySell = trade.BuyOrSell, TradeDate = trade.EntryTime, AssetCategory = EntityModel.AssetClass.Cash }, // Close Order new EntityModel.Order { Instrument = instrument, Quantity = trade.Quantity, Price = trade.ExitPrice, BuySell = trade.BuyOrSellClose, TradeDate = trade.ExitTime, AssetCategory = EntityModel.AssetClass.Cash } }; qpasTrade.ResultDollars = trade.ProfitLoss; qpasTrade.Commissions = trade.TotalFees; qpasTrades.Add(qpasTrade); } var capitalInPeriod = new List<decimal>(); var capital = startingCapital; capitalInPeriod.Add(capital); foreach (var trade in trades) { capital += trade.ProfitLoss; capitalInPeriod.Add(capital); } var tradeStatsQPAS = QPAS.PerformanceMeasurement.TradeStats(qpasTrades, fromDate, toDate, capitalInPeriod); // Merge Results into a Sorted Dictionary var statsQPAS = new SortedDictionary<string, string>(); foreach (KeyValuePair<string, string> entry in equityCurveStatsQPAS) statsQPAS.Add(entry.Key + " (Equity)", entry.Value); foreach (KeyValuePair<string, string> entry in tradeStatsQPAS) statsQPAS.Add(entry.Key + " (Trade)", entry.Value); // Return result as JSON return JsonConvert.SerializeObject(statsQPAS, Formatting.Indented); }