← Zurück

Еще раз про событийную модель

День добрый! Подскажите, проверка условия When и действие Do выполняются в одном потоке или в разных? Использую следующий код (трэйдер в асинхронном режиме):

class MyStrategy : ActionStrategy
    {
        public MyStrategy(TimeSpan t)
        {
            _timeFrame = t;
        }
        
        private readonly TimeSpan _timeFrame;

        private CandleManager _candleManager;

        public CandleManager CandleManager
        {
            get { return _candleManager; }
            set
            {
                _candleManager = value;

                When(Signal1).Do(Action1)
                    .MakePeriodical(); // сделать событие периодичным
            }
        }

        private bool Signal1()
        {
            Debug.WriteLine(DateTime.Now.ToLongTimeString() + " - проверяем сигнал");
            //проверяем, сдвинулись ли границы текущей свечки
            bool needchange = _timeFrame.GetCandleBounds(base.Trader).Max > _сandleBounds.Max;
            bool rez = _candleManager.GetTimeFrameCandle(Security, _timeFrame, _сandleBounds.Max) != null;
            //если текущая свечка сдвинулась, а предыдущая не была получна, значит не было сделок - получаем новые границы ожидаемой свечки
            if (!rez && needchange)
            { _сandleBounds = _timeFrame.GetCandleBounds(base.Trader); }
            return rez;
        }
        private void Action1()
        {
            Debug.WriteLine(DateTime.Now.ToLongTimeString() + " - Запускаем действие");

            // запоминаем новое время следущей свечки
            _сandleBounds = _timeFrame.GetCandleBounds(base.Trader);
        }

        private Range<DateTime> _сandleBounds;

        protected override void OnRunning()
        {
            Debug.WriteLine(DateTime.Now.ToLongTimeString() + " - вызван OnRunning");
            // получаем границы текущей свечки
            _сandleBounds = _timeFrame.GetCandleBounds(base.Trader);
            _candleManager.CandlesFinished += (t,c) =>
                {
                    Debug.WriteLine(DateTime.Now.ToLongTimeString() + " - пришла свечка: " + c.First().Time.ToLongTimeString());
                };
            base.OnRunning();
        }
    }

Ожидается, что когда будет приходить новая свечка, будет запускаться действие. Однако на практике часто после прихода новой свечки действие запускается 2 раза (видимо потому что пока выполняется Do, When успевает еще раз провериться). А иногда после прихода свечки действие не запускается (например, 10:45:30, 10:45:44) (не понимаю почему =( ) Запускаю с интервалом 2 секунды и получаю следующий вывод:

10:44:18 - вызван OnRunning
10:44:19 - проверяем сигнал
10:44:20 - проверяем сигнал
10:44:21 - пришла свечка: 10:44:22
10:44:21 - проверяем сигнал
10:44:21 - Запускаем действие
10:44:22 - проверяем сигнал
10:44:22 - пришла свечка: 10:44:24
10:44:23 - проверяем сигнал
10:44:23 - Запускаем действие
10:44:24 - проверяем сигнал
10:44:25 - проверяем сигнал
10:44:26 - пришла свечка: 10:44:26
10:44:26 - проверяем сигнал
10:44:26 - Запускаем действие
10:44:27 - проверяем сигнал
10:44:27 - Запускаем действие
10:44:28 - пришла свечка: 10:44:30
10:44:28 - проверяем сигнал
10:44:28 - Запускаем действие
10:44:29 - проверяем сигнал
10:44:29 - Запускаем действие
10:44:30 - проверяем сигнал
10:44:31 - проверяем сигнал
10:44:32 - пришла свечка: 10:44:32
10:44:32 - проверяем сигнал
10:44:32 - пришла свечка: 10:44:34
10:44:33 - проверяем сигнал
10:44:33 - Запускаем действие
10:44:34 - проверяем сигнал
10:44:35 - пришла свечка: 10:44:36
10:44:35 - проверяем сигнал
10:44:35 - Запускаем действие
10:44:36 - проверяем сигнал
10:44:37 - пришла свечка: 10:44:38
10:44:37 - проверяем сигнал
10:44:37 - Запускаем действие
10:44:38 - пришла свечка: 10:44:40
10:44:38 - проверяем сигнал
10:44:38 - Запускаем действие
10:44:39 - проверяем сигнал
10:44:39 - Запускаем действие
10:44:40 - проверяем сигнал
10:44:41 - пришла свечка: 10:44:42
10:44:41 - проверяем сигнал
10:44:41 - Запускаем действие
10:44:42 - проверяем сигнал
10:44:43 - пришла свечка: 10:44:44
10:44:43 - проверяем сигнал
10:44:43 - Запускаем действие
10:44:44 - пришла свечка: 10:44:46
10:44:44 - проверяем сигнал
10:44:44 - Запускаем действие
10:44:45 - проверяем сигнал
10:44:45 - Запускаем действие
10:44:46 - пришла свечка: 10:44:48
10:44:46 - проверяем сигнал
10:44:46 - Запускаем действие
10:44:47 - проверяем сигнал
10:44:47 - Запускаем действие
10:44:48 - проверяем сигнал
10:44:49 - пришла свечка: 10:44:50
10:44:49 - проверяем сигнал
10:44:49 - Запускаем действие
10:44:50 - пришла свечка: 10:44:52
10:44:50 - проверяем сигнал
10:44:50 - Запускаем действие
The thread '<No Name>' (0x1734) has exited with code 0 (0x0).
10:44:51 - проверяем сигнал
10:44:51 - Запускаем действие
10:44:52 - проверяем сигнал
10:44:53 - проверяем сигнал
10:44:54 - проверяем сигнал
10:44:55 - проверяем сигнал
10:44:56 - проверяем сигнал
10:44:56 - пришла свечка: 10:44:54
10:44:57 - проверяем сигнал
10:44:57 - Запускаем действие
10:44:58 - проверяем сигнал
10:44:58 - пришла свечка: 10:45:00
10:44:59 - проверяем сигнал
10:44:59 - Запускаем действие
10:45:00 - проверяем сигнал
10:45:00 - пришла свечка: 10:45:02
10:45:01 - проверяем сигнал
10:45:01 - Запускаем действие
10:45:02 - проверяем сигнал
10:45:03 - пришла свечка: 10:45:04
10:45:03 - проверяем сигнал
10:45:03 - Запускаем действие
10:45:04 - проверяем сигнал
10:45:04 - пришла свечка: 10:45:06
10:45:05 - проверяем сигнал
10:45:05 - Запускаем действие
10:45:06 - проверяем сигнал
10:45:07 - проверяем сигнал
10:45:08 - проверяем сигнал
10:45:08 - пришла свечка: 10:45:08
10:45:09 - проверяем сигнал
10:45:09 - Запускаем действие
10:45:10 - пришла свечка: 10:45:12
10:45:10 - проверяем сигнал
10:45:10 - Запускаем действие
10:45:11 - проверяем сигнал
10:45:11 - Запускаем действие
10:45:12 - проверяем сигнал
10:45:12 - пришла свечка: 10:45:14
10:45:13 - проверяем сигнал
10:45:13 - Запускаем действие
10:45:14 - проверяем сигнал
10:45:14 - пришла свечка: 10:45:16
10:45:15 - проверяем сигнал
10:45:15 - Запускаем действие
10:45:16 - проверяем сигнал
10:45:17 - пришла свечка: 10:45:18
10:45:17 - проверяем сигнал
10:45:17 - Запускаем действие
10:45:18 - проверяем сигнал
10:45:19 - проверяем сигнал
10:45:20 - пришла свечка: 10:45:20
10:45:20 - пришла свечка: 10:45:22
10:45:20 - проверяем сигнал
10:45:20 - Запускаем действие
10:45:21 - проверяем сигнал
10:45:21 - Запускаем действие
10:45:22 - проверяем сигнал
10:45:23 - пришла свечка: 10:45:24
10:45:23 - проверяем сигнал
10:45:23 - Запускаем действие
10:45:24 - проверяем сигнал
10:45:25 - пришла свечка: 10:45:26
10:45:25 - проверяем сигнал
10:45:25 - Запускаем действие
10:45:26 - проверяем сигнал
10:45:27 - проверяем сигнал
10:45:28 - проверяем сигнал
10:45:29 - проверяем сигнал
10:45:30 - пришла свечка: 10:45:28
10:45:30 - проверяем сигнал
10:45:31 - проверяем сигнал
10:45:31 - пришла свечка: 10:45:32
10:45:32 - проверяем сигнал
10:45:33 - проверяем сигнал
10:45:34 - пришла свечка: 10:45:34
10:45:34 - проверяем сигнал
10:45:35 - проверяем сигнал
10:45:35 - пришла свечка: 10:45:36
10:45:36 - проверяем сигнал
10:45:36 - пришла свечка: 10:45:38
10:45:37 - проверяем сигнал
10:45:37 - Запускаем действие
10:45:38 - проверяем сигнал
10:45:38 - пришла свечка: 10:45:40
10:45:39 - проверяем сигнал
10:45:39 - Запускаем действие
10:45:40 - проверяем сигнал
10:45:41 - пришла свечка: 10:45:42
10:45:41 - проверяем сигнал
10:45:41 - Запускаем действие
10:45:42 - проверяем сигнал
10:45:43 - проверяем сигнал
10:45:44 - пришла свечка: 10:45:44
10:45:44 - проверяем сигнал
10:45:45 - проверяем сигнал
10:45:46 - проверяем сигнал
10:45:47 - проверяем сигнал
10:45:47 - пришла свечка: 10:45:46
10:45:48 - проверяем сигнал
10:45:49 - проверяем сигнал
10:45:50 - пришла свечка: 10:45:50
10:45:50 - проверяем сигнал
10:45:50 - пришла свечка: 10:45:52
10:45:51 - проверяем сигнал
10:45:51 - Запускаем действие
10:45:52 - проверяем сигнал

War dieses Thema hilfreich?

Thema teilen

Kommentare (0)

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

Noch keine Kommentare. Seien Sie der Erste!