Как правильно реализовать ILogSource

Как правильно реализовать ILogSource
Atom
7/11/2012
PavelAd


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


Tags:


Thanks:




Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy