Пример #1
0
        public override DataLoadResult Load()
        {
            DataLoadResult result = DataLoadResult.NothingLoaded;

            if (amigaMusicOk || amigaSoundOk || amigaGraphicsOk)
            {
                var amigaResult = amiga.Load();

                if (!amigaResult.HasFlag(DataLoadResult.GraphicsLoaded))
                {
                    amigaGraphicsOk = false;
                }
                if (!amigaResult.HasFlag(DataLoadResult.MusicLoaded))
                {
                    amigaMusicOk = false;
                }
                if (!amigaResult.HasFlag(DataLoadResult.SoundLoaded))
                {
                    amigaSoundOk = false;
                }

                result |= amigaResult;
            }

            if (dosOk)
            {
                var dosResult = dos.Load();
                dosOk   = dosResult != DataLoadResult.NothingLoaded;
                result |= dosResult;
            }

            return(result);
        }
Пример #2
0
        public async Task <DataLoadResult> PerformDataLoad()
        {
            try
            {
                // Step 0: Prepare data load response object
                DataLoadResult result             = new DataLoadResult();
                int            accountsProcessed  = 0;
                int            positionsProcessed = 0;

                // Step 1: Fetch all accounts in SQL Server Accounts table
                var accounts = _context.Accounts.ToList();

                foreach (Accounts account in accounts)
                {
                    // Step 2: Iterate through each account and grab positions
                    var positionsByAccount = _context.Positions.Where(x => x.AccountId == account.Id).ToList();

                    // Step 3: Generate performance report
                    var reportObject =
                        await _performanceReportCalculator.GeneratePortfolioPerformanceReport(account,
                                                                                              positionsByAccount, DataRequestType.RequestType.HistoricalMarketDataRequest);

                    var performanceReport = reportObject;

                    // Step 4: Insert performance data into Mongo DB
                    var performanceReportAsBson = performanceReport.ToBsonDocument();

                    await _mongoCollection.InsertOneAsync(performanceReportAsBson);

                    accountsProcessed++;
                }

                // Step 5: Return the data load results
                result.AccountsProcessed = accountsProcessed;

                if (accountsProcessed > 0)
                {
                    result.Status = "OK";
                }
                else
                {
                    result.Status = "PARTIAL LOAD";
                }

                return(result);
            }
            catch (Exception e)
            {
                DataLoadResult result = new DataLoadResult()
                {
                    AccountsProcessed = 0,
                    Status            = "FAILED"
                };

                return(result);
            }
        }
Пример #3
0
 private static void ImportData(MarketSeriesBase series, DataLoadResult result)
 {
     //UpdateProgress(0.97, "Loading data into memory");
     if (series.TimeFrame == "t1")
     {
         var tickSeries = (MarketTickSeries)series;
         tickSeries.Add(result.Ticks, result.StartDate, result.EndDate);
     }
     else
     {
         var barSeries = (MarketSeries)series;
         barSeries.Add(result.Bars, result.StartDate, result.EndDate);
     }
     series.RaiseLoadHistoricalDataCompleted(result.StartDate, result.EndDate);
     //Debug.WriteLine($"[{series} - data imported]  {result} with {result.Count} items: now has {series.Count} items total");
 }
Пример #4
0
    public static DataLoadResult LoadData()
    {
        DataLoadResult result = new DataLoadResult();

        string dataFilePath = Path.Combine(Application.persistentDataPath, "playerSave.dat");

        if (File.Exists(dataFilePath))
        {
            BinaryFormatter formatter = new BinaryFormatter();
            using (FileStream stream = File.Open(dataFilePath, FileMode.Open))
            {
                result.Data         = (Data)formatter.Deserialize(stream);
                result.IsDataLoaded = true;
            }
        }

        return(result);
    }
Пример #5
0
        public static async Task <IEnumerable <DataLoadResult> > GetData(this IHistoricalDataProvider provider, MarketSeriesBase series, DateTime?startDate, DateTime endDate, bool cacheOnly = false, bool writeCache = true, TimeSpan?maxOutOfDate = null, int totalDesiredBars = 0, bool forceRetrieve = false, bool forceReretrieveEmptyData = false, CancellationToken?cancellationToken = null)
        {
            logger.LogTrace($"[GetData] {series} {startDate} - {endDate}");
            await series.DataLock.WaitAsync().ConfigureAwait(false);

            try
            {
                if (!startDate.HasValue)
                {
                    startDate = endDate;
                }
                if (!maxOutOfDate.HasValue)
                {
                    maxOutOfDate = HistoricalDataUtils.GetDefaultMaxOutOfDate(series);
                }

                List <DataLoadResult> results = new List <DataLoadResult>();

                DateTime nextChunkDate;
                if (series.HasAccount && series.Account.IsBacktesting)
                {
                    nextChunkDate = DateTime.FromBinary(Math.Min(series.Account.BacktestEndDate.ToBinary(), series.OpenTime.First().ToBinary()));
                }
                else
                {
                    if (cacheOnly)
                    {
                        nextChunkDate = endDate;
                        if (nextChunkDate == default(DateTime))
                        {
                            nextChunkDate = startDate.Value;
                        }
                    }
                    else
                    {
                        nextChunkDate = DateTime.UtcNow + TimeSpan.FromMinutes(1);
                    }
                }

                DataLoadResult dataLoadResult = null;

                int giveUpAfterNoData = GetGiveUpAfterNoData(series.TimeFrame);
                do
                {
                    if (nextChunkDate == default(DateTime))
                    {
                        break;
                    }

                    DateTime chunkStart;
                    DateTime chunkEnd;
                    HistoricalDataCacheFile.GetChunkRange(series.TimeFrame, nextChunkDate, out chunkStart, out chunkEnd);

                    dataLoadResult = await provider.GetDataForChunk(series, chunkStart, chunkEnd, cacheOnly, writeCache, forceReretrieveEmptyData : forceReretrieveEmptyData, cancellationToken : cancellationToken).ConfigureAwait(false);

                    results.Add(dataLoadResult);

                    nextChunkDate = chunkStart - TimeSpan.FromMinutes(1);

                    if (!dataLoadResult.IsAvailable)
                    {
                        giveUpAfterNoData--;
                    }
                    else
                    {
                        giveUpAfterNoData = GetGiveUpAfterNoData(series.TimeFrame);
                    }

                    //Debug.WriteLine($"[data {series}]  {dataLoadResult}" + (cacheOnly?" (CACHE ONLY)":""));
                } while (giveUpAfterNoData > 0 &&
                         ((nextChunkDate != default(DateTime) && nextChunkDate > startDate.Value) ||
                          series.Count < totalDesiredBars)
                         );

                return(results);
            }
            finally
            {
                series.DataLock.Release();
            }
        }
Пример #6
0
        /// <summary>
        /// Load data from cache if available, or else retrieve from source.
        /// </summary>
        /// <param name="provider"></param>
        /// <param name="series"></param>
        /// <param name="chunkStart"></param>
        /// <param name="chunkEnd"></param>
        /// <param name="cacheOnly"></param>
        /// <param name="writeCache">If true, write any retrieved data to cache</param>
        /// <param name="maxOutOfDate"></param>
        /// <param name="forceRetrieve"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public static async Task <DataLoadResult> GetDataForChunk(this IHistoricalDataProvider provider, MarketSeriesBase series, DateTime chunkStart, DateTime chunkEnd, bool cacheOnly = false, bool writeCache = true, TimeSpan?maxOutOfDate = null, bool forceRetrieve = false, bool forceReretrieveEmptyData = false, CancellationToken?cancellationToken = null)
        {
            logger.LogTrace($"[GetDataForChunk] {series} {chunkStart}");
            if (!maxOutOfDate.HasValue)
            {
                maxOutOfDate = HistoricalDataUtils.GetDefaultMaxOutOfDate(series);
            }

            if (chunkStart >= series.DataStartDate && chunkEnd <= series.DataEndDate)
            {
                var chunkEndPastLast = chunkEnd - series.OpenTime.LastValue;

                if (chunkEndPastLast <= TimeSpan.Zero)
                {
                    //logger.LogTrace($"[{series}] Already contains data for {chunkStart} - {chunkEnd}");
                    return(DataLoadResult.AlreadyLoaded);
                }

                var nowPastLast = DateTime.UtcNow - series.OpenTime.LastValue;

                if (!forceRetrieve && nowPastLast < maxOutOfDate)
                {
                    //logger.LogTrace($"[{series}] Already contains data for {chunkStart} - {chunkEnd} (Only slightly out of date: {nowPastLast})");
                    return(DataLoadResult.AlreadyLoaded);
                }
            }

            var cacheFile = await HistoricalDataCacheFile.GetCacheFile(series, chunkStart).ConfigureAwait(false);

            DataLoadResult result = cacheFile.DataLoadResult;

            bool isUpToDateAfterClose = series.CloseTime.HasValue && cacheFile.QueryDate > series.CloseTime.Value;

            if (!forceRetrieve && (!forceReretrieveEmptyData || !cacheFile.EmptyData) && cacheFile.IsPersisted && (isUpToDateAfterClose || cacheFile.OutOfDateTimeSpan < maxOutOfDate.Value)
                //&& (chunkEnd > DateTime.UtcNow || !result.IsPartial)
                )
            {
                //Debug.WriteLine($"[cache available {series}] Chunk {chunkStart}");
                if (!cacheOnly)
                {
                    if (result.Bars == null)
                    {
                        result.Bars = new List <TimedBar>();
                    }
                    ImportData(series, result);

                    //if (series is MarketSeries) // TOC#7 OLD
                    //{
                    //    var s = series as MarketSeries;
                    //    if (s != null) { s.Add(cacheFile.Bars, result.StartDate, result.EndDate); }
                    //}
                    //else if (series is MarketSeries) // TOC#7
                    //{
                    //    var s = series as MarketTickSeries;
                    //    if (s != null) { s.Add(cacheFile.Ticks, result.StartDate, result.EndDate); }
                    //}
                }
            }
            else
            {
                var str = forceRetrieve ? "FORCE RETRIEVE" : (forceReretrieveEmptyData && cacheFile.EmptyData) ? "RERETRIEVE EMPTY DATA" : "CACHE MISS";
                logger.LogInformation($"[{series} {str}] Retrieving chunk {chunkStart} ");
#if DEBUG
                logger.LogTrace($"<<<cache debug>>> cacheFile.IsPersisted {cacheFile.IsPersisted}, isUpToDateAfterClose {isUpToDateAfterClose}, cacheFile.OutOfDateTimeSpan < maxOutOfDate.Value {cacheFile.OutOfDateTimeSpan < maxOutOfDate.Value} ");
#endif
                var loader = new object();
                try
                {
                    series.OnLoadingStarted(loader);
                    result = await provider.RetrieveDataForChunk(series, chunkStart, cacheOnly, writeCache, cancellationToken : cancellationToken).ConfigureAwait(false);

                    if (result.Faulted)
                    {
                        throw new Exception("Retrieve data for chunk failed");
                    }
                    //if (LinkWithAccountData && Account != null && ResultBars.Count > 0)

                    if (!cacheOnly)
                    {
                        ImportData(series, result);
                    }
                }
                finally
                {
                    series.OnLoadingFinished(loader);
                }
                if (writeCache)
                {
                    if (!result.Faulted)
                    {
                        //UpdateProgress(0.98, "Writing data into cache"); // FUTURE: Async?
                        TaskManager.OnFireAndForget(HistoricalDataCacheFile.SaveCacheFile(result), name: $"Save cache for {series.SymbolCode} from {chunkStart} - {chunkEnd}");
                    }
                }
                else
                {
                    logger.LogTrace("WRITECACHE OFF");
                }
            }
            return(result);
        }
Пример #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);
        }