﻿<?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">StopLoss и тестирование на истории</title>
  <id>~/topic/3006/stoploss-i-testirovanie-na-istorii/</id>
  <rights type="text">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  <updated>2026-05-13T16:52:44Z</updated>
  <logo>https://stocksharp.ru/images/logo.png</logo>
  <link href="https://stocksharp.ru/handlers/atom.ashx?category=topic&amp;id=3006" rel="self" type="application/rss+xml" />
  <entry>
    <id>https://stocksharp.ru/posts/m/21421/</id>
    <title type="text"> все остальное как в первом сообщении, логи прикрепил. Интересовали логи именно стратегии, где показ...</title>
    <published>2012-09-18T09:02:46Z</published>
    <updated>2012-09-18T09:02:46Z</updated>
    <author>
      <name>Mikhail Sukhov</name>
      <uri>https://stocksharp.ru/users/201/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Gii &lt;a href="https://stocksharp.ru/posts/m/21372/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;&lt;br /&gt;все остальное как в первом сообщении, логи прикрепил.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Интересовали логи именно стратегии, где показан ход работы защитной стратегии. Плюс выделенный проблемный участок.&lt;br /&gt;&lt;br /&gt;Для ускорения решения проблемы (если, конечно же, она есть, а не обычное непонимание пессимистичного сценарий тестирования) лучше проделать работу по анализу самостоятельно.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/21372/</id>
    <title type="text">Можете проверить, изменилось ли поведение после последнего коммита? Добрый день! Михаил извините, но...</title>
    <published>2012-09-14T15:01:50Z</published>
    <updated>2012-09-14T15:01:50Z</updated>
    <author>
      <name>Gii</name>
      <uri>https://stocksharp.ru/users/5912/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Mikhail Sukhov &lt;a href="https://stocksharp.ru/posts/m/21360/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Gii &lt;a href="https://stocksharp.ru/posts/m/21352/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Mikhail Sukhov &lt;a href="https://stocksharp.ru/posts/m/21345/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;Можете проверить, изменилось ли поведение после последнего коммита?&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Добрый день! &lt;br /&gt;Михаил извините, но я не совсем понял что вы имели в виду под &amp;quot;коммит&amp;quot;, если build 19259 то не помогло. &lt;br /&gt;&lt;br /&gt;С уважением GII&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Тогда разберем ситуацию. Можно привести более короткий диапазон времени (час-полчаса) для теста? И лог за непосредственно неправильный период, должно быть где-то порядка нескольких минут, если у вас стоп не очень большой.&lt;/div&gt;&lt;/div&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;pre class="brush:csharp"&gt;
var timeFrame = TimeSpan.FromMinutes(2);&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;все остальное как в первом сообщении, логи прикрепил.&lt;br /&gt;&lt;br /&gt;Михаил не могли бы вы решить еще одну проблему, при использовании новых сборок начиная 18833 при компилировании кода (индикаторов)&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;
MacdH.Process((DecimalIndicatorValue) candle.ClosePrice);&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;выдается ошибка &lt;br /&gt;&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Цитата:&lt;/span&gt;&lt;div class="innerquote"&gt;Ошибка	1	Тип &amp;quot;StockSharp.Algo.Indicators.DecimalIndicatorValue&amp;quot; существует как в &amp;quot;c:\Users\Gii\Documents\Visual Studio 2010\Projects\Pulse v4.5 (SS 4-1-4 bild 0 NewChart)\WpfApplication1\bin\Debug\StockSharp.Algo.Indicators.dll&amp;quot;, так и в &amp;quot;i:\C#\StockSharp\Дистрибутивы\stocksharp-19263\trunk\References\StockSharp.Algo.dll&amp;quot;	C:\Users\Gii\Documents\Visual Studio 2010\Projects\Pulse v4.5 (SS 4-1-4 bild 0 NewChart)\WpfApplication1\PulseStrategy.cs	217	32	Pulse&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;С уважением GII.&lt;br /&gt;</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/21360/</id>
    <title type="text">Можете проверить, изменилось ли поведение после последнего коммита? Добрый день! Михаил извините, но...</title>
    <published>2012-09-14T10:12:04Z</published>
    <updated>2012-09-14T10:12:04Z</updated>
    <author>
      <name>Mikhail Sukhov</name>
      <uri>https://stocksharp.ru/users/201/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Gii &lt;a href="https://stocksharp.ru/posts/m/21352/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Mikhail Sukhov &lt;a href="https://stocksharp.ru/posts/m/21345/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;Можете проверить, изменилось ли поведение после последнего коммита?&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Добрый день! &lt;br /&gt;Михаил извините, но я не совсем понял что вы имели в виду под &amp;quot;коммит&amp;quot;, если build 19259 то не помогло. &lt;br /&gt;&lt;br /&gt;С уважением GII&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Тогда разберем ситуацию. Можно привести более короткий диапазон времени (час-полчаса) для теста? И лог за непосредственно неправильный период, должно быть где-то порядка нескольких минут, если у вас стоп не очень большой.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/21352/</id>
    <title type="text">Можете проверить, изменилось ли поведение после последнего коммита? Добрый день! Михаил извините, но...</title>
    <published>2012-09-13T22:38:02Z</published>
    <updated>2012-09-13T22:38:02Z</updated>
    <author>
      <name>Gii</name>
      <uri>https://stocksharp.ru/users/5912/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Mikhail Sukhov &lt;a href="https://stocksharp.ru/posts/m/21345/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;Можете проверить, изменилось ли поведение после последнего коммита?&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Добрый день! &lt;br /&gt;Михаил извините, но я не совсем понял что вы имели в виду под &amp;quot;коммит&amp;quot;, если build 19259 то не помогло. &lt;br /&gt;&lt;br /&gt;С уважением GII</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/21345/</id>
    <title type="text">Можете проверить, изменилось ли поведение после последнего коммита?</title>
    <published>2012-09-13T14:05:37Z</published>
    <updated>2012-09-13T14:05:37Z</updated>
    <author>
      <name>Mikhail Sukhov</name>
      <uri>https://stocksharp.ru/users/201/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">Можете проверить, изменилось ли поведение после последнего коммита?</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/21339/</id>
    <title type="text">Посмотрим, спасибо за конкретные исходники на которых можно попытаться воспроизвести</title>
    <published>2012-09-13T10:41:58Z</published>
    <updated>2012-09-13T10:41:58Z</updated>
    <author>
      <name>Alexander</name>
      <uri>https://stocksharp.ru/users/2826/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">Посмотрим, спасибо за конкретные исходники на которых можно попытаться воспроизвести</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/21329/</id>
    <title type="text">Добрый день! Суть проблемы, начиная с версии StockSharp 4.1.3 (далее SS) не работает StopLoss,причем...</title>
    <published>2012-09-12T17:24:42Z</published>
    <updated>2012-09-12T17:32:30Z</updated>
    <author>
      <name>Gii</name>
      <uri>https://stocksharp.ru/users/5912/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">Добрый день!&lt;br /&gt;Суть проблемы, начиная с версии StockSharp 4.1.3 (далее SS) не работает StopLoss,причем только с EmulationTrader. Более корректно - при включенном IsTrailing = true,  StopLoss ведет себя как будто IsTrailing отключен. Конечно это суждение основанное только на результатах теста, что реально происходит мне неизвестно.&lt;br /&gt;1. Для приготовления теста взят &amp;quot;SampleHistoryTesting&amp;quot; &amp;quot;SS 4.1.4&amp;quot; из него удален класс SmaStrategy и вставлен простой класс для тестирования  StopLoss приведенный ниже. &lt;br /&gt;2. Тестирование проводилось на всех SS начиная с версии &amp;quot;SS 4.1.2&amp;quot;  и заканчивая &amp;quot;SS 4.1.4 bild 19213&amp;quot; &lt;br /&gt;3. Тестирование проводилось на одних и тех же данных &amp;quot;SBER@EQBR&amp;quot; 02.05.12 по 10.08.12. Тиковые сделки получены через программу &amp;quot;Hydra (SS 4.1.3)&amp;quot;, а так же &amp;quot;RIU9@RTS&amp;quot;&lt;br /&gt;4. Тестирование проводилось с разными значениями ProtectiveLevel начиная с минимального =Security.MinStepSize.&lt;br /&gt;5. Для исключения влияния характера исходных данных на полученный результат менялась дата начала теста. Картина в целом оставалась такой же, менялось только количество сделок StopLoss стратегии совершенных в начале тестирования.&lt;br /&gt;&lt;br /&gt;Результаты тестирования&lt;br /&gt;1. В версии &amp;quot;SS 4.1.2&amp;quot; получен адекватный результат, ниже приведен фрагмент лога и картинка работы стратегии&lt;br /&gt;2. Начиная с версии &amp;quot;SS 4.1.3&amp;quot; результаты были повторяющимися но не соответствующими ожиданиям в приведенном ниже логе и на картинке видно как StopLoss срабатывает один раз а затем после следующей сделки находясь в активном режиме не реагирует на изменение цены даже при ProtectiveLevel=Security.MinStepSize.&lt;br /&gt;&lt;br /&gt;С уважением GII   &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;

using System;
using System.Collections.Generic;
using System.Linq;
using StockSharp.Algo.Candles;
using StockSharp.Algo.Logging;
using StockSharp.Algo;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;

namespace SampleHistoryTesting
{
    class MyStopLossStrategy : Strategy
    {
        private readonly CandleSeries _series;
        private readonly TimeSpan _timeFrame;
        private Exchange _excheng;
        private Random _random;
        private Order _order=new Order();
        private static readonly object Locker = new object ();

        public MyStopLossStrategy( CandleSeries series, TimeSpan timeFrame )
        {
            _series = series;
            _timeFrame = timeFrame;
        }

        protected override void OnStarted()
        {
            _excheng = Security.Exchange;
            _series
                .WhenCandlesFinished ()
                .Do ( ProcessCandle ).Apply ( this );
            
            // Инициализируем генератор случ величин
            _random = new Random ( 1 );
            base.OnStarted ();
        }

        private void ProcessCandle( Candle candle )
        {

            /* Три условия вхождения в сделку 
             * 1. пришла последняя свечка
             * 2. Protective стратегия больше не активна
             */
            var lastTime = _timeFrame.GetCandleBounds ( Trader.GetMarketTime (_excheng) ).Min - _timeFrame;

            #region InfoLog
            this.AddInfoLog(string.Format(&amp;quot;LastTime / candle.OpenTime // {0} / {1} //&amp;quot;, lastTime, candle.OpenTime));
            this.AddInfoLog(string.Format(&amp;quot;StopLoss (активна -true) = {0}&amp;quot;, IsActiveChildStrat()));
            #endregion

            lock (Locker)
            {
                //var lastTime = Trader.GetMarketTime ( _excheng );
                //var endInterval = candle.CloseTime + TimeSpan.FromSeconds ( 5 );
                if (lastTime &amp;lt;= candle.OpenTime)
                {
                    if (_order.State == OrderStates.Active) CancelActiveOrders ();
                    if (!IsActiveChildStrat ())
                    {
                        _order = null;
                        // Определяем направление сделки
                        var rd = 1 - 2 * _random.NextDouble (); // -1 &amp;lt; rd &amp;lt; 1
                        var direction = OrderDirections.Sell;
                        if (rd &amp;gt;= 0) direction = OrderDirections.Buy;
                        _order = this.CreateOrder ( direction, (decimal)Security.GetCurrentPrice ( direction ), Volume );
                        //Обрабатываем новые сделки только от _order.
                        _order.WhenNewTrades ().Do ( NewMyTrade ).Apply ( this );
                        RegisterOrder ( _order );
                        this.AddOrderInfoLog ( _order, &amp;quot;&amp;quot; );
                    }
                }
            }
        }

        private void NewMyTrade( IEnumerable&amp;lt;MyTrade&amp;gt; trades )
        {
            try
            {
                lock (Locker)
                {
                    var trade = trades.Last ();
                    
                    var sl = new StopLossStrategy ( trade, (int)UnitTypes.Absolute )
                        {
                            IsTrailing = true,
                            ProtectiveLevel =Security.MinStepSize,
                            Security = Security,
                        };
                    
                    // Удоляем следы работы дочерней стратегии
                    sl.WhenStopped ().Do ( strategy =&amp;gt;
                        {
                            ChildStrategies.Remove ( strategy );
                            this.AddInfoLog ( string.Format ( &amp;quot;Кол. StopLoss активных стратегий = {0}&amp;quot;,ChildStrategies.Count));
                        } ).Once ().Apply ( this );
                    ChildStrategies.Add ( sl );

                    this.AddInfoLog ( string.Format ( &amp;quot;ProtectivePrice / ProtectiveDirection= //{0} / {1} &amp;quot;, sl.ActivationPrice.ToString(&amp;quot;F2&amp;quot;), sl.ProtectiveDirection.ToString() ) );
                    this.AddInfoLog ( string.Format ( &amp;quot;StopLoss = {0}&amp;quot;, sl.IsActivated.ToString() ) );
                }
            }
            catch (Exception e)
            {
                this.AddErrorLog ( string.Format ( &amp;quot;&amp;lt;NewMyTrade&amp;gt; Err {0}&amp;quot;, e ) );
            }
        }

        /* Метод проверяет активность одной из нескольких стратегий, 
        * если хотя бы одна активна возвращает true
        */
        public bool IsActiveChildStrat()
        {
            try
            {
                if (ChildStrategies.Count == 0) return false;
                if (ChildStrategies.Count &amp;gt; 0) return true;
                /* 
                if (ChildStrategies.Any ( childStrategy =&amp;gt; childStrategy.ProcessState == ProcessStates.Started || childStrategy.ProcessState == ProcessStates.Stopping ))
                {
                    return true;
                }
                */
            }
            catch (Exception e)
            {
                this.AddErrorLog ( string.Format ( &amp;quot;&amp;lt;IsActiveChildStrat&amp;gt; Err {0}&amp;quot;, e ) );
            }
            return false;
        }

        protected override void OnStopping()
        {
            //останавливаем все доч. стратегии
            foreach (var str in ChildStrategies) { str.Stop (); }
            ChildStrategies.Clear ();
            CancelActiveOrders ();
            base.OnStopping ();
        }

    }
}
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href='httpsfile:///C:/Users/Gii/Desktop/SS%204-1-2.jpg' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="http://file:///C:/Users/Gii/Desktop/SS%204-1-2.jpg" style='max-width: 600px;' alt=""/&gt;&lt;/a&gt;</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
</feed>