﻿<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type='text/css' href='https://stocksharp.com/css/style.css'?>
<?xml-stylesheet type='text/css' href='https://stocksharp.com/css/bbeditor.css'?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title type="html">Как правильно реализовать ILogSource</title>
  <id>~/topic/2850/kak-pravilno-realizovat-ilogsource/</id>
  <rights type="text">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  <updated>2026-06-20T18:32:19Z</updated>
  <logo>https://stocksharp.com/images/logo.png</logo>
  <link href="https://stocksharp.com/handlers/atom.ashx?category=topic&amp;id=2850" rel="self" type="application/rss+xml" />
  <entry>
    <id>https://stocksharp.com/posts/m/20270/</id>
    <title type="text">Хочу сделать отдельный класс StrategyObserver,который в отдельном потоке будет проверять через опред...</title>
    <published>2012-07-11T03:08:16Z</published>
    <updated>2012-07-11T04:13:09Z</updated>
    <author>
      <name>PavelAd</name>
      <uri>https://stocksharp.com/users/6072/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;p&gt;Хочу сделать отдельный класс StrategyObserver,который в отдельном потоке будет проверять через определенные интервалы времени чтобы у связанной с ним стратегии каждая открытая позиция была прикрыта защитными заявками, если обнаружатся не прикрытые позиции выводит сообщение в лог.
Реализовал интерфейс ILogSource для этого класса.&lt;/p&gt;
&lt;p&gt;Хочу сделать чтобы в окне MonitorWindow в дереве под стратегией (которая передается в конструктор класса StrategyObserver) был дочерний элемент, и там выводились сообщения от этого класса.
Подскажите пожалуйста как это сделать? В приведенной ниже реализации почему-то не работает как задумано (в документации и на формуе практически нет инф-ии об этом)&lt;/p&gt;
&lt;p&gt;Код класса StrategyObserver:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;class StrategyObserver : ILogSource {
private readonly Strategy _strategy;
private Thread _thread;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;public StrategyObserver(Strategy strategy, TimeSpan interval) {
  _strategy = strategy;
  strategy.Trader.WhenIntervalElapsed(interval).Do(StartObserver);
  Parent = _strategy;
  WriteLog(ErrorTypes.None, &amp;quot;test&amp;quot;);
}

public void StartObserver() {
  if (_thread != null &amp;amp;&amp;amp; _thread.IsAlive) // Если запущен, то выходим
    return;

  if (_strategy.Position == 0) // Если текущая позиция 0, то выходим
    return;

  if (_thread == null)
    _thread = new Thread(Do);
  try {
    _thread.Start();
  } finally {
  }
}

public void Do() {
  WriteLog(&amp;quot;StrategyObserver started in {0}&amp;quot;.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(&amp;quot;Позиция размером {0} не прикрыта STOP заявкой&amp;quot;.Put(position));
  if (position.Abs() != profitOrdersBalance)
    WriteLog(&amp;quot;Позиция размером {0} не прикрыта PROFIT заявкой&amp;quot;.Put(position));
}

private void getOrdersTypeVolumeSum(out decimal stopOrdersBalance, out decimal profitOrdersBalance) {
  stopOrdersBalance = 0;
  profitOrdersBalance = 0;
  stopOrdersBalance = _strategy.Orders.Where(o =&amp;gt; o.State != OrderStates.Done &amp;amp;&amp;amp;
    o.ExOrderInfo().OrderType == StrategyOrderTypes.STOP).Sum(o =&amp;gt; o.Balance);
  profitOrdersBalance = _strategy.Orders.Where(o =&amp;gt; o.State != OrderStates.Done &amp;amp;&amp;amp;
    o.ExOrderInfo().OrderType == StrategyOrderTypes.PROFIT).Sum(o =&amp;gt; o.Balance);
}

public Ecng.Collections.INotifyList&amp;lt;ILogSource&amp;gt; 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&amp;lt;LogMessage&amp;gt; Log;

public string Name {
  get {
    return &amp;quot;Observer&amp;quot;;
  }
}

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);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Логирование назначаю так:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
      _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);

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;PS Если вставить код класса с тегом &amp;quot;code=csharp&amp;quot; он не корректно отображается, поэтому вставил цитатой&lt;/em&gt;&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
</feed>