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


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

Теги:


Спасибо:




0 Ответов


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy