public HistoricalDataCacheFile(MarketSeriesBase series, DateTime chunkDate) { this.MarketSeriesBase = series; this.Feed = series.Feed; GetChunkRange(TimeFrame, chunkDate, out startDate, out endDate); FilePath = GetFilePath(); }
public SpotwareDataJob(MarketSeriesBase series) : base(series) { if (this.Account == null) { throw new ArgumentException("MarketSeries must have an Account of type CTraderAccount"); } }
public LoadHistoricalDataJob(MarketSeriesBase series) : this() { if (series == null) { throw new ArgumentNullException(nameof(series)); } this.MarketSeriesBase = series; }
public HistoricalDataCacheFile(MarketSeriesBase series, DateTime start, DateTime end, DateTime queryDate) { this.MarketSeriesBase = series; this.Feed = series.Feed; this.StartDate = start; this.EndDate = end; this.QueryDate = queryDate; this.FilePath = GetFilePath(); }
public static async Task <HistoricalDataCacheFile> GetCacheFile(MarketSeriesBase marketSeries, DateTime chunkDate) { HistoricalDataCacheFile cacheFile = cache.GetOrAdd( GetKey(marketSeries.Feed.Template.BrokerName, marketSeries.SymbolCode, marketSeries.TimeFrame, chunkDate), _ => new HistoricalDataCacheFile(marketSeries, chunkDate) ); await cacheFile.EnsureLoaded().ConfigureAwait(false); return(cacheFile); }
public static TimeSpan?GetDefaultMaxOutOfDate(MarketSeriesBase series) { var bt = (series.HasAccount && series.Account.IsBacktesting) || !App.Get/*todo*/ <TradingOptions>().Features.HasAnyFlag(TradingFeatures.Participants); double totalSeconds = default(double); var settings = App.GetComponent <DataMaxOutOfDateTimeSpans>(); if (settings != null) { totalSeconds = settings.TryGetValue(series.TimeFrame.TimeFrameUnit); } if (totalSeconds == default(double)) { settings = bt ? DataMaxOutOfDateTimeSpans.BacktestingDefault : DataMaxOutOfDateTimeSpans.Default; totalSeconds = settings.TryGetValue(series.TimeFrame.TimeFrameUnit); } if (totalSeconds == default(double)) { throw new NotImplementedException("No settings found for Timeframe: " + series.TimeFrame); } var result = TimeSpan.FromSeconds(totalSeconds * series.TimeFrame.TimeFrameValue); return(result); //switch (series.TimeFrame.TimeFrameUnit) //{ // case TimeFrameUnit.Tick: return bt ? DefaultBacktestingMaxOutOfDateT1 : TimeSpan.FromSeconds(DefaultMaxOutOfDateT1.TotalSeconds * series.TimeFrame.TimeFrameValue); // case TimeFrameUnit.Minute: return bt ? DefaultBacktestingMaxOutOfDateM1 : TimeSpan.FromSeconds(DefaultMaxOutOfDateM1.TotalSeconds * series.TimeFrame.TimeFrameValue); // case TimeFrameUnit.Hour: return bt ? DefaultBacktestingMaxOutOfDateH1 : TimeSpan.FromSeconds(DefaultMaxOutOfDateH1.TotalSeconds * series.TimeFrame.TimeFrameValue); // case TimeFrameUnit.Day: return bt ? DefaultBacktestingMaxOutOfDateD1 : TimeSpan.FromSeconds(DefaultMaxOutOfDateD1.TotalSeconds * series.TimeFrame.TimeFrameValue); // default: throw new NotImplementedException("Timeframe: " + series.TimeFrame); //} }
public async Task <DataLoadResult> RetrieveDataForChunk(MarketSeriesBase series, DateTime date, bool cacheOnly = false, bool writeCache = true, TimeSpan?maxOutOfDate = null, CancellationToken?token = null) { var result = new DataLoadResult(series); DateTime chunkStart; DateTime chunkEnd; HistoricalDataCacheFile.GetChunkRange(series.TimeFrame, date, out chunkStart, out chunkEnd); result.QueryDate = DateTime.UtcNow; var key = $"{series.ToString()};{date.ToString()};{cacheOnly};{writeCache};{maxOutOfDate}"; bool created = false; tryagain: var job = jobs.GetOrAdd(key, k => { created = true; return(new SpotwareDataJob(series) { StartTime = chunkStart, EndTime = chunkEnd, WriteCache = writeCache, LinkWithAccountData = !cacheOnly, CancellationToken = token, }); }); if (!created) { if (DateTime.UtcNow - job.CreateDate > TimeSpan.FromMinutes(1)) { if (jobs.TryRemove(key, out job)) { goto tryagain; } } else { await job.Wait().ConfigureAwait(false); } } await job.Start().ConfigureAwait(false); await job.Wait().ConfigureAwait(false); if (job.Faulted) { result.Faulted = true; return(result); } if (job.ResultCount > 0) { result.IsAvailable = true; } result.Bars = job.ResultBars; result.Ticks = job.ResultTicks; result.StartDate = chunkStart; result.EndDate = chunkEnd; if (result.QueryDate < chunkEnd) { result.IsPartial = true; } return(result); }
public DataLoadResult(MarketSeriesBase series) { this.MarketSeriesBase = series; }