﻿<?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">Сообщество. StockSharp</title>
  <id>https://stocksharp.ru/handlers/atom.ashx?category=community&amp;page=204</id>
  <rights type="text">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  <updated>2026-04-03T18:53:17Z</updated>
  <logo>https://stocksharp.ru/images/logo.png</logo>
  <link href="https://stocksharp.ru/handlers/atom.ashx?category=community&amp;page=204" rel="self" type="application/rss+xml" />
  <entry>
    <id>https://stocksharp.ru/topic/2671/</id>
    <title type="text">EmulationTrader добавить инструмент после создания объекта?</title>
    <published>2012-05-06T18:07:33Z</published>
    <updated>2012-05-06T18:07:33Z</updated>
    <author>
      <name>Garry</name>
      <uri>https://stocksharp.ru/users/430/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <category term="тестирование" />
    <content type="html">Добрый день, возможно ли добавить инструмент в EmulationTrader после создания объекта, или надо обязательно пересоздавать? Свойство EmulationTrader.Securities только на чтение. Нашел метод RegisterSecurity но он свойство Securities не меняет, и данные для нового инструмента подтягиваться не начинают.</content>
  </entry>
  <entry>
    <id>https://stocksharp.ru/topic/2670/</id>
    <title type="text">sqlite база повредилась</title>
    <published>2012-05-05T14:35:06Z</published>
    <updated>2012-05-05T14:35:06Z</updated>
    <author>
      <name>tmt</name>
      <uri>https://stocksharp.ru/users/6032/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <category term="Hydra" />
    <content type="html">При запросах к базе пишет &amp;quot;The database disk image is malformed; database disk image is malformed&amp;quot; что сделать можно, подскажите. Дамп както реально вытащить? (нашел как вытащить на linux..)</content>
  </entry>
  <entry>
    <id>https://stocksharp.ru/topic/2669/</id>
    <title type="text">Некоторые возможности S#</title>
    <published>2012-05-05T14:13:26Z</published>
    <updated>2012-05-05T14:13:26Z</updated>
    <author>
      <name>meneo</name>
      <uri>https://stocksharp.ru/users/27812/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <category term="StockSharp" />
    <content type="html">Доброго всем времени суток!&lt;br /&gt;&lt;br /&gt;В настоящий момент знакомлюсь с возможностями S#.&lt;br /&gt;&lt;br /&gt;Буду признателен если проясните некоторые моменты:&lt;br /&gt;1. Можно ли с помощью S# создавать диалоговые окна с текстом, таблицами и стандартными элементами управления? Поясню: допустим, я пишу не робота, а нечто вроде анализатора в процессе торгов, которые производит различные расчеты, а сделки я буду совершать сам. Так вот, понимаю, что все эти расчеты можно реализовать в S#, а есть ли интерфейсный инструментарий для вывода результата этих расчетов в различных окнах.&lt;br /&gt;2. В разделе Гидра написано, что хранилище используется для тестирования стратегий. А если же мне для робота потребуются расчеты, как на свежих котировках из QUIK так и на исторических данных, как будет выстроена логика работы QUIK-S#-Хранилище-Гидра, возможно ли это?</content>
  </entry>
  <entry>
    <id>https://stocksharp.ru/topic/2668/</id>
    <title type="text">Работа с несколькими инструментами - подписка на события обновления стаканов</title>
    <published>2012-05-05T12:54:27Z</published>
    <updated>2012-05-05T12:54:27Z</updated>
    <author>
      <name>Algonavt</name>
      <uri>https://stocksharp.ru/users/639/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <category term="Quik" />
    <content type="html">Не могу разобраться, как сделать следующее:&lt;br /&gt;1. подписаться на событие появления инструментов&lt;br /&gt;2. для каждого инструмента, по которому должна идти работа, при его появлении в таблице инструментов открыть стакан&lt;br /&gt;3. подписаться на событие обновления каждого стакана&lt;br /&gt;&lt;br /&gt;Список инструментов задается в массиве строк.&lt;br /&gt;&lt;br /&gt;Как это сделать?</content>
  </entry>
  <entry>
    <id>https://stocksharp.ru/topic/2667/</id>
    <title type="text">Заявка для транзакции на регистрацию уже имеет номер</title>
    <published>2012-05-05T08:23:34Z</published>
    <updated>2012-05-05T08:23:34Z</updated>
    <author>
      <name>shumilov</name>
      <uri>https://stocksharp.ru/users/28059/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <category term="Quik" />
    <content type="html">Здравствуйте! После прохождения заявки и исполнения сделки иногда появляется подобная запись.&lt;br /&gt;2012-05-05T14:39:46 FatalError: vse.BasicTrader.QuikWorker:Ошибка при импорте данных из Quik&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Exception: System.InvalidOperationException&lt;br /&gt;Message: Заявка для транзакции на регистрацию 52766391 уже имеет номер 1526903397.&lt;br /&gt;Source: StockSharp.Quik&lt;br /&gt;StackTrace:&lt;br /&gt;   в StockSharp.Quik.QuikTrader.#=qqKvbSKnCebnIqk_3UbLETN11Q9LSqs4vEyMvnDyW92A=(UInt32 #=qZMlFpe1sDPp8nYV8HIQO9A==, Codes #=qMBJ4DV7h2GDG4BJSE6piQw==, Codes #=q9c0c7lBkTUenHK0Yx8vjmw==, OrderStatus #=qZfORDPYhStdkbMNcplo$KA==, Int64 #=qUHO05_mEyTB820DL7zaqGg==, String #=q0AvmC_jjld8_f6BCGHovrg==)&lt;br /&gt;&lt;br /&gt;не обращать на это внимание или нужно исправлять?</content>
  </entry>
  <entry>
    <id>https://stocksharp.ru/topic/2666/</id>
    <title type="text">Создание стратегий. Корзина защитных стратегий.</title>
    <published>2012-05-04T04:43:06Z</published>
    <updated>2012-05-04T04:43:06Z</updated>
    <author>
      <name>ra81</name>
      <uri>https://stocksharp.ru/users/16581/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <category term="StockSharp" />
    <content type="html">Решил поддержать хорошее начало по части написания статей на полезные темы. Попробую рассмотреть логику создания стратегий. Для многих начинающих я думаю это будет полезным подспорьем. Ну и возможно бывалые извлекут себе что-то полезное.&lt;br /&gt;&lt;br /&gt;Предположим,  что наши стратегии работают на таймфрэйме от 5 минут, нам не требуется работа с тиками.  Отсюда требования к скорости работы алгоритмов будет достаточно лояльные. При описанных допущениях наиболее логичным будет разделять алгоритмы на части. Каждая часть будет выполнять заранее определенную операцию. Собирая вместе части, мы будем получать целое. &lt;br /&gt;&lt;br /&gt;Рассмотрим такой момент как защита сделки. Когда стратегия входит в сделку и совершает трейд, часто требуется защитить сделку стопами, профитами и может быть чем-нибудь еще. Логично будет разделить разные элементы защиты и создать на каждый отдельную защитную  стратегию. В базовой поставке S# есть уже несколько готовых защитных стратегий: StopLoss, TakeProfit и так далее. Все они базируются на стратегии котирования, что не всегда бывает необходимо. Например, если ваш брокер имеет ограничение на количество транзакций в секунду, то запустив несколько одновременных стратегий котирования можно попасть в неудобную ситуацию превышения лимита транзакций. Поэтому для себя лично я реализовал свои защитные стратегии, базированные НЕ на котировании, а на простом рыночном входе. Для удобной работы с пачкой защитных стратегий, была реализована корзина защитных стратегий. Перейдем собственно к делу. &lt;br /&gt;&lt;br /&gt;Для реализации корзины стратегий, нам понадобится универсальный интерфейс защитной стратегии.&lt;br /&gt;&lt;div class='spoilertitle'&gt;&lt;input type='button' value='Показать спойлер' class='btn btn-primary' onclick="toggleSpoiler(this, 'spolier_d35d403bc92a4786983b57f2f2e1bff0');" title='Показать спойлер' /&gt;&lt;/div&gt;&lt;div class='spoilerbox' id='spolier_d35d403bc92a4786983b57f2f2e1bff0' style='display:none'&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;

    /// &amp;lt;summary&amp;gt;
    /// Защитная стратегия, которая срабатывает при определенных условиях. Предназначена для защиты сделок.
    /// &amp;lt;/summary&amp;gt;
    public interface IProtectionStrategy
    {
        /// &amp;lt;summary&amp;gt;
        /// Событие вызывается сразу же как только защитная стратегия активировалась
        /// и начала закрывать позицию.
        /// &amp;lt;/summary&amp;gt;
        event Action Activated;
        /// &amp;lt;summary&amp;gt;
        /// Защищаемая сделка.
        /// &amp;lt;/summary&amp;gt;
        MyTrade ProtectedTrade { get; }
        /// &amp;lt;summary&amp;gt;
        /// Текущее состояние стратегии, активирована она лии нет.
        /// &amp;lt;/summary&amp;gt;
        bool IsActivated { get; }
    }
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Далее на базе интерфейса мы уже можем реализовать корзину стратегий. Каждая из защитных стратегий корзины, будет защищать одну конкретную сделку. И вся корзина будет защищать эту сделку. Смысл корзины в том, что когда активировалась одна из защитных стратегий, остальные должны быть остановлены. Защитная стратегия просто совершает сделку обратную защищаемой сделке, отсюда необходимо избегать ситуации, когда сработают несколько защитных стратегий. Как только активировалась защитная стратегия, корзина тоже переходит в Активное состояние. В принципе корзина сама реализует интерфейс защитной стратегии и ведет себя аналогичным образом. После завершения активной защитной стратегии, корзина тоже завершает свою работу. Ниже пример реализации:&lt;br /&gt;&lt;br /&gt;&lt;div class='spoilertitle'&gt;&lt;input type='button' value='Показать спойлер' class='btn btn-primary' onclick="toggleSpoiler(this, 'spolier_223bac197d9b495ea896029024c3213d');" title='Показать спойлер' /&gt;&lt;/div&gt;&lt;div class='spoilerbox' id='spolier_223bac197d9b495ea896029024c3213d' style='display:none'&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;

 /// &amp;lt;summary&amp;gt;
    /// &amp;lt;para&amp;gt;
    ///     Стратегия, которая реализует корзину защитных стратегий. В стратегию объединяются несколько защитных стратегий защищающих
    ///     одну и ту же сделку. Как только будет активирована защита одной из нескольких защитных стратегий, остальные будут остановлены
    ///     и после завершения активировавшейся защитной стратегии, вся баскет стратегия будет тоже остановлена.
    ///     В момент активации одной из защитных стратегий, баскет стратегия переходит в активированное состояние и свойство &amp;lt;see cref=&amp;quot;FirstActivated&amp;quot;/&amp;gt;
    ///     указывает на активировавшуются защитную стратегию.
    /// &amp;lt;/para&amp;gt;
    /// &amp;lt;para&amp;gt;
    ///     Данная стратегия нужна если есть комбинация различных взаимоисключающих защитных техник и при срабатывании одной из них, нужно блокировать
    ///     работу остальных. Например несколько видов стопов, или стоплосс-тейпрофит итд.
    /// &amp;lt;/para&amp;gt;
    /// &amp;lt;/summary&amp;gt;
    public class BasketProtectionStrategy : Strategy, IProtectionStrategy
    {
        /// &amp;lt;summary&amp;gt;
        /// Объект для синхронизации правил активации дочерних защитных событий. Обеспечивает срабатывание одной из дочерних стратегий
        /// после которого все остальные железно будут остановлены.
        /// &amp;lt;/summary&amp;gt;
        private object _syncToken = new object();

        /// &amp;lt;summary&amp;gt;
        /// Защищаемая сделка.
        /// &amp;lt;/summary&amp;gt;
        public MyTrade ProtectedTrade { get; protected set; }
        /// &amp;lt;summary&amp;gt;
        /// Текущее состояние стратегии, активирована она лии нет.
        /// &amp;lt;/summary&amp;gt;
        public bool IsActivated { get; protected set; }
        /// &amp;lt;summary&amp;gt;
        /// Стратегия которая активировалась первой среди защитных.
        /// &amp;lt;/summary&amp;gt;
        public IProtectionStrategy FirstActivated { get; protected set; }

        /// &amp;lt;summary&amp;gt;
        /// Событие вызывается сразу же как только защитная стратегия активировалась
        /// и начала закрывать позицию.
        /// &amp;lt;/summary&amp;gt;
        public event Action Activated;



        public BasketProtectionStrategy()
        {
            ProtectedTrade = null;
            IsActivated = false;
            
            ChildStrategies.Adding += ChildStrategiesOnAdding;
        }

        /// &amp;lt;summary&amp;gt;
        /// Метод вызывается тогда, когда вызвался метод &amp;lt;see cref=&amp;quot;M:StockSharp.Algo.Strategies.Strategy.Start&amp;quot;/&amp;gt;, и состояние &amp;lt;see cref=&amp;quot;P:StockSharp.Algo.Strategies.Strategy.ProcessState&amp;quot;/&amp;gt; перешло в значение &amp;lt;see cref=&amp;quot;F:StockSharp.Algo.Strategies.ProcessStates.Started&amp;quot;/&amp;gt;.
        /// &amp;lt;/summary&amp;gt;
        protected override void OnStarting()
        {
            if (ChildStrategies.Count == 0)
                throw new InvalidOperationException(&amp;quot;Дочерние стратегии отсутствуют, невозможно запустить комплесную защитную стратегию.&amp;quot;);

            base.OnStarting();
        }

        protected override void OnStopping()
        {
            Debug.WriteLine(&amp;quot;OnStopping: Число правил {0}&amp;quot;.Put(Rules.Count));
            this.AddInfoLog(&amp;quot;Очищая список правил стратегии.&amp;quot;);
            Rules.Clear();

            this.AddInfoLog(&amp;quot;Останавливаю все дочерние стратегии.&amp;quot;);
            ChildStrategies.ToArray().ForEach(s =&amp;gt; s.Stop());

 
            base.OnStopping();
        }
        
        
        /// &amp;lt;summary&amp;gt;
        /// Метод вызывается при добавлении дочерней стратегии. Проверяет параметры стратегии и вешается на событие &amp;lt;see cref=&amp;quot;IProtectionStrategy.Activated&amp;quot;/&amp;gt;.
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name=&amp;quot;strategy&amp;quot;&amp;gt;Добавляемая защитная стратегия. Должна соответствовать интерфейсу &amp;lt;see cref=&amp;quot;IProtectionStrategy&amp;quot;/&amp;gt;&amp;lt;/param&amp;gt;
        private void ChildStrategiesOnAdding(Strategy strategy)
        {
            // проверяем чтобы защитная стратегия была, а не какая-то другая.
            if (!(strategy is IProtectionStrategy))
                throw new InvalidOperationException(&amp;quot;Дочерней может быть только защитная стратегия реализующая IProtectionStrategy.&amp;quot;);

            var protectionStrategy = strategy as IProtectionStrategy;

            // проверяем чтобы защитные стратегии были для одной сделки. Если защищаемая сделка еще не определена, берем из добавляемой стратегии.
            ProtectedTrade = ProtectedTrade ?? protectionStrategy.ProtectedTrade;
            if (ProtectedTrade != protectionStrategy.ProtectedTrade)
                throw new InvalidOperationException(&amp;quot;Добавляемые защитные стратегии должны защищать одну и ту же сделку.&amp;quot;);


            // как только активировалась защита одной из дочерних стратегий, сразу же активируем защиту комплексной стратегии.
            // Все правила будут синхронизированы через общий объект, так что вызываться смогут только по очереди. После вызова первого мы удалим все остальные.
            this
                .When(protectionStrategy.ProtectionActivated())
                .Do(s =&amp;gt; Activate(s) )
                .Once()
                .Sync(_syncToken);
        }


        /// &amp;lt;summary&amp;gt;
        /// Активирует защиту сделки, то есть начинает процедуру защиты.
        /// Если защита уже активирована, то ничего не делает. Состояние защиты проверяется 
        /// через свойство &amp;lt;see cref=&amp;quot;IsActivated&amp;quot;/&amp;gt;. В случае активации генерирует событие &amp;lt;see cref=&amp;quot;Activated&amp;quot;/&amp;gt;.
        /// Нужно самому обеспечивать потокобезопасность вызова метода. При одновременном вызове может быть коллизия.
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name=&amp;quot;strategy&amp;quot;&amp;gt;Стратегия которая активировалась и вызвала активацию комплексной защитной стратегии. &amp;lt;/param&amp;gt;
        protected virtual void Activate(IProtectionStrategy strategy)
        {
            // защита от двойного входа в состояние защиты.
            if (IsActivated) return;

            IsActivated = true;
            FirstActivated = strategy;


            this.AddInfoLog(&amp;quot;Активировалась одна из дочерних стратегий защиты, завершаем остальные стратегии защиты.&amp;quot;);
            RaiseActivatedEvent();
            
            // очищаем все правила стратегии и останавливаем все дочерние кроме активной. Когда активная тоже остановится, защитная стратегия тоже остановится.
            Rules.Clear();
            // после остановки активной дочрней стратегии мы остановим и комплексную защитную.
            this
                .When((strategy as Strategy).Stopped())
                .Do(Stop);

            StopNotActiveChilds();
        }
        /// &amp;lt;summary&amp;gt;
        /// Останавливает все дочерние защитные стратегии для сделки, кроме той которая активировалась.
        /// &amp;lt;/summary&amp;gt;
        private void StopNotActiveChilds()
        {
            var firstActivated = FirstActivated as Strategy;
            var stoppingStrategies = ChildStrategies.Where(s =&amp;gt; s != firstActivated).ToArray();
            stoppingStrategies.ForEach(s =&amp;gt; s.Stop());
        }

        /// &amp;lt;summary&amp;gt;
        /// Сгенерировать событие об активации защиты.
        /// &amp;lt;/summary&amp;gt;
        protected virtual void RaiseActivatedEvent()
        {
            Activated.SafeInvoke();
        }

        protected override void DisposeManaged()
        {
            ChildStrategies.Adding -= ChildStrategiesOnAdding;
            base.DisposeManaged();
        }
    }
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Далее реализуем защитную стратегию которую будем добавлять в корзину. Первое что хочется показать, это реализацию стратегии, которая выставляет физический стоп и мониторит его состояние. Как только стоп активируется, стратегия становится активной. Если стратегию остановить, стоп заявка снимается. Я выбрал эту стратегию, из-за определенных нюансов в реализации, которые многим помогут.&lt;br /&gt;&lt;br /&gt;&lt;div class='spoilertitle'&gt;&lt;input type='button' value='Показать спойлер' class='btn btn-primary' onclick="toggleSpoiler(this, 'spolier_c1db0eeda4d04a348886360a80f5afb0');" title='Показать спойлер' /&gt;&lt;/div&gt;&lt;div class='spoilerbox' id='spolier_c1db0eeda4d04a348886360a80f5afb0' style='display:none'&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;

    /// &amp;lt;summary&amp;gt;
    /// Данная стратегия используется для выставления реального стопа и слежения за его состоянием.
    /// Когда стоп начнет исполняться, стратегия активирует событие &amp;lt;see cref=&amp;quot;Activated&amp;quot;/&amp;gt; и переходит в активированное состояние.
    /// &amp;lt;/summary&amp;gt;
    public class RealStopLossStrategy : Strategy, IProtectionStrategy
    {
        private Unit _protectionLevel;
        private Unit _slippage;
        private Order _stopOrder;
        private object _globalLock = new object();

        /// &amp;lt;summary&amp;gt;
        /// Защищаемая сделка.
        /// &amp;lt;/summary&amp;gt;
        public MyTrade ProtectedTrade { get; protected set; }
        /// &amp;lt;summary&amp;gt;
        /// Текущее состояние стратегии, активирована она лии нет.
        /// &amp;lt;/summary&amp;gt;
        public bool IsActivated { get; protected set; }

        /// &amp;lt;summary&amp;gt;
        /// Событие вызывается сразу же как только защитная стратегия активировалась
        /// и начала закрывать позицию.
        /// &amp;lt;/summary&amp;gt;
        public event Action Activated;


        /// &amp;lt;summary&amp;gt;
        /// Создает стратегию защиты сделки на основе скользящей средней.
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name=&amp;quot;protectedTrade&amp;quot;&amp;gt;Защищаемая сделка.&amp;lt;/param&amp;gt;
        /// &amp;lt;param name=&amp;quot;protectionLevel&amp;quot;&amp;gt;Уровень на который стоп отстоит от цены сделки. Может быть фикс, или процент. &amp;lt;/param&amp;gt;
        /// &amp;lt;param name=&amp;quot;slippage&amp;quot;&amp;gt;Проскальзывание, которое будет выставлено в стоп ордере. &amp;lt;/param&amp;gt;
        /// &amp;lt;exception cref=&amp;quot;ArgumentNullException&amp;quot;&amp;gt;Если не заданы аргументы.&amp;lt;/exception&amp;gt;
        /// &amp;lt;exception cref=&amp;quot;ArgumentException&amp;quot;&amp;gt;Если скользящая НЕ сформирована.&amp;lt;/exception&amp;gt;
        public RealStopLossStrategy(MyTrade protectedTrade, Unit protectionLevel, Unit slippage)
        {
            if (protectedTrade == null)
                throw new ArgumentNullException(&amp;quot;protectedTrade&amp;quot;);

            if (protectionLevel == null)
                throw new ArgumentNullException(&amp;quot;protectionLevel&amp;quot;);

            if (slippage == null)
                throw new ArgumentNullException(&amp;quot;slippage&amp;quot;);
            /*
            if ( (protectionLevel.Type != UnitTypes.Percent) &amp;amp;&amp;amp; (protectionLevel.Type != UnitTypes.Absolute) )
                throw new ArgumentException(&amp;quot;Уровень стопа можно задавать либо в абсолютных значениях либо в процентах.&amp;quot;, &amp;quot;protectionLevel&amp;quot;);

            if ((slippage.Type != UnitTypes.Percent) &amp;amp;&amp;amp; (slippage.Type != UnitTypes.Absolute))
                throw new ArgumentException(&amp;quot;Уровень проскальзывания можно задавать либо в абсолютных значениях либо в процентах.&amp;quot;, &amp;quot;slippage&amp;quot;);
            */

            
            ProtectedTrade = protectedTrade;
            // это нужно чтобы могли формироваться заявки через хелпер методы. Им нужен будет объем.
            this.Volume = ProtectedTrade.Trade.Volume;
            _protectionLevel = protectionLevel;
            _slippage = slippage;
        }


        protected override void OnStarting()
        {
            base.OnStarting();

            this.AddWarningLog(&amp;quot;Начинаю защищать сделку Id: {0} по ордеру Id: {1}&amp;quot;.Put(ProtectedTrade.Trade.Id, ProtectedTrade.Order.Id));


            // когда позиция стратегии изменилась, значит защита активировалась и стоп сработал войдя в сделку.
            this
                .When(this.PositionChanged())
                .Do(s =&amp;gt;
                {
                    Activate();

                    TryStop();
                });

            Begin();
        }

        protected override void OnStopping()
        {
            this.AddInfoLog(&amp;quot;Очищаю список правил стратегии.&amp;quot;);
            Rules.Clear();

            this.AddInfoLog(&amp;quot;Останавливаю все дочерние стратегии.&amp;quot;);
            ChildStrategies.SyncDo(c =&amp;gt; c.ToArray().ForEach(strat =&amp;gt; strat.Stop())); 

            base.OnStopping();
        }
        /// &amp;lt;summary&amp;gt;
        /// Метод вызывается тогда, когда состояние процесса &amp;lt;see cref=&amp;quot;P:StockSharp.Algo.Strategies.Strategy.ProcessState&amp;quot;/&amp;gt; перешло в значение &amp;lt;see cref=&amp;quot;F:StockSharp.Algo.Strategies.ProcessStates.Stopped&amp;quot;/&amp;gt;.
        /// &amp;lt;/summary&amp;gt;
        protected override void OnStopped()
        {
            var currVol = this.PositionManager.Position.Abs();
            var baseVol = ProtectedTrade.Trade.Volume;
            var restVol = baseVol - currVol;

            if (currVol != baseVol)
                this.AddWarningLog(&amp;quot;Стратегия RealStopLossStrategy завершила свою работу с оставшимся защищаемым объемом {0}. Исходный объем {1}&amp;quot;.Put(restVol, baseVol));
            else
                this.AddWarningLog(&amp;quot;Стратегия RealStopLossStrategy завершила свою работу с полностью исполненным защищаемым объемом. Исходный объем {0}&amp;quot;.Put(baseVol));


            base.OnStopped();
        }

        public override void Stop()
        {
            // если есть активные ордера, то не завершаем работу а пробуем сначала отменить эти ордера.
            // отменяем все оставшиеся активные ордера в стратегии. Например стратегия была частью баскет стратегии и была остановлена, останутся стопзаявки.
            // нужно удалить все зависшие стоп заявки стратегии.
            if (this.HaveActiveStopOrders())
            {
                this.AddInfoLog(&amp;quot;Стратегия имеет активные ордера, пробуем отменить их.&amp;quot;);
                this.GuarantyCancelOrders(new [] {_stopOrder});

                this
                    .When(_stopOrder.Canceled())
                    .Do(o =&amp;gt;
                            {
                                this.AddInfoLog(&amp;quot;Активные ордера отменены, останавливаем стратегию.&amp;quot;);
                                Stop();
                            });

                return;
            }
            
            base.Stop();
        }

        private void Begin()
        {
            Order order = null;
            var direction = ProtectedTrade.Order.Direction.Invert();
            var price = ProtectedTrade.Trade.Price;

            // сформируем ордер в зависимости от направления стратегии
            if (direction == OrderDirections.Buy)
            {
                var stopPrice = _protectionLevel.Type == UnitTypes.Limit
                                ? _protectionLevel.Value
                                : price + _protectionLevel;


                var slippage = _slippage.Type == UnitTypes.Limit ? _slippage : (price + _slippage) - price;

                order = this.CreateBuyStopOrder((double)slippage, (double)stopPrice);
            }

            if (direction == OrderDirections.Sell)
            {
                var stopPrice = _protectionLevel.Type == UnitTypes.Limit
                                ? _protectionLevel.Value
                                : price - _protectionLevel;


                var slippage = _slippage.Type == UnitTypes.Limit ? _slippage : (price + _slippage) - price;

                order = this.CreateSellStopOrder((double) slippage, (double)stopPrice);
            }

            // выставляем ордер
            SetOrder(order);
        }

        /// &amp;lt;summary&amp;gt;
        /// Выставляет ордер и все правила на ордер вешает.
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name=&amp;quot;order&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;
        private void SetOrder(Order order)
        {

            #region Заводим стратегию выставления заяки для гарантии того что заявка поставилась.

            // сия стратегия нам гарантированно ордер поставит, или выдаст ошибку если поставить не получится.
            var setOrderStrategy = new GuarantyRegisterOrderStrategy(order);

            SuspendRules();
            var errorRule = StrategyRuleHelper.Error(setOrderStrategy);
            var stoppedRule = setOrderStrategy.Stopped();
            var syncToken = new object();

            // Если зарегать ордер не удается мы завершаем работу стратегии с ошибкой.
            this
                .When(errorRule)
                .Do(e =&amp;gt;
                {
                    Rules.Remove(stoppedRule);
                    var msg = &amp;quot;При регистрации ордера TransId: {0} произошла фатальная ошибка {1}.&amp;quot;.Put(setOrderStrategy.Order.TransactionId, e.Message);
                    FatalFinish(msg);
                })
                .Once()
                .Sync(syncToken);

            // Когда стратегия остановилась перед ошибкой, она значит завершилась успешно.
            this
                .When(stoppedRule)
                .Do(s =&amp;gt;
                {
                    Rules.Remove(errorRule);
                    this.AddInfoLog(&amp;quot;Ордер успешно зарегистрирован TransId: {0} State: {1}&amp;quot;, setOrderStrategy.Order.TransactionId, setOrderStrategy.Order.State);
                    SetOrderRules(setOrderStrategy.Order);
                })
                .Once()
                .Sync(syncToken);

            ResumeRules();
            // запуск стратегии регистрации ордера.
            ChildStrategies.Add(setOrderStrategy);

            #endregion
        }

        private void SetOrderRules(Order order)
        {
            if (order == null)
                throw new ArgumentNullException(&amp;quot;order&amp;quot;, &amp;quot;Стоп ордер не задан для стратегии&amp;quot;);

            _stopOrder = order;

            // когда состояние стоп ордера изменилось, и он стал активен, значит сработали стоп условия и защита активировалась.
            this
                .When(_stopOrder.Changed())
                .Do(o =&amp;gt;
                        {
                            if (o.State != OrderStates.Active) return;

                            Activate();
                        });
        }


        /// &amp;lt;summary&amp;gt;
        /// Активирует защиту сделки, то есть начинает процедуру защиты.
        /// Если защита уже активирована, то ничего не делает. Состояние защиты проверяется 
        /// через свойство &amp;lt;see cref=&amp;quot;IsActivated&amp;quot;/&amp;gt;. В случае активации генерирует событие &amp;lt;see cref=&amp;quot;Activated&amp;quot;/&amp;gt;
        /// &amp;lt;/summary&amp;gt;
        protected virtual void Activate()
        {
            // защита от двойного входа в состояние защиты.
            lock (_globalLock)
            {
                if (IsActivated) return;

                IsActivated = true;
            }

            this.AddInfoLog(&amp;quot;Стоп ордер Id: {0} сработал. Защита активировалась.&amp;quot;.Put(_stopOrder.Id));
            RaiseActivatedEvent();
        }
        /// &amp;lt;summary&amp;gt;
        /// Сгенерировать событие об активации защиты.
        /// &amp;lt;/summary&amp;gt;
        protected virtual void RaiseActivatedEvent()
        {
            Activated.SafeInvoke();
        }
        /// &amp;lt;summary&amp;gt;
        /// Метод проверяет текущую позицию стратегии, если она стала равна объему защищаемой сделки, значит стоп ордер
        /// исполнился, стратегия совершила контр сделку и может быть остановлена.
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;
        protected virtual bool NeedStop()
        {
            var absPos = this.PositionManager.Position.Abs();
            var vol = ProtectedTrade.Trade.Volume;

            return absPos == vol;
        }

        protected virtual bool NeedActivate()
        {
            throw new NotImplementedException(&amp;quot;NeedActivate&amp;quot;);
        }

        private void TryStop()
        {
            if (NeedStop()) Stop();
        }



        protected virtual void Finish()
        {
            Stop();
        }

        protected virtual void FatalFinish(string message)
        {
            OnError(new Exception(message));
            Stop();
        }


    }
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Как видно, в стратегии используется подстратегии для регистрации ордеров и для отмены ордеров. Это укладывается в выбранную парадигму реализации операций в виде отдельных частей. При регистрации ордера, может произойти ошибка или еще какой неприятный момент. Заявку надо будет переподать и отследить ее регистрацию. Все это реализуемо в виде отдельной стратегии. Так же можно поступить с отменой заявок, что мной и сделано. Реализацию этих подстратегий не выкладываю, оставим как домашнее задание .&lt;br /&gt;&lt;br /&gt;Теперь  собственно пример использования всего этого добра . Смотрим ниже.&lt;br /&gt;&lt;br /&gt;&lt;div class='spoilertitle'&gt;&lt;input type='button' value='Показать спойлер' class='btn btn-primary' onclick="toggleSpoiler(this, 'spolier_c2b6729b7cbb4ef38305d4980f1c532a');" title='Показать спойлер' /&gt;&lt;/div&gt;&lt;div class='spoilerbox' id='spolier_c2b6729b7cbb4ef38305d4980f1c532a' style='display:none'&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;

            var fixStopStrategy = new RealStopLossStrategy(trade, FixedStop, 2.Percents());
            var protectStrategy = new BasketProtectionStrategy();

            protectStrategy.ChildStrategies.Add(fixStopStrategy);
            ChildStrategies.Add(protectStrategy);

&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;</content>
  </entry>
  <entry>
    <id>https://stocksharp.ru/topic/2665/</id>
    <title type="text">Ошибка подключения к серверу Плазы  &amp;apos;P2ERR_MQ_TIMEOUT&amp;apos;</title>
    <published>2012-05-03T18:53:14Z</published>
    <updated>2012-05-03T18:53:14Z</updated>
    <author>
      <name>Александр (ПАА)</name>
      <uri>https://stocksharp.ru/users/5968/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <category term="Plaza 2" />
    <content type="html">После очередной попытки полностью пересобрать проект с 4.1 получаю ошибку подключения &lt;br /&gt;&lt;br /&gt;Ошибка подключения к серверу Плазы. Код -2147196924, описание &amp;#39;P2ERR_MQ_TIMEOUT&amp;#39;&lt;br /&gt;&lt;br /&gt;В логе пишет вот это.&lt;br /&gt;&lt;br /&gt;2012-05-04 00:24:56.295;p2mq-cli;;MQ library started.&lt;br /&gt;2012-05-04 00:24:56.299;p2repl-cli;;Client replication library started&lt;br /&gt;2012-05-04 00:24:56.361;lrpcq;warning;Insufficient rights for file mapping Global\012af5bd0129, trying to use local file mapping 012af5bd0129&lt;br /&gt;2012-05-04 00:24:59.362;P2ClientGate;error;p2err 24580=0x6004 - &amp;#39;MQ:TIMEOUT&amp;#39;;Couldn&amp;#39;t connect to MQ</content>
  </entry>
  <entry>
    <id>https://stocksharp.ru/topic/2664/</id>
    <title type="text">PRICE,ASK,BID</title>
    <published>2012-05-03T18:17:10Z</published>
    <updated>2012-05-03T18:17:10Z</updated>
    <author>
      <name>Макс</name>
      <uri>https://stocksharp.ru/users/6040/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <category term="Plaza 2" />
    <content type="html">Подписался на события новых сделок, отфильтровал по нужному инструменту.&lt;br /&gt;Записываю в базу MSSQL PRICE, а заодно, ASK,BID на момент последней сделки(одной строкой).&lt;br /&gt;После анализа смотрю, что за день на тестовом сервере совершается около 40000 сделок и в 3000 сделок(строк) PRICE либо больше ASK, либо меньше BID.&lt;br /&gt;Пытался записывать в базу PRICE двумя способами:&lt;br /&gt;1. _ins1.LastTrade.Price&lt;br /&gt;2. trades.Last().Price (отфильтрованный по нужному инструменту)&lt;br /&gt;&lt;br /&gt;Оба варианта иногда дают разную цену в один и тот же момент и PRICE в обоих случаях иногда выбивается из интервала ASK-BID.&lt;br /&gt;&lt;br /&gt;Какой вариант лучше использовать? В каком варианте данные быстрее обновляются?&lt;br /&gt;И почему цена выпрыгивает из ASK-BID диапазона?&lt;br /&gt;&lt;br /&gt;</content>
  </entry>
  <entry>
    <id>https://stocksharp.ru/topic/2663/</id>
    <title type="text">При попытке получить Код клиента - ошибка</title>
    <published>2012-05-03T14:09:24Z</published>
    <updated>2012-05-03T14:09:24Z</updated>
    <author>
      <name>vader</name>
      <uri>https://stocksharp.ru/users/28223/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <category term="Quik" />
    <content type="html">Пытаюсь получить Код клиента для портфеля ММВБ таким образом, &lt;br /&gt;var aa = portfolio.ExtensionInfo[DdeEquityPortfolioColumns.ClientCode];&lt;br /&gt;выдает ошибку - System.Collections.Generic.KeyNotFoundException: Данный ключ отсутствует в словаре.&lt;br /&gt;   в System.Collections.Generic.Dictionary`2.get_Item(TKey key)&lt;br /&gt;&lt;br /&gt;Попытался добавить этот ключ в словарь, &lt;br /&gt;trader.EquityPortfoliosTable.Columns.Add(DdeEquityPortfolioColumns.ClientCode);&lt;br /&gt;но говорит, что уже экспортитруется.&lt;br /&gt;В чем может быть проблема?</content>
  </entry>
  <entry>
    <id>https://stocksharp.ru/topic/2662/</id>
    <title type="text">Переход на боевой сервер Плазы</title>
    <published>2012-05-03T12:09:45Z</published>
    <updated>2012-05-03T12:09:45Z</updated>
    <author>
      <name>Макс</name>
      <uri>https://stocksharp.ru/users/6040/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <category term="Plaza 2" />
    <content type="html">Погонял 4.1 на тестовом сервере, в целом, все работает, даже что-то получается заработать там)&lt;br /&gt;Правда там бывает за пару минут скачки на 5000 пунктов туда-сюда.&lt;br /&gt;Обдумываю попробовать перейти на боевой, в связи с этим возникаю вопросы. Может кто-то переходил уже и поделиться опытом?&lt;br /&gt;Интересует:&lt;br /&gt;1. Какого брокера лучше выбрать (у них для HFT везде индивидуальных подход)&lt;br /&gt;2. При покупке основного логина есть ли смысл использовать промежуточный сервер брокера за 2000р или лучше воспользоваться публичным пром.сервер самой биржи РТС за 4000р. Какая разница в пинге? &lt;br /&gt;3. Нужно ли писать заявления для логина на биржу или все делается через брокера?&lt;br /&gt;4. Есть ли подводные камни с сертификацией робота? Отправил вопрос на биржу, жду ответ.&lt;br /&gt;&lt;br /&gt;Если Вы перешли - поделитесь опытом плиз.&lt;br /&gt;</content>
  </entry>
  <entry>
    <id>https://stocksharp.ru/topic/2661/</id>
    <title type="text">Какое количество роботов(стратегий) у вас работает с одним Trader&amp;apos;ом одновременно?</title>
    <published>2012-05-03T08:53:47Z</published>
    <updated>2012-05-03T08:53:47Z</updated>
    <author>
      <name>Serg</name>
      <uri>https://stocksharp.ru/users/484/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <category term="StockSharp" />
    <content type="html">В продолжение темы опроса &lt;a href="http://stocksharp.com/forum/2605/Iesli-Vy-ispol-zuietie-Stock---na-chiem-vy-siditie/" title="http://stocksharp.com/forum/2605/Iesli-Vy-ispol-zuietie-Stock---na-chiem-vy-siditie/"&gt;Если Вы используете Stock#, на чем вы сидите?)&lt;/a&gt; хотел бы задать следующий вопрос: Какое количество роботов(стратегий) у вас работает с одним Trader&amp;#39;ом одновременно? &lt;br /&gt;Если у вас крутиться более одной стратегии было бы интересно почитать о вашей реализации.&lt;br /&gt;Спасибо)&lt;br /&gt;&lt;br /&gt;upd: хочу внести маленькое уточнение интересуют реализации разнотипных стратегий.</content>
  </entry>
  <entry>
    <id>https://stocksharp.ru/topic/2660/</id>
    <title type="text">WorkingTime.IsTradeDate некорректно работает при добавлении SpecialWorkingDays и SpecialHolidays</title>
    <published>2012-05-03T07:35:44Z</published>
    <updated>2012-05-03T07:35:44Z</updated>
    <author>
      <name>Den</name>
      <uri>https://stocksharp.ru/users/6003/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <category term="StockSharp" />
    <content type="html">Уважаемые разработчики!&lt;br /&gt;&lt;br /&gt;S# 4.0.23&lt;br /&gt;Обнаружил небольшую багу при добавлении SpecialWorkingDays и SpecialHolidays.&lt;br /&gt;WorkingTime.IsTradeDate проверяет целиком весь DateTime, а не только компоненту Date, что есть неверно.&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;br /&gt;            DateTime w0 = DateTime.ParseExact(&amp;quot;20120428&amp;quot;, &amp;quot;yyyyMMdd&amp;quot;, CultureInfo.InvariantCulture);&lt;br /&gt;            DateTime w1 = DateTime.ParseExact(&amp;quot;20120428-1000&amp;quot;, &amp;quot;yyyyMMdd-HHmm&amp;quot;, CultureInfo.InvariantCulture);&lt;br /&gt;            DateTime w2 = DateTime.ParseExact(&amp;quot;20120428-1100&amp;quot;, &amp;quot;yyyyMMdd-HHmm&amp;quot;, CultureInfo.InvariantCulture);&lt;br /&gt;            Exchange.Rts.WorkingTime.SpecialWorkingDays = new&amp;#91;&amp;#93; { w0 };&lt;br /&gt;            Console.WriteLine(&amp;quot;{0}  isTradeDate: {1}&amp;quot;, w0, Exchange.Rts.WorkingTime.IsTradeDate(w0, true));&lt;br /&gt;            Console.WriteLine(&amp;quot;{0}  isTradeDate: {1}&amp;quot;, w1, Exchange.Rts.WorkingTime.IsTradeDate(w1, true));&lt;br /&gt;            Console.WriteLine(&amp;quot;{0}  isTradeDate: {1}&amp;quot;, w2, Exchange.Rts.WorkingTime.IsTradeDate(w2, true));&lt;br /&gt;&lt;br /&gt;            DateTime h0 = DateTime.ParseExact(&amp;quot;20120427&amp;quot;, &amp;quot;yyyyMMdd&amp;quot;, CultureInfo.InvariantCulture);&lt;br /&gt;            DateTime h1 = DateTime.ParseExact(&amp;quot;20120427-1000&amp;quot;, &amp;quot;yyyyMMdd-HHmm&amp;quot;, CultureInfo.InvariantCulture);&lt;br /&gt;            DateTime h2 = DateTime.ParseExact(&amp;quot;20120427-1100&amp;quot;, &amp;quot;yyyyMMdd-HHmm&amp;quot;, CultureInfo.InvariantCulture);&lt;br /&gt;            Exchange.Rts.WorkingTime.SpecialHolidays = new&amp;#91;&amp;#93; { h0 };&lt;br /&gt;            Console.WriteLine(&amp;quot;{0}  isTradeDate: {1}&amp;quot;, h0, Exchange.Rts.WorkingTime.IsTradeDate(h0, true));&lt;br /&gt;            Console.WriteLine(&amp;quot;{0}  isTradeDate: {1}&amp;quot;, h1, Exchange.Rts.WorkingTime.IsTradeDate(h1, true));&lt;br /&gt;            Console.WriteLine(&amp;quot;{0}  isTradeDate: {1}&amp;quot;, h2, Exchange.Rts.WorkingTime.IsTradeDate(h2, true));&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&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;br /&gt;28.04.2012 0:00:00  isTradeDate: True&lt;br /&gt;28.04.2012 10:00:00  isTradeDate: False&lt;br /&gt;28.04.2012 11:00:00  isTradeDate: False&lt;br /&gt;27.04.2012 0:00:00  isTradeDate: False&lt;br /&gt;27.04.2012 10:00:00  isTradeDate: True&lt;br /&gt;27.04.2012 11:00:00  isTradeDate: True&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Вместо трех True и трех False&lt;br /&gt;</content>
  </entry>
  <entry>
    <id>https://stocksharp.ru/topic/2659/</id>
    <title type="text">Переход с 4.0 на 4.1</title>
    <published>2012-05-03T07:21:16Z</published>
    <updated>2012-05-03T07:21:16Z</updated>
    <author>
      <name>Александр (ПАА)</name>
      <uri>https://stocksharp.ru/users/5968/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <category term="Plaza 2" />
    <content type="html">Добрый день. После перехода возникла проблема. В какой-то момент перестает приходить информация по последней сделке, т.е. последняя сделка по инструменту просто не меняется хотя в параллельно запущенной версии на 4.0 все изменения приходят. Что делать? &lt;br /&gt;</content>
  </entry>
  <entry>
    <id>https://stocksharp.ru/topic/2658/</id>
    <title type="text">Вопрос по основам</title>
    <published>2012-05-03T06:58:26Z</published>
    <updated>2012-05-03T06:58:26Z</updated>
    <author>
      <name>Smelov</name>
      <uri>https://stocksharp.ru/users/27678/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <category term="Quik" />
    <content type="html">Здравствуйте!&lt;br /&gt;&lt;br /&gt;Скажите пожалуйста, насколько будет целесообразным использовать Вашу библиотеку в Win Forms проекте (какие могут возникнуть трудности и все ли будет работать). Основные причины: 1. есть готовая программа на C# в winforms 2. Отсутствие опыта в WPF. Программа на winforms не из разряда HFT или других быстрых роботов, а скорее для формирования портфеля. Все что нужно - вставить функционал вывода заявок на биржу и просмотреть как они исполнились.&lt;br /&gt;&lt;br /&gt;Спасибо за внимание</content>
  </entry>
  <entry>
    <id>https://stocksharp.ru/topic/2657/</id>
    <title type="text">Статус инструмента и восстановление после разрыва связи.</title>
    <published>2012-05-03T06:09:17Z</published>
    <updated>2012-05-03T06:09:17Z</updated>
    <author>
      <name>shumilov</name>
      <uri>https://stocksharp.ru/users/28059/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <category term="Quik" />
    <content type="html">Здравствуйте! Есть рабочий робот с кодами, программист прекратил поддержку, разбираюсь сам. Робот получает сигналы с сайта и исполняет заявки. Проблем 2. 1. Заявки приходят в любое время, как используя статус инструмента(либо другой способ) пропустить период пром-клиринга Фортс 14.00-14.03 и не пытаться в него выставлять заявки в квик?&lt;br /&gt;2. Если сигнал пришел в момент, когда связь квика с сервером потеряна, то после восстановления соединения, сигнал иногда успевает исполниться, иногда нет. Закономерности не обнаружил. Что необходимо сделать после восстановления связи квика с сервером, перезапустить вывод ДДЕ? StockSharp 4.0.23</content>
  </entry>
  <entry>
    <id>https://stocksharp.ru/topic/2656/</id>
    <title type="text">NewPositions v4.0.23</title>
    <published>2012-05-02T11:20:45Z</published>
    <updated>2012-05-02T11:20:45Z</updated>
    <author>
      <name>tmt</name>
      <uri>https://stocksharp.ru/users/6032/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <category term="Quik" />
    <content type="html">Здраствуйте, помогите пожалуйста решить проблемку.&lt;br /&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;
if (MainWindow._position_rim2 != null)
                                {
          if (MainWindow._position_rim2.CurrentValue == 0)
                                          {
                                                  MessageBox.Show(&amp;quot;открываем позицию&amp;quot;);
                                          }
                                }&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;те, сначало проверяем появилась ли информация о позиции rim2, если нет, то следовательно ничего не откроем..&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;
Trader.NewPositions += positions =&amp;gt;
                {
                    if (_position_rim2 == null) { _position_rim2 = positions.FirstOrDefault(p =&amp;gt; p.Security == _rim2); }
                }&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Как можно получить эту информацию без открытия позиции? Помогите пожалуйста!</content>
  </entry>
  <entry>
    <id>https://stocksharp.ru/topic/2655/</id>
    <title type="text">Важно! Код UUID для подключения коннектора к API OEC!</title>
    <published>2012-05-02T10:46:47Z</published>
    <updated>2012-05-02T10:46:47Z</updated>
    <author>
      <name>Maksim Chertkov</name>
      <uri>https://stocksharp.ru/users/707/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <category term="OpenECry" />
    <content type="html">Наверняка многие из тех кто захочет подключится в первый раз удидят ошибку - Software not permitted. (&amp;quot;Для данного ПО соединение не разрешено&amp;quot;)&lt;br /&gt;Пишу путь решения этой проблемы, без этого коннектор не подключается к тестовому серверу для разработчиков api.openecry.com.&lt;br /&gt;У API OEC есть такая особенность - каждое приложение при подключении к нему должно сообщать свой UUID код, иначе выдается ошибка - Software not permitted.&lt;br /&gt;Даже если вы зарегистрировались в OEC как разработчик и получили логин и пароль - код UUID вам нужно получать отдельно, специальным запросом в службу поддержки по адресу &lt;a href="https://stocksharp.ru/away/?u=AQAAAAAAAACCtRaSKZCgKLf4-0L1omq5sEFvQCd14aPpbPksrA_bxJ71KMzlOwRgB2qAe_fq5uw"&gt;tickets_support@openecry.com&lt;/a&gt;, где на английском надо сообщить свой логин и попросить прислать вам номер UUID. &lt;br /&gt;По получении необходимо залезть в исходник коннектора и либо исправить там в файле OECTrader.cs строку private const string _oecUuid =&amp;quot;ваш код&amp;quot;, либо пойти дальше и сделать его одним из публичных свойств класса OECTrader и прописать уже потом в своей программе (видимо разработчик коннектора был не в курсе и не вывел наружу это нужное свойство. Последнюю версию коннектора на кодеплексе я так и не нашел, может уже исправили, если нет, то оччень желательно это сделать). После всех вышеописанных действий доступ должен заработать.&lt;br /&gt;&lt;br /&gt;Еще сейчас дописал к коннектору функцию получения свечек по инструментам, сейчас в режиме тестирования, как закончу - если еще актуально будет, то выложу обязательно.&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;</content>
  </entry>
  <entry>
    <id>https://stocksharp.ru/topic/2654/</id>
    <title type="text">Ошибка при формированиии списка сделок</title>
    <published>2012-05-01T15:02:52Z</published>
    <updated>2012-05-01T15:02:52Z</updated>
    <author>
      <name>gazrvs_nur</name>
      <uri>https://stocksharp.ru/users/5983/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <category term="Hydra" />
    <content type="html">Добрый день господа!&lt;br /&gt;&lt;br /&gt;Гидра заработала хорошо, закачал GAZP c Финама за период с 24.04.2011г. по 28.05.2012г.&lt;br /&gt;Однако при попытке отобразить сделки за период больше полгода (например с 01.10.2011г.) заполняет память до 3Гб выдает ошибку, а список сделок соответственно не показывает.&lt;br /&gt;За меньший период все работает отлично.&lt;br /&gt;&lt;br /&gt;Также Гидра освобождает занимаемую память (1-2 Гб) только после закрытия программы, даже при закрытой таблице сделок.&lt;br /&gt;&lt;br /&gt;Это особенность программы или проблема в объеме памяти?&lt;br /&gt;Windows 7 Ultimate, х64, ОЗУ 4Гб.&lt;br /&gt;&lt;br /&gt;Интересно сколько желательно иметь памяти за работы с Гидрой и Stocksharp?&lt;br /&gt;И есть ли способы принудительного освобождения памяти.&lt;br /&gt;&lt;br /&gt;</content>
  </entry>
  <entry>
    <id>https://stocksharp.ru/topic/2653/</id>
    <title type="text">История одной стратегий</title>
    <published>2012-04-30T13:14:29Z</published>
    <updated>2012-04-30T13:14:29Z</updated>
    <author>
      <name>Rrider</name>
      <uri>https://stocksharp.ru/users/28488/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <category term="клуб алготрейдеров" />
    <content type="html">По мотивам ветки: &lt;a href="http://stocksharp.com/forum/361/Torghovyie-roboty-Shagh-1--Tiestirovaniie-torghovoi-sistiemy/
" title="http://stocksharp.com/forum/361/Torghovyie-roboty-Shagh-1--Tiestirovaniie-torghovoi-sistiemy/
"&gt;http://stocksharp.com/fo...iie-torghovoi-sistiemy/
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Был немного удивлен увидев практически точное описание стратегий, по которой я торговал последнее время, поэтому решил высказаться.&lt;br /&gt;&lt;br /&gt;Отличная стратегия, отличные результаты, но можно ли этой стратегией реально заработать на рынке? Только если повезет! Давайте посмотрим как это стратегия работает на реальном рынке. Как это сделать? Да очень просто – я вам расскажу. Последние два года я торговал по описанной выше стратегии и готов поделиться результатами.&lt;br /&gt;&lt;br /&gt;Итак,  стратегия была мной разработана в начале 2010 года, протестирована и оптимизирована в программе собственной разработки. Чем отличается от описанной выше? Во первых, лучшие результаты были получены с МА периодом 652 – это количество 5-минутных свечек за 4 дня. Во-вторых, я не ждал локальной коррекции в виде свечи против тренда , а ждал когда Хай и Лой свечи входа был выше Хая и Лоя предыдущей свечи, это в Лонг, в шорт, соответвственно, наборот.  Объем входа был 80% от депо. Стоп на уровне 5% от депо. Количество сделок вдень – не более одной. Закрытие позиции всегда в 23.30. Инструмент – Фьюч на индекс РТС. Торговля руками. &lt;br /&gt;&lt;br /&gt;Торговля стартовала 1 марта 2010 года. Стартовое депо – 355 000 руб. И вот результат реальной торговли по месяцам:&lt;br /&gt;&lt;br /&gt;&lt;span style="color:green"&gt;Март: +24,6%&lt;br /&gt;Апрель: +25,1%&lt;br /&gt;Май: +44,2%&lt;br /&gt;Июнь: +4,5% &lt;/span&gt;&lt;br /&gt;&lt;span style="color:red"&gt;Июль: -28,7%&lt;br /&gt;Август: -19,1%&lt;br /&gt;Сентябрь: -20,5%&lt;br /&gt;Октябрь: -22,3%&lt;br /&gt;Ноябрь: -21,2%&lt;br /&gt;Декабрь: -17,2%&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;20 декабря торговля была остановлена. Итоги: Первые три месяца все было отлично,  в мае счет вырос до 808 000 руб. Потом – как отрезало, 6 месяцев подряд убыточны.  Торговля был остановлена, когда счет упал до 100000. При этом каждый месяц со счета выводилось немного средств, всего было выведено 350000 руб. Заработать удалось всего 100000 руб. Тестовые показатели были значительно лучше. &lt;br /&gt;После этого я взял длительный перерыв для анализа ситуации. Какие выводы я сделал:&lt;br /&gt;&lt;br /&gt;1.	Я торговал руками, а следовательно не всегда следовал своей системе. Иногда были внеплановые сделки, иногда входил не по системе или по системе не входил. Таких внесистемных сделок наверное было около 10-20% от общего числа. Еще экспериментировал с размером стопа, периодический его меняя, пробуя работать с очень маленьким стопом. И еще пробовал переносить сделки через ночь – всегда неудачно.  Но самое обидное, было пару дней, когда я не мог торговать, был занят другими делами, а когда вечером включал терминал – БА!!! Я профукал ударный день, в эту минуту я вспоминал все матерные слова и придумывал новые… &lt;br /&gt;2.	У этой стратегий есть огромный недостаток – она с лекгостью впадает в длинную череду убыточных сделок подряд и с этим надо что-то делать.&lt;br /&gt;&lt;br /&gt;На основании сделанных выводов были приняты следующие решения: &lt;br /&gt;1.	Писать робота! Робот будет соблюдать стратегию и не будет пропускать ударные дни.&lt;br /&gt;2.	А вот что-бы не попадать в длинную череду убыточных сделок, я решил торговать несколькими фьючерсами одновременно, тем более это теперь будет делать робот, его то это не напряжет. Вероятность, что несколько фьючерсов одновременно попадут в череду убыточных сделок значительно меньше. Желательно, конечно, что бы они &amp;#171;ходили&amp;#187; по разному.&lt;br /&gt;Я выбрал несколько фьючерсов и стал их гонять на истории. Получилось неплохо – почти все зарабатывают. Я выбрал для торговли: фьюч на индекс РТС, фьюч на Сбер, фьюч Доллар-рубль и фьюч на Газпром. Газпром показал худшие результаты, но свою копеечку давал и для выравнивания результатов сгодится. Очень хотел взять фьюч Евро-доллар, потому-то &amp;#171;ходит&amp;#187; отлично от других, то так и не смог подобрать к нему ключи, нет стабильного результата, дерганный он. Надо еще отметить, что у каждого фьюча свой характер и некоторые параметры отличаются. Например, у всех фьючей есть ограничение – не более одной сделки в день, а фьючерс на Доллар-рубль в таком ограничении не нуждается.&lt;br /&gt;Осталось написать робота, стратегия простая, поэтому работ был написан на Qpile.&lt;br /&gt;&lt;br /&gt;Попытка номер 2.&lt;br /&gt;&lt;br /&gt;Робот стартовал 12.07.2011. Стартовая сумма 60000 руб. Основное изменение в стратегии, то что теперь все фьючерсы торгуются с переносом позиции через ночь,  кроме Газпрома, он этого не очень любит, опять же диверсификация рисков какая-то…&lt;br /&gt;&lt;br /&gt;Понеслась….&lt;br /&gt;Прошло 10 месяцев… Вам интересен результат? Да пожалуйста, таблица внизу, результат в рублях и в процентах, проценты считались от ГО, а не от депо&lt;br /&gt;&lt;br /&gt;Итог: за 9 месяцев было заработано 111493 руб. или 185% вроде бы и круто, но как же нестабильно… По сути весь результат был сделан в августе и осенью с их жирными ударными днями, в остальное время слив…&lt;br /&gt;&lt;br /&gt;Решение о торговле несколькими инструментами было правильным. Фьюч на Индекс РТС в зимние месяце опять впал в безумную череду убыточных сделок подряд – 41. И если бы не Сбер и Доллар-рубль, был бы глубокий Drawdon. А так хоть в нулях удержались.&lt;br /&gt;Фьюч на Индекс РТС в тестах показывал лучшие результаты, в реалии оказался худшим и единственным, кто дал отрицательный результат за время торговли -14278 руб. Это потребовало отдельного анализа, в январе-феврале цена на фьюч пребывала в замечательном тренде и выросла за два месяца на 35000 пунктов, а мне не удалось взять ни одного трейда, стал анализировать каждый день. И вот что выяснилось – было, как минимиум, три возможности взять цель. Первый раз не хватило 70 пунктов, стоял бы стоп на 70 пунктов дальше цель была бы взята. Второй раз не хватило 5 минут от начало торгов, если бы робот включался в торги не в 11-10, а в 11-15, была бы сделка со взятием цели. И трети случай, и то же 5 минут не хватило- если бы робот торговал до 18-05, а не до 18-00, то тоже была бы сделка со взятием цели. Забавно правда? Рынок всегда знает наши уязвимые места и бьет  туда.&lt;br /&gt;&lt;br /&gt;16.04.2012 торговля была остановлена по причине отрицательного результата за последние 5 месяцев, и абсолютно неадекватного рынка. Ударных дней нет, трендов нет, &amp;#171;хвостатые&amp;#187;дневные свечки. Трендовые стратегий безжалостно &amp;#171;пилятся&amp;#187;.&lt;br /&gt;&lt;br /&gt;Что делать дальше? Честно говоря незнаю. Возможно добавлю в портфель еще пару фьючей, дам роботу немного денег, уменьшу плечо до 50% и пусть он там потихоньку сам с собой колбасится, благо есть пить не просит А сам буду пробовать принципиально новые стратегии.</content>
  </entry>
  <entry>
    <id>https://stocksharp.ru/topic/2652/</id>
    <title type="text">LicenseHelper threw an exception</title>
    <published>2012-04-28T16:32:51Z</published>
    <updated>2012-04-28T16:32:51Z</updated>
    <author>
      <name>FinDirector</name>
      <uri>https://stocksharp.ru/users/473/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <category term="StockSharp" />
    <content type="html">Версия dev-ветка, stocksharp-16607.&lt;br /&gt;Создал с помощью LicenseTool файл stocksharp_license.xml (лежит в папке с роботом), на этом же компьютере запускаю бота.&lt;br /&gt;Ошибка:&lt;br /&gt;&lt;br /&gt;+		ex	{&amp;quot;The type initializer for &amp;#39;StockSharp.Algo.Licensing.LicenseHelper&amp;#39; threw an exception.&amp;quot;}	System.Exception {System.TypeInitializationException}</content>
  </entry>
</feed>