Еще раз про событийную модель
День добрый! Подскажите, проверка условия 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 - проверяем сигнал