コード例 #1
0
        public void Should_return_valid_volume_ratio_time_range_for_three_months()
        {
            // Given
            var start = DateTime.UtcNow.ToEstTime().Date.AddMonths(-3 * 6);

            if (!start.IsTradingDay())
            {
                start = start.GetPreviousTradingDay();
            }

            var yesterday = DateTime.UtcNow.ToEstTime().Date.AddMonths(-3);

            if (!yesterday.IsTradingDay())
            {
                yesterday = yesterday.GetPreviousTradingDay();
            }

            var expectedTimeRange = new TimeRange(start, yesterday);

            // When
            var timeRange = MarketCalendar.CalculateDateRangeForVolumeRatio(DateRange.ThreeMonths);

            // Then
            timeRange.ShouldBe(expectedTimeRange);
        }
コード例 #2
0
ファイル: SingleStockTests.cs プロジェクト: AnePCOM/sample
        public void SingleStock_should_return_same_number_news_table_and_summary_info(DataTableDateRangeOptions dataTableDateRangeOptions)
        {
            Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
            var repository          = new Repository();
            var summaryDataProvider = new SummaryDataProvider(repository);

            DataTableOptions stockTableOptions = new DataTableOptions
            {
                Filter          = dataTableDateRangeOptions.Filter,
                Symbol          = dataTableDateRangeOptions.Symbol,
                Take            = dataTableDateRangeOptions.Take,
                Skip            = dataTableDateRangeOptions.Skip,
                SortDescription = dataTableDateRangeOptions.SortDescription,
                StartTonDate    = dataTableDateRangeOptions.StartTonDate,
                Providers       = dataTableDateRangeOptions.Providers
            };

            var range = DateRange.Today;
            var trr   = MarketCalendar.CalculateTradingTimeRange(range, DateTime.Now, DateTime.Now);

            if (dataTableDateRangeOptions.StartDate != null && dataTableDateRangeOptions.EndDate != null)
            {
                trr = MarketCalendar.CalculateTradingTimeRange(range, dataTableDateRangeOptions.StartDate.Value, dataTableDateRangeOptions.EndDate.Value);
            }
            var stockPageSymbolFunc = new StockPageSymbolFunc(repository);
            var tableResult         = stockPageSymbolFunc.GetNewsStreamingDataSource(stockTableOptions);
            var symbolSummaryData   = summaryDataProvider.BuildCompanySection(stockTableOptions.Symbol, range, trr, dataTableDateRangeOptions.StartTonDate, dataTableDateRangeOptions.Providers);

            Assert.AreEqual(tableResult.Total, 10003);
        }
コード例 #3
0
        public void Should_return_valid_volume_ratio_time_range_for_week()
        {
            // Given
            var yesterday = DateTime.UtcNow.ToEstTime().Date.GetTradingDayBeforeDaysCount(5);

            if (!yesterday.IsTradingDay())
            {
                yesterday = yesterday.GetPreviousTradingDay();
            }

            var start = yesterday.GetTradingDayBeforeDaysCount(5 * 5); // 5 weeks

            if (!start.IsTradingDay())
            {
                start = start.GetPreviousTradingDay();
            }

            var expectedTimeRange = new TimeRange(start, yesterday);

            // When
            var timeRange = MarketCalendar.CalculateDateRangeForVolumeRatio(DateRange.Week);

            // Then
            timeRange.ShouldBe(expectedTimeRange);
        }
コード例 #4
0
ファイル: SingleStockTests.cs プロジェクト: AnePCOM/sample
        public void SingleStock_should_not_epty_data_in_summary_info(DataTableDateRangeOptions dataTableDateRangeOptions)
        {
            Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
            var             repository          = new Repository();
            var             summaryDataProvider = new SummaryDataProvider(repository);
            const DateRange range = DateRange.Today;
            var             trr   = MarketCalendar.CalculateTradingTimeRange(range, DateTime.Now, DateTime.Now);

            if (dataTableDateRangeOptions.StartDate != null && dataTableDateRangeOptions.EndDate != null)
            {
                trr = MarketCalendar.CalculateTradingTimeRange(range, dataTableDateRangeOptions.StartDate.Value, dataTableDateRangeOptions.EndDate.Value);
            }
            var symbolSummaryData = summaryDataProvider.BuildCompanySection(dataTableDateRangeOptions.Symbol, range, trr, dataTableDateRangeOptions.StartTonDate, dataTableDateRangeOptions.Providers);

            Assert.That(symbolSummaryData.AllNewsCount, Is.Not.Null);
            Assert.That(symbolSummaryData.AskShares, Is.Not.Null);
            Assert.That(symbolSummaryData.AskSharesStr, Is.Not.Empty);
            Assert.That(symbolSummaryData.AskSize, Is.Not.Null);
            Assert.That(symbolSummaryData.AvgBidAskSize, Is.Not.Empty);
            Assert.That(symbolSummaryData.BidAskSpread, Is.Not.Null);
            Assert.That(symbolSummaryData.BidShares, Is.Not.Null);
            Assert.That(symbolSummaryData.BidSharesStr, Is.Not.Empty);
            Assert.That(symbolSummaryData.BidSize, Is.Not.Null);
            Assert.That(symbolSummaryData.BlockShares, Is.Not.Null);
            Assert.That(symbolSummaryData.BlockSharesStr, Is.Not.Empty);
            Assert.That(symbolSummaryData.Change, Is.Not.Null);
            Assert.That(symbolSummaryData.ChangeStr, Is.Not.Empty);
            Assert.That(symbolSummaryData.DowngradesCount, Is.Not.Null);
            Assert.That(symbolSummaryData.InitiatesCount, Is.Not.Null);
            Assert.That(symbolSummaryData.LastEarnings, Is.Not.Empty);
            Assert.That(symbolSummaryData.LastEarningsDate, Is.Not.Null);
            Assert.That(symbolSummaryData.LastEps, Is.Not.Null);
            Assert.That(symbolSummaryData.LastTod, Is.Not.Empty);
            Assert.That(symbolSummaryData.MoreOverCount, Is.Not.Null);
            Assert.That(symbolSummaryData.NewsWiresCount, Is.Not.Null);
            Assert.That(symbolSummaryData.NextEarnings, Is.Not.Empty);
            Assert.That(symbolSummaryData.NextEarningsDate, Is.Not.Null);
            Assert.That(symbolSummaryData.NextTod, Is.Not.Empty);
            Assert.That(symbolSummaryData.OddLot, Is.Not.Null);
            Assert.That(symbolSummaryData.OddLotStr, Is.Not.Empty);
            Assert.That(symbolSummaryData.OffExchange, Is.Not.Empty);
            Assert.That(symbolSummaryData.ReiteratesCount, Is.Not.Null);
            Assert.That(symbolSummaryData.SecEdgarFilingsCount, Is.Not.Null);
            Assert.That(symbolSummaryData.SectionType, Is.Not.Empty);
            Assert.That(symbolSummaryData.SharesAtAskBid, Is.Not.Empty);
            Assert.That(symbolSummaryData.SubPenny, Is.Not.Null);
            Assert.That(symbolSummaryData.SubPennyStr, Is.Not.Empty);
            Assert.That(symbolSummaryData.TotalShares, Is.Not.Null);
            Assert.That(symbolSummaryData.TotalSharesStr, Is.Not.Empty);
            Assert.That(symbolSummaryData.TotalTrades, Is.Not.Null);
            Assert.That(symbolSummaryData.TotalTradesStr, Is.Not.Empty);
            Assert.That(symbolSummaryData.UpgradesCount, Is.Not.Null);
            Assert.That(symbolSummaryData.Volatility, Is.Not.Null);
            Assert.That(symbolSummaryData.Volatility20, Is.Not.Null);
            Assert.That(symbolSummaryData.Volatility20Str, Is.Not.Empty);
            Assert.That(symbolSummaryData.VolatilityStr, Is.Not.Empty);
            Assert.That(symbolSummaryData.VolumeRatio, Is.Not.Null);
            Assert.That(symbolSummaryData.VolumeRatioStr, Is.Not.Empty);
        }
コード例 #5
0
        public void Should_return_valid_volume_ratio_time_range_for_custom_range_one_day_on_holiday()
        {
            // Given
            var start             = DateTime.Parse("1/19/2015");
            var end               = DateTime.Parse("1/19/2015");
            var expectedTimeRange = new TimeRange(DateTime.Parse("1/9/2015"), DateTime.Parse("1/15/2015"));

            // When
            var timeRange = MarketCalendar.CalculateVolumeRatioDateRange(DateRange.Range, start, end);

            // Then
            timeRange.ShouldBe(expectedTimeRange);
        }
コード例 #6
0
        public void Should_return_valid_volume_ratio_time_range_for_one_year()
        {
            // Given
            var start             = DateTime.UtcNow.ToEstTime().Date.AddYears(-1 * 6);
            var yesterday         = DateTime.UtcNow.ToEstTime().Date.AddYears(-1);
            var expectedTimeRange = new TimeRange(start, yesterday);

            // When
            var timeRange = MarketCalendar.CalculateDateRangeForVolumeRatio(DateRange.Year);

            // Then
            timeRange.ShouldBe(expectedTimeRange);
        }
コード例 #7
0
        public void Should_return_range_for_yesterday()
        {
            // Given
            var startDate = DateTime.UtcNow.ToEstTime().GetPreviousTradingDay().ChangeTime(16, 0, 0, 0);
            var endDate   = DateTime.UtcNow.ToEstTime().GetPreviousTradingDay().EndOfDay();

            var mainDateRange     = new TimeRange(startDate.StartOfDay(), endDate);
            var alignedDateRange  = new TimeRange(startDate.GetPreviousTradingDay(), endDate.EndOfDay());
            var extendedDateRnage = new TimeRange(startDate.GetPreviousTradingDay().StartOfDay(), endDate);

            // When
            var dateRange = MarketCalendar.CalculateTradingTimeRange(DateRange.Yesterday);

            // Then
            dateRange.TimeRange.ShouldBe(mainDateRange);
            dateRange.AlignedTimeRange.ShouldBe(alignedDateRange);
            dateRange.ExtendedTimeRange.ShouldBe(extendedDateRnage);
        }
コード例 #8
0
ファイル: CalendarTests.cs プロジェクト: AnePCOM/sample
        public void Should_return_range_for_today()
        {
            // Given
            var startDate = DateTime.UtcNow.ToEstTime().ChangeTime(16, 0, 0, 0);
            var endDate   = startDate.EndOfDay();

            TimeRange mainDateRange     = new TimeRange(startDate.StartOfDay(), endDate);
            TimeRange alignedDateRange  = new TimeRange(startDate.GetPreviousTradingDay(), endDate.EndOfDay());
            TimeRange extendedDateRnage = new TimeRange(startDate.GetPreviousTradingDay().StartOfDay(), endDate);

            // When
            var       dateRange = MarketCalendar.CalculateTradingTimeRange(DateRange.Today);
            TimeRange arketCalendarMainDateRange     = dateRange.TimeRange as TimeRange;
            TimeRange arketCalendarAlignedDateRange  = dateRange.AlignedTimeRange as TimeRange;
            TimeRange arketCalendarExtendedDateRnage = dateRange.ExtendedTimeRange as TimeRange;

            // Then
            Assert.IsTrue(arketCalendarMainDateRange != null && arketCalendarMainDateRange.CompareTo(mainDateRange) == 0);
            Assert.IsTrue(arketCalendarAlignedDateRange != null && arketCalendarAlignedDateRange.CompareTo(arketCalendarAlignedDateRange) == 0);
            Assert.IsTrue(arketCalendarExtendedDateRnage != null && arketCalendarExtendedDateRnage.CompareTo(arketCalendarExtendedDateRnage) == 0);
        }
コード例 #9
0
        public async Task <SummaryDataSection> BuildCompanySection(
            string symbol,
            DateRange dateRange,
            TradingTimeRange timeRange)
        {
            var timeRangeVolumeRatio = MarketCalendar.CalculateVolumeRatioDateRange(dateRange, timeRange.TimeRange.Start, timeRange.TimeRange.End);



            using (var conn = connectionProvider.GetConnection())
            {
                var dateFromParam = timeRange.TimeRange.Start;
                var dateToParam   = timeRange.TimeRange.End;

                var companySummaryDataTask = await conn.QueryAsync <SummaryDataSection>(
                    "dbo.usp_CompanyGeneralData",
                    commandType : CommandType.StoredProcedure,
                    param : new
                {
                    symbol,
                    dateFrom = dateFromParam,
                    dateTo   = dateToParam,
                    datePreviousTradingDay = timeRange.AlignedTimeRange.Start
                });

                var companySummaryData = companySummaryDataTask.FirstOrDefault();

                if (companySummaryData == null)
                {
                    return(null);
                }

                companySummaryData.VolumeRatio = GetVolumeRatioBySymbol(symbol, dateRange, timeRange,
                                                                        timeRangeVolumeRatio);
                companySummaryData.SectionType = "company";

                return(companySummaryData);
            }
        }
コード例 #10
0
        public async Task <SummaryDataSection> BuildIndustrySection(
            int sicCode,
            DateRange dateRange,
            TradingTimeRange timeRange)
        {
            var timeRangeVolumeRatio = MarketCalendar.CalculateVolumeRatioDateRange(dateRange, timeRange.TimeRange.Start, timeRange.TimeRange.End);

            using (var conn = connectionProvider.GetConnection())
            {
                var dateFromParam = timeRange.TimeRange.Start;
                var dateToParam   = timeRange.AlignedTimeRange.End;

                var industrySummaryDataTask = await conn.QueryAsync <SummaryDataSection>(
                    "dbo.usp_IndustryGeneralData",
                    commandType : CommandType.StoredProcedure,
                    param : new
                {
                    sicCode,
                    dateFrom = dateFromParam,
                    dateTo   = dateToParam,
                    datePreviousTradingDay = timeRange.AlignedTimeRange.Start
                });

                var industrySummaryData = industrySummaryDataTask.FirstOrDefault();

                if (industrySummaryData == null)
                {
                    return(null);
                }

                if (dateRange == DateRange.All)
                {
                    industrySummaryData.VolumeRatio = null;
                }
                else if (dateRange == DateRange.Today ||
                         dateRange == DateRange.Range && timeRange.TimeRange.Start.Date == DateTime.UtcNow.Date)
                {
                    var volumeRatio = conn.Query <double?>(@"
SELECT AVG(vr.VolumeRatio) FROM VolumeRatio vr WITH(NOLOCK)
INNER JOIN Fundamental4 f WITH(NOLOCK) ON vr.Symbol = f.Symbol
WHERE f.SICCode = @sicCode
", new { sicCode }).FirstOrDefault();
                    industrySummaryData.VolumeRatio = volumeRatio;
                }
                else
                {
                    var mainPeriodVolumeRatio = conn.Query <double>(@"
SELECT AVG(CAST(ip.Volume AS FLOAT)) FROM IndustryPrice ip WITH(NOLOCK)
WHERE
    ip.SICCode = @sicCode
    AND ip.JDate >= CONVERT(CHAR(8), @dateFrom, 112)
    AND ip.JDate <= CONVERT(CHAR(8), @dateTo, 112)
", new
                    {
                        sicCode,
                        dateFrom = timeRange.TimeRange.Start,
                        dateTo   = timeRange.TimeRange.End
                    }).FirstOrDefault();

                    var periodsToCompare = conn.Query <double>(@"
SELECT AVG(CAST(ip.Volume AS FLOAT)) FROM IndustryPrice ip WITH(NOLOCK)
WHERE
    ip.SICCode = @sicCode
    AND ip.JDate >= CONVERT(CHAR(8), @dateFrom, 112)
    AND ip.JDate <= CONVERT(CHAR(8), @dateTo, 112)
", new
                    {
                        sicCode,
                        dateFrom = timeRangeVolumeRatio.Start,
                        dateTo   = timeRangeVolumeRatio.End,
                    }).FirstOrDefault();

                    industrySummaryData.VolumeRatio = mainPeriodVolumeRatio / periodsToCompare;
                }

                industrySummaryData.SectionType = "industry";
                return(industrySummaryData);
            }
        }