Как правильно реализовать ILogSource
Хочу сделать отдельный класс 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" он не корректно отображается, поэтому вставил цитатой