Хочу сделать отдельный класс StrategyObserver,который в отдельном потоке будет проверять через определенные интервалы времени чтобы у связанной с ним стратегии каждая открытая позиция была прикрыта защитными заявками, если обнаружатся не прикрытые позиции выводит сообщение в лог. Реализовал интерфейс ILogSource для этого класса.
Хочу сделать чтобы в окне MonitorWindow в дереве под стратегией (которая передается в конструктор класса StrategyObserver) был дочерний элемент, и там выводились сообщения от этого класса. Подскажите пожалуйста как это сделать? В приведенной ниже реализации почему-то не работает как задумано (в документации и на формуе практически нет инф-ии об этом)
Код класса StrategyObserver:
class StrategyObserver : ILogSource { private readonly Strategy _strategy; private Thread _thread;
public StrategyObserver(Strategy strategy, TimeSpan interval) { _strategy = strategy; strategy.Trader.WhenIntervalElapsed(interval).Do(StartObserver); Parent = _strategy; WriteLog(ErrorTypes.None, "test"); } public void StartObserver() { if (_thread != null && _thread.IsAlive) // Если запущен, то выходим return; if (_strategy.Position == 0) // Если текущая позиция 0, то выходим return; if (_thread == null) _thread = new Thread(Do); try { _thread.Start(); } finally { } } public void Do() { WriteLog("StrategyObserver started in {0}".Put(_strategy.Trader.MarketTime)); var position = _strategy.Position; if (position == 0) // Если текущая позиция 0, то выходим return; decimal stopOrdersBalance, profitOrdersBalance; getOrdersTypeVolumeSum(out stopOrdersBalance, out profitOrdersBalance); // получаем баланс по защитным заявкам // Если объем по какой-то из защитных заявок не соответсвует объему заявки, то ждем (чтобы исключить что информация по заявкам не обновилась) if (position.Abs() != stopOrdersBalance || position.Abs() != profitOrdersBalance) Thread.Sleep(10000); if (position != _strategy.Position) // За это время позиция изменилась, то выходим return; getOrdersTypeVolumeSum(out stopOrdersBalance, out profitOrdersBalance); // Повторно получаем баланс по защитным заявкам if (position.Abs() != stopOrdersBalance) WriteLog("Позиция размером {0} не прикрыта STOP заявкой".Put(position)); if (position.Abs() != profitOrdersBalance) WriteLog("Позиция размером {0} не прикрыта PROFIT заявкой".Put(position)); } private void getOrdersTypeVolumeSum(out decimal stopOrdersBalance, out decimal profitOrdersBalance) { stopOrdersBalance = 0; profitOrdersBalance = 0; stopOrdersBalance = _strategy.Orders.Where(o => o.State != OrderStates.Done && o.ExOrderInfo().OrderType == StrategyOrderTypes.STOP).Sum(o => o.Balance); profitOrdersBalance = _strategy.Orders.Where(o => o.State != OrderStates.Done && o.ExOrderInfo().OrderType == StrategyOrderTypes.PROFIT).Sum(o => o.Balance); } public Ecng.Collections.INotifyList<ILogSource> Childs { get { return null; } } private Guid id = Guid.NewGuid(); public Guid Id { get { return id; } } public bool IsLogEnabled { get { throw new NotImplementedException(); } set { throw new NotImplementedException(); } } public event Action<LogMessage> Log; public string Name { get { return "Observer"; } } private ILogSource parent; public ILogSource Parent { get { return parent; } set { parent = value; } } private void WriteLog(ErrorTypes errorType, string message) { LogMessage logMessage = new LogMessage(this, DateTime.Now, errorType, message); RaiseLog(logMessage); } private void RaiseLog(LogMessage logMessage) { var handler = Log; if (handler != null) handler(logMessage); }}
Логирование назначаю так:
_monitor = new MonitorWindow();
_monitor.Show();
_logManager = new LogManager();
_logManager.Listeners.Add(new GuiLogListener(_monitor));
_strategy = new MyStrategy();
_logManager.Sources.Add(_strategy);
var observer = new StrategyObserver(_strategy, TimeSpan.FromSeconds(30));
_logManager.Sources.Add(observer);
PS Если вставить код класса с тегом "code=csharp" он не корректно отображается, поэтому вставил цитатой
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!