Фильтрация данных для расширенных торговых часов в C#

0

Вопрос

Я получаю данные от поставщика акций, которые включают данные за продленные торговые часы. Данные представляют собой агрегированные 1-минутные точки данных, которые я преобразую из JSON в List<Aggregate> где агрегат содержит Максимум, Минимум, Открытие, Закрытие и Время начала агрегированного 1-минутного окна. Мои запросы охватывают несколько торговых дней - их могут быть сотни, а могут быть и тысячи. И мой расчет показателей должен исключать данные о нерабочем времени. Итак, у меня есть список из сотен элементов объекта:

public class Aggregate
{
    public decimal Close { get; set; }
    public decimal UnixTimestamp { get; set; } // milliseconds
    ...
}

а также DateTime FromDate и DateTime ToDate который длится сотни дней. Теперь один верный способ отфильтровать данные в нерабочее время-сравнить UnixTimestamp каждого товара в обычное торговое окно с 9:30 утра по восточному времени до 16:00 вечера по восточному времени. Это потребовало бы преобразования каждого UnixTimestamp Для DateTime. Это большое сравнение... Интуитивно, это лучше конвертировать FromDate и ToDate Для UnixTimestamp и отфильтровывать элементы с помощью Linq.

long unixTimeMsecToDate = new DateTimeOffset(aggrParams.ToDate).ToUnixTimeMilliseconds();
long unixTimeMsecFromDate = new DateTimeOffset(aggrParams.FromDate).ToUnixTimeMilliseconds();

Однако я не могу указать точный код... Перебираешь даты по кругу? Как?

c# filtering linq
2021-11-23 22:33:57
1

Лучший ответ

0

Мне удалось избавиться от объекта Aggregate и заменить его объектом Quote, который пришел из другой библиотеки со временем, выраженным как Дата C#, и решить проблему прямым способом следующим образом, эффективно отфильтровав точки данных в нерабочее время:

        private void FilterExtendedTradingHours(List<Quote> quoteList, AggrParams aggrParams)
    {
        using (Log.VerboseCall())
        {
            if (aggrParams.Interval == "minute" || aggrParams.Interval == "hour")
            {
                Log.VerboseFormat("Initial {0} count: {1}", aggrParams.Interval, quoteList.Count);

                for(int i = quoteList.Count - 1; i >= 0; i--)
                {
                    if ( quoteList[i].Date.TimeOfDay > new TimeSpan(16,  0,  0) || quoteList[i].Date.TimeOfDay < new TimeSpan(9, 30, 0) )
                    {
                        quoteList.RemoveAt(i);
                    }
                }

                Log.VerboseFormat("Post-filtering {0} count: {1}", aggrParams.Interval, quoteList.Count);
            }
        }
    }
2021-12-01 00:26:22

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................