﻿<?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">Ошибка System.NullReferenceException при остановке стратегии по событию EmulationTrader.StateChanged</title>
  <id>~/topic/2735/oshibka-system_nullreferenceexception-pri-ostanovke-strategii-po-sobytiyu-emulationtrader_statechanged/</id>
  <rights type="text">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  <updated>2026-04-08T22:13:53Z</updated>
  <logo>https://stocksharp.com/images/logo.png</logo>
  <link href="https://stocksharp.com/handlers/atom.ashx?category=topic&amp;id=2735" rel="self" type="application/rss+xml" />
  <entry>
    <id>https://stocksharp.com/posts/m/19348/</id>
    <title type="text">Возьмите свежую версию с codeplex, из сорсов, dev\References. Взял stocksharp-17261.zip, пока все но...</title>
    <published>2012-05-25T20:39:56Z</published>
    <updated>2012-05-25T20:54:29Z</updated>
    <author>
      <name>paveld</name>
      <uri>https://stocksharp.com/users/6010/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Alexander Mukhanchikov &lt;a href="https://stocksharp.com/posts/m/19326/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;Возьмите свежую версию с codeplex, из сорсов, dev\References.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Взял stocksharp-17261.zip, пока все нормально</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/19326/</id>
    <title type="text">Возьмите свежую версию с codeplex, из сорсов, dev\References.</title>
    <published>2012-05-25T08:46:46Z</published>
    <updated>2012-05-25T08:46:46Z</updated>
    <author>
      <name>Alexander</name>
      <uri>https://stocksharp.com/users/2826/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Возьмите свежую версию с codeplex, из сорсов, dev\References.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/19311/</id>
    <title type="text">В приведенном ниже коде после вызова в строке 69 метода _strategy.Stop() (вызывается по событию emul...</title>
    <published>2012-05-24T21:18:05Z</published>
    <updated>2012-05-24T21:24:41Z</updated>
    <author>
      <name>paveld</name>
      <uri>https://stocksharp.com/users/6010/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">В приведенном ниже коде после вызова в строке 69 метода _strategy.Stop() (вызывается по событию emulationTrader.StateChanged и emulationTrader.State == EmulationStates.Stopped) возникает исключение:&lt;br /&gt;&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Quote:&lt;/span&gt;&lt;div class="innerquote"&gt;&lt;br /&gt;System.NullReferenceException: &amp;quot;Ссылка на объект не указывает на экземпляр объекта.&amp;quot;&lt;br /&gt;   в StockSharp.Algo.Strategies.StrategyRule`1.#=qF$yf77tmtH$TvNML53EvZg==()&lt;br /&gt;   в StockSharp.Algo.Strategies.StrategyRule`1.#=qVglstR9JVctzN17DnJAaPfHj9iNnwhfXbPC1$b$3qw3SLh7n4Hpmv5nShgBwlzYEcwNHS_D3gh9j5MHWQBLReA==()&lt;br /&gt;   в StockSharp.Algo.Strategies.Strategy.TryRemoveRule(IStrategyRule rule)&lt;br /&gt;   в StockSharp.Algo.Strategies.Strategy.#=qX6B$QsicmbQ_icD7jMLo1roy1zPAXEXpc6ha7KohGhE=(ProcessStates #=qfQBdUVWCnfk7Bnhkdda8Ow==)&lt;br /&gt;   в StockSharp.Algo.Strategies.Strategy.Stop()&lt;br /&gt;   в TradeStrategy.MainWindow.StopTestingStartegy() в C:\Trade\TradeStrategy\TradeStrategy\MainWindow.xaml.cs:строка 344&lt;br /&gt;   в TradeStrategy.MainWindow.&amp;lt;StartTestingStartegy&amp;gt;b__1c() в C:\Trade\TradeStrategy\TradeStrategy\MainWindow.xaml.cs:строка 319&lt;br /&gt;   в System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)&lt;br /&gt;   в MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)&lt;br /&gt;   в System.Windows.Threading.Dispatcher.WrappedInvoke(Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)&lt;br /&gt;   в System.Windows.Threading.DispatcherOperation.InvokeImpl()&lt;br /&gt;   в System.Threading.ExecutionContext.runTryCode(Object userData)&lt;br /&gt;   в System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)&lt;br /&gt;   в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)&lt;br /&gt;   в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)&lt;br /&gt;   в System.Windows.Threading.DispatcherOperation.Invoke()&lt;br /&gt;   в System.Windows.Threading.Dispatcher.ProcessQueue()&lt;br /&gt;   в System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean&amp;amp; handled)&lt;br /&gt;   в MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean&amp;amp; handled)&lt;br /&gt;   в MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)&lt;br /&gt;   в System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)&lt;br /&gt;   в MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)&lt;br /&gt;   в System.Windows.Threading.Dispatcher.WrappedInvoke(Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)&lt;br /&gt;   в System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)&lt;br /&gt;   в MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)&lt;br /&gt;   в MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG&amp;amp; msg)&lt;br /&gt;   в System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)&lt;br /&gt;   в System.Windows.Application.RunInternal(Window window)&lt;br /&gt;   в System.Windows.Application.Run()&lt;br /&gt;   в TradeStrategy.App.Main() в C:\Trade\TradeStrategy\TradeStrategy\obj\x86\Debug\App.g.cs:строка 0&lt;br /&gt;   в System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)&lt;br /&gt;   в Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()&lt;br /&gt;   в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)&lt;br /&gt;   в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)&lt;br /&gt;   в System.Threading.ThreadHelper.ThreadStart()&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;

    public void StartTestingStartegy() {
      var security = new Security {
        Id = &amp;quot;RIM2@RTS&amp;quot;, // по идентификатору инструмента будет искаться папка с историческими маркет данными
        Code = &amp;quot;RIM2&amp;quot;,
        Name = &amp;quot;RTS-6.12&amp;quot;,
        MinStepSize = 5,
        MinStepPrice = 2,
        Exchange = Exchange.Test,
      };

      var portfolio = new Portfolio { Name = &amp;quot;test account&amp;quot;, BeginAmount = 30000m };

      var storageRegistry = new StorageRegistry(new InMemoryStorage()) {
        BasePath = &amp;quot;C:\\Trade\\Hydra\\&amp;quot;
      };

      // Устанавливаем значение таймфрейма
      var timeFrame = TimeSpan.FromSeconds(int.Parse(editTimeFrame.Text));

      emulationTrader = new EmulationTrader(new[] { security }, new[] { portfolio }) {
        MarketTimeChangedInterval = timeFrame,
        StorageRegistry = storageRegistry,
        WorkingTime = Exchange.Rts.WorkingTime,
        UseMarketDepth = false,
      };

      emulationTrader.DepthGenerators[security] = new TrendMarketDepthGenerator(security) {
        // стакан для инструмента в истории обновляется 1 раз в секунду
        Interval = TimeSpan.FromMilliseconds(1000),
        MaxSpreadStepCount = 2        
      };
      
      _candleManager = new CandleManager(emulationTrader);
      var candleSeries = new CandleSeries(typeof(TimeFrameCandle), security, timeFrame);
      _candleManager.Start(candleSeries);

      _strategy = new TresureStrategy(candleSeries, timeFrame) {
        Trader = emulationTrader,
        Portfolio = portfolio,
        // Задаем интсрумент по которому должна работать стратегия
        Security = security,
      };

      _logManager.Sources.Add(_strategy);
      _logManager.Sources.Add(emulationTrader);

      emulationTrader.StateChanged += () =&amp;gt; {
        if (emulationTrader.State == EmulationStates.Stopped) {
          this.GuiAsync(() =&amp;gt; {
            LoggingHelper.AddInfoLog(emulationTrader, &amp;quot;Testing is completed&amp;quot;);
            StopTestingStartegy();            
          });
        } else if (emulationTrader.State == EmulationStates.Started) {
          // запускаем стратегию когда эмулятор запустился
          _strategy.Start();
          _isTestStrategyStarted = true;
          btnTest.Content = &amp;quot;Stop strategy&amp;quot;;
        }
      };
      emulationTrader.Connect();
      emulationTrader.StartExport();
,
      var startTime = new DateTime(2012, 4, 20);
      var stopTime = new DateTime(2012, 4, 21);
      emulationTrader.Start(startTime, stopTime);
    }
 
    public void StopTestingStartegy() {
      _strategy.Stop();      
      _isTestStrategyStarted = true;
      btnTest.Content = &amp;quot;Start strategy&amp;quot;;
    }
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;До возникновения исключения переопределенная часть метода стратегии OnStopping() выполняется успешно, но OnStopped() не успевает вызыватся.&lt;br /&gt;После возникновения ошибки, если нажать в отладчике F5 (продолжить), успешно отрабатывает и метод OnStopped() стратегии</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
</feed>