Tinkoff / invest-openapi-csharp-sdk

Apache License 2.0
100 stars 33 forks source link

Улучшить метод market/candles ( MarketCandlesAsync ) #70

Closed zabralex85 closed 3 years ago

zabralex85 commented 3 years ago

Очень неудобно использовать даты в методе, это не datetimeoffset, это не unix timestamp, плюс можно сделать метод более удобным.

Для примера: можно попробовать в 3 ночи получить данные за вчера 5мин интервалом за день, что всего 21 свеча хммм ... (from: DateTime.Now.Date.AddDay(-1), to: DateTime.Now.Date), смотришь все вроде верно хотел получить данные с 2020-12-02 до 2020-12-03 но вот не судьба.

в итоге пришел к такому методом подбора: высчитыввать свое отклонение (+3) и просить данные с 7 утра до 23:59.

await tsDs.LoadData("ticker", DateTime.Parse("2020-12-02T07:00:00"), DateTime.Parse("2020-12-02T23:59:00"), (int)Models.CandleInterval.FiveMinutes);

Данные получаем с 7 утра до 8:55 вечера (опять же почему не вернуть даты с отклонением неизвестно), при том что торги по инструменту идут с 10 утра до 01.30 ночи, шаг влево в право ошибка.

Примеры как бы хотелось уметь:

Взять данные за часть дня/день используя либо datetime offset либо unix temestamp используя:

[EnumMember(Value = "1min")] Minute,
[EnumMember(Value = "2min")] TwoMinutes,
[EnumMember(Value = "3min")] ThreeMinutes,
[EnumMember(Value = "5min")] FiveMinutes,
[EnumMember(Value = "10min")] TenMinutes,
[EnumMember(Value = "15min")] QuarterHour,
[EnumMember(Value = "30min")] HalfHour,
[EnumMember(Value = "hour")] Hour,

Взять данные за определенный день (гг-мм-дд) используя:

[EnumMember(Value = "1min")] Minute,
[EnumMember(Value = "2min")] TwoMinutes,
[EnumMember(Value = "3min")] ThreeMinutes,
[EnumMember(Value = "5min")] FiveMinutes,
[EnumMember(Value = "10min")] TenMinutes,
[EnumMember(Value = "15min")] QuarterHour,
[EnumMember(Value = "30min")] HalfHour,
[EnumMember(Value = "hour")] Hour,

Взять данные за определенную неделю (по номеру, указывая календарь американский или русский) используя

[EnumMember(Value = "day")] Day, [EnumMember(Value = "hour")] Hour,

Взять данные за месяц указывая год и номер месяца используя:

[EnumMember(Value = "day")] Day,
[EnumMember(Value = "week")] Week,

Взять данные за год используя :

[EnumMember(Value = "day")] Day, [EnumMember(Value = "week")] Week, [EnumMember(Value = "month")] Month,

rus-art commented 3 years ago

Кажется, этот запрос невозможно рассматривать в контексте одного лишь C# SDK, в отрыве от Api. Перевожу запрос в Api

rus-art commented 3 years ago

Давайте напишем ряд хелперов на c#, которые преобразуют желаемый интервал в диапазон дат

Dazlonar commented 3 years ago

Стоит понимать что на вашем компьютере используется ваш LocalTime, а время приходит в формате UTC, как раз те самые 3 часа о которых вы пишите. Только объект DateTime умеет конвертировать время в любой формат, обратите внимание на методы ToUniversalTime() и ToLocalTime(). DateTime.Now возвращает время в вашем LocalTime, вы можете преобразовать его в UTC используя ToUniversalTime и наоборот. Я думаю что бы не было таких проблем можно сделать что бы библиотека автоматически отдавала все даты переводя в LocalTime и перед отправкой переводила бы их в UniversalTime и тогда скорей всего проблем будет меньше.

ssolarevIDBS commented 3 years ago

А в чем проблема использовать UTC в запросе? Грубо говоря торговый день заканчивается как раз в 00 по GMT. И не забывайте , что за мкадом тоже люди живут, во Владивостоке вообще сильно время отличается.