Пример #1
0
 public HistoricalDataCacheFile(MarketSeriesBase series, DateTime chunkDate)
 {
     this.MarketSeriesBase = series;
     this.Feed             = series.Feed;
     GetChunkRange(TimeFrame, chunkDate, out startDate, out endDate);
     FilePath = GetFilePath();
 }
Пример #2
0
 public SpotwareDataJob(MarketSeriesBase series) : base(series)
 {
     if (this.Account == null)
     {
         throw new ArgumentException("MarketSeries must have an Account of type CTraderAccount");
     }
 }
Пример #3
0
 public LoadHistoricalDataJob(MarketSeriesBase series) : this()
 {
     if (series == null)
     {
         throw new ArgumentNullException(nameof(series));
     }
     this.MarketSeriesBase = series;
 }
Пример #4
0
 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();
 }
Пример #5
0
        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);
        }
Пример #6
0
        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);
            //}
        }
Пример #7
0
        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);
        }
Пример #8
0
 public DataLoadResult(MarketSeriesBase series)
 {
     this.MarketSeriesBase = series;
 }