﻿<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type='text/css' href='https://stocksharp.ru/css/style.css'?>
<?xml-stylesheet type='text/css' href='https://stocksharp.ru/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-04-15T16:55:08Z</updated>
  <logo>https://stocksharp.ru/images/logo.png</logo>
  <link href="https://stocksharp.ru/handlers/atom.ashx?category=topic&amp;id=2850" rel="self" type="application/rss+xml" />
  <entry>
    <id>https://stocksharp.ru/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.ru/users/6072/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">Хочу сделать отдельный класс StrategyObserver,который в отдельном потоке будет проверять через определенные интервалы времени чтобы у связанной с ним стратегии каждая открытая позиция была прикрыта защитными заявками, если обнаружатся не прикрытые позиции выводит сообщение в лог.&lt;br /&gt;Реализовал интерфейс ILogSource для этого класса.&lt;br /&gt;&lt;br /&gt;Хочу сделать чтобы в окне MonitorWindow в дереве под стратегией (которая передается в конструктор класса StrategyObserver) был дочерний элемент, и там выводились сообщения от этого класса.&lt;br /&gt;Подскажите пожалуйста как это сделать? В приведенной ниже реализации почему-то не работает как задумано (в документации и на формуе практически нет инф-ии об этом)&lt;br /&gt;&lt;br /&gt;Код класса StrategyObserver:&lt;br /&gt;&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Цитата:&lt;/span&gt;&lt;div class="innerquote"&gt;&lt;br /&gt;class StrategyObserver : ILogSource {&lt;br /&gt;    private readonly Strategy _strategy;&lt;br /&gt;    private Thread _thread;&lt;br /&gt;    &lt;br /&gt;    public StrategyObserver(Strategy strategy, TimeSpan interval) {&lt;br /&gt;      _strategy = strategy;&lt;br /&gt;      strategy.Trader.WhenIntervalElapsed(interval).Do(StartObserver);&lt;br /&gt;      Parent = _strategy;&lt;br /&gt;      WriteLog(ErrorTypes.None, &amp;quot;test&amp;quot;);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void StartObserver() {&lt;br /&gt;      if (_thread != null &amp;amp;&amp;amp; _thread.IsAlive) // Если запущен, то выходим&lt;br /&gt;        return;&lt;br /&gt;&lt;br /&gt;      if (_strategy.Position == 0) // Если текущая позиция 0, то выходим&lt;br /&gt;        return;&lt;br /&gt;      &lt;br /&gt;      if (_thread == null)&lt;br /&gt;        _thread = new Thread(Do);&lt;br /&gt;      try {&lt;br /&gt;        _thread.Start();&lt;br /&gt;      } finally {&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    public void Do() {&lt;br /&gt;      WriteLog(&amp;quot;StrategyObserver started in {0}&amp;quot;.Put(_strategy.Trader.MarketTime));&lt;br /&gt;&lt;br /&gt;      var position = _strategy.Position;&lt;br /&gt;      if (position == 0) // Если текущая позиция 0, то выходим&lt;br /&gt;        return;&lt;br /&gt;&lt;br /&gt;      decimal stopOrdersBalance, profitOrdersBalance;&lt;br /&gt;      getOrdersTypeVolumeSum(out stopOrdersBalance, out profitOrdersBalance); // получаем баланс по защитным заявкам&lt;br /&gt;      &lt;br /&gt;      // Если объем по какой-то из защитных заявок не соответсвует объему заявки, то ждем (чтобы исключить что информация по заявкам не обновилась)&lt;br /&gt;      if (position.Abs() != stopOrdersBalance || position.Abs() != profitOrdersBalance) &lt;br /&gt;        Thread.Sleep(10000);&lt;br /&gt;      if (position != _strategy.Position) // За это время позиция изменилась, то выходим&lt;br /&gt;        return;&lt;br /&gt;&lt;br /&gt;      getOrdersTypeVolumeSum(out stopOrdersBalance, out profitOrdersBalance); // Повторно получаем баланс по защитным заявкам&lt;br /&gt;&lt;br /&gt;      if (position.Abs() != stopOrdersBalance)&lt;br /&gt;        WriteLog(&amp;quot;Позиция размером {0} не прикрыта STOP заявкой&amp;quot;.Put(position));&lt;br /&gt;      if (position.Abs() != profitOrdersBalance)&lt;br /&gt;        WriteLog(&amp;quot;Позиция размером {0} не прикрыта PROFIT заявкой&amp;quot;.Put(position));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private void getOrdersTypeVolumeSum(out decimal stopOrdersBalance, out decimal profitOrdersBalance) {&lt;br /&gt;      stopOrdersBalance = 0;&lt;br /&gt;      profitOrdersBalance = 0;&lt;br /&gt;      stopOrdersBalance = _strategy.Orders.Where(o =&amp;gt; o.State != OrderStates.Done &amp;amp;&amp;amp; &lt;br /&gt;        o.ExOrderInfo().OrderType == StrategyOrderTypes.STOP).Sum(o =&amp;gt; o.Balance);&lt;br /&gt;      profitOrdersBalance = _strategy.Orders.Where(o =&amp;gt; o.State != OrderStates.Done &amp;amp;&amp;amp;&lt;br /&gt;        o.ExOrderInfo().OrderType == StrategyOrderTypes.PROFIT).Sum(o =&amp;gt; o.Balance);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public Ecng.Collections.INotifyList&amp;lt;ILogSource&amp;gt; Childs {&lt;br /&gt;      get {&lt;br /&gt;        return null;&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private Guid id = Guid.NewGuid();&lt;br /&gt;    public Guid Id {&lt;br /&gt;      get { return id; }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public bool IsLogEnabled {&lt;br /&gt;      get {&lt;br /&gt;        throw new NotImplementedException();&lt;br /&gt;      }&lt;br /&gt;      set {&lt;br /&gt;        throw new NotImplementedException();&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public event Action&amp;lt;LogMessage&amp;gt; Log;&lt;br /&gt;&lt;br /&gt;    public string Name {&lt;br /&gt;      get {&lt;br /&gt;        return &amp;quot;Observer&amp;quot;;&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private ILogSource parent;&lt;br /&gt;    public ILogSource Parent {&lt;br /&gt;      get {&lt;br /&gt;        return parent;&lt;br /&gt;      }&lt;br /&gt;      set {&lt;br /&gt;        parent = value;&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    private void WriteLog(ErrorTypes errorType, string message) {&lt;br /&gt;      LogMessage logMessage = new LogMessage(this, DateTime.Now, errorType, message);&lt;br /&gt;      RaiseLog(logMessage);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    private void RaiseLog(LogMessage logMessage) {&lt;br /&gt;      var handler = Log;&lt;br /&gt;      if (handler != null)&lt;br /&gt;        handler(logMessage);&lt;br /&gt;    }&lt;br /&gt;  }&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Логирование назначаю так:&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush: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;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;PS Если вставить код класса с тегом &amp;quot;code=csharp&amp;quot; он не корректно отображается, поэтому вставил цитатой&lt;/em&gt;</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
</feed>