← Zurück

Несколько стратегий

Возникли следующие 2 проблемы при использовании Stock#:

  1. CandleManager с несколькими таймфреймами: Порядок действия такой:
  1. создаю CandleManager _candleManager = new CandleManager(_trader);

  2. регистрирую таймфреймы при создании стратегий if (!_candleManager.IsRegisteredTimeFrameCandles(riFut, _timeFrame5)) { _candleManager.RegisterTimeFrameCandles(riFut, _timeFrame5);

if (!_candleManager.IsRegisteredTimeFrameCandles(riFut, _timeFrame1)) { _candleManager.RegisterTimeFrameCandles(riFut, _timeFrame1);

  1. Передаю candleManager созданным стратегиям и использую их дальше там.

Мне по стратегиям необходимо понять, обрабатывал ли я уже данную минутку \ 5-минутку или нет (чтоб не запускать на ней несколько раз). Поэтому я в обработчике событий NewCandles внутри стратегии (для переданного candleManager, для которого зарегистрировано как 1- минутки, так и 5-минутки) создаю SortedSet из пришедшего времени: _candleManager.NewCandles += CandleManagerNewCandles;

   void CandleManagerNewCandles(CandleToken arg1,

Wintellect.PowerCollections.MultiDictionary<Candle, Trade> arg2) { if (arg1.Security == Security) { if (typeof(TimeFrameCandle) == arg1.CandleType) { if (arg1.Arg.Equals(TimeFrame)) { foreach (Candle candle in arg2.Keys) { _addedTimes.Add(candle.Time); } } } } }

В итоге почему-то в каждую из стратегий приходят лишь 1-минутки(хотя TimeFrame - 5 минут), поэтому время не добавляется в Set и я получаю сигнал что свечка для данной 5-минутки не пришла. С чем это связано?

  1. Для Security я добавляю дополнительные поля для экспорта: DdeSecurityColumns.MarginBuy DdeSecurityColumns.MarginSell DdeSecurityColumns.MaxPrice DdeSecurityColumns.MinPrice DdeSecurityColumns.MinStepPrice

Почему-то в переданные в стратегии Security эти поля не обновляются и равны первоначальным при первом экспорте. Как это можно исправить или что-то не так делаю?

War dieses Thema hilfreich?

Thema teilen

Kommentare (2)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

Alexander
Alexander Autor

По 1) проблеме - сегодня запустил роботов с открытия - всё ok, работает как часы, все события приходят. Проблему описывал когда запуск был в середине сессии... Ждал появления событий минут 5 - не было 5-минуток.

Alexander
Alexander Autor

Перезапустил роботов в 11:10 - не смогли получить события опять. Решил изменить и переписать проверку есть ли последнее время на более простое - Candle lastCandle = _candleManager.GetTimeFrameCandle(Security, TimeFrame, RobotsHelper.RoundToTimeFrame(marketTime, TimeFrame)); if (lastCandle == null) { ...

В итоге проверку-то проходит, но виснет довольно быстро на IEnumerable<TimeFrameCandle> oldCandles = _candleManager.GetTimeFrameCandles(Security, TimeFrame, new Range<DateTime>(firstTime, marketTime));

где это вызывается из 3х стратегия (2 - на 5-минутках, 1 - на минутках). На минутках причём проходит, обе 5-минутки здесь виснут. firstTime - 10.00, marketTime - последнее время, т.е. было где-то 11.20