Хочу сделать отдельный класс 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" он не корректно отображается, поэтому вставил цитатой
Comentarios (0)
Iniciar sesión o Crear cuenta, Inicie sesión o regístrese para dejar un comentario
Aún no hay comentarios. ¡Sea el primero!