У меня неправильно время окончания первой свечки считает вот этим методом: _nextTime = base.TimeFrame.GetCandleBounds(base.Trader).Max; Как можно узнать время начала работы биржи узнать? В блоге находил такое: var dateTime = DateTime.Today + exchange.WorkingTime.First().Min; Не работает. По-разному пробовал. А нельзя самому задавать время работы биржи, как это делается в прогах теханализа?
评论 (17)
登录 或 创建账户, 登录或注册以发表评论
А что значит не работает? Можете описать подробнее?
Просто VS не даёт прописать First к WorkingTime. Пишет - не содержит определения для First: var dateTime = DateTime.Today + Exchange.Rts.WorkingTime.First().Min;
Метод GetCandleBounds начинает считать для РТС с 10:00 если я правильно понимаю. То есть к примеру: свеча с ТФ 57 мин, должна заканчиваться в 10:57 по идее.
Потому что используется LINQ Надо прописать using System.Linq
По этой команде: _nextTime = base.TimeFrame.GetCandleBounds(base.Trader).Max у меня свечки отсчитываются со времени 0:00:00. То есть например, первая свечка с ТФ 4 часа начнётся (имеется ввиду candle.Time) в 8:00, следующие в 12:00, затем в 16:00 и т.д. А начало торгов в РТС 10:00, здесь всё верно.
А чему равен ITrader.MarketTime?
Сейчас проверил для ТФ 3 часа. Время окончания текущей свечи _nextTime = 15:00. Соответственно предыдущие свечки начинались в 12:00. И candle.Time первой свечки этого дня = 9:00.
base.Trader.MarketTime даёт текущее квиковское время, т.е. Москвы. Здесь всё время Московское указано. Сейчас для 3 часового ТФ я замерял _nexttime было равно 15:00. При этом MarketTime было равно 13:58:41. Всё в файле записано
Так а где проблема то?
Так свечки рисуются неправильно. Сейчас пытаюсь перенести стратегию из Омеги в S#. Там свечки строятся с начала работы биржи, как и в любой другой проге теханализа. То есть к примеру первая 4-часовая свеча заканчивается в 14:00 А в S# по- другому - в 12:00. Соответственно не получается перенести. Свечки должны строиться с момента начала работы биржи. Это будет правильно.
Переносите с поправками. Свечки в S# строяться не с какого то момента. Они имеют свое собственно время. CandleManager строит свечки по тикам. Выражение же base.TimeFrame.GetCandleBounds(base.Trader).Max к свечкам относиться постольку, поскольку. Они лишь говорит, что текущая свечка (понятие текущая берется из ITrader.MarketTime) с длинной base.TimeFrame имеет такое то начало и окончание. Если Вы пишите, что ITrader.MarketTime возвращает все ок, то значит проблема в base.TimeFrame. Не нулю ли он равен?
То есть для ТФ 4ч так писать? _nextTime = base.TimeFrame.GetCandleBounds(base.Trader).Max.AddHours(2)
base.Trader.MarketTime даёт текущее квиковское время. base.TimeFrame в данном примере и равен 4 часам.
Так у меня и var candle = _candleManager.GetTimeFrameCandle(base.Security, base.TimeFrame, base.TimeFrame.GetCandleBounds(base.Trader).Min); candle.Time (время текущей свечи) = 8:00, затем 12:00 и т.д.
А, понял. И вот тут так сделать: var candle = _candleManager.GetTimeFrameCandle(base.Security, base.TimeFrame, base.TimeFrame.GetCandleBounds(base.Trader).Min.AddHours(2));
Я бы не использовать GetCandleBounds напрямую. Данный метод вычисляет границы свечки не учитывая время работы биржи. Сделайте свой аналог, чтобы время было кратно началу работы биржи.
Интересное явление. Как ввожу временную поправку, чтобы время свечи правильно считалось, текущая свеча получается всё время null. Как только поправку убираю, всё строится правильно, но при этом время свечи, естественно, считается не с начала работы биржи. Может всё-таки RegisterTimeFrameCandles имеет какую-то временную привязку?
В Вашем случае самый дешевый вариант - стоить свечки часовые. А их уже собирал в 4-ех часовые с нужного временного отсчета.
Понятно, но у меня время свечи даже не кратно часу. Придётся выбирать самый малый ТФ, который кратен моему