﻿<?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">Баг в EmulationTrader</title>
  <id>~/topic/3425/bag-v-emulationtrader/</id>
  <rights type="text">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  <updated>2026-06-17T05:49:20Z</updated>
  <logo>https://stocksharp.com/images/logo.png</logo>
  <link href="https://stocksharp.com/handlers/atom.ashx?category=topic&amp;id=3425" rel="self" type="application/rss+xml" />
  <entry>
    <id>https://stocksharp.com/posts/m/24229/</id>
    <title type="text">Накатил 4.1.8 проблема пропала. Спасибо. </title>
    <published>2013-02-26T05:19:09Z</published>
    <updated>2013-02-26T05:19:09Z</updated>
    <author>
      <name>AASorokovoy</name>
      <uri>https://stocksharp.com/users/6304/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;p&gt;Накатил 4.1.8 проблема пропала.
Спасибо.&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/24226/</id>
    <title type="text">AASorokovoy: При использовании EmulationTrader наблюдаются следующие проблемы (наблюдал на версия 4....</title>
    <published>2013-02-25T17:55:47Z</published>
    <updated>2013-02-25T17:55:47Z</updated>
    <author>
      <name>Mikhail Sukhov</name>
      <uri>https://stocksharp.com/users/201/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(24212)" rel="nofollow" target="_blank"&gt;AASorokovoy&lt;/a&gt;:&lt;/strong&gt;
При использовании EmulationTrader наблюдаются следующие проблемы (наблюдал на версия 4.1.7, но судя по сорцам проявиться и в 4.1.8)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Посмотрите релиз 4.1.8 Там есть такая проблема?&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/24212/</id>
    <title type="text">При использовании EmulationTrader наблюдаются следующие проблемы (наблюдал на версия 4.1.7, но судя ...</title>
    <published>2013-02-25T09:57:58Z</published>
    <updated>2013-02-25T09:57:58Z</updated>
    <author>
      <name>AASorokovoy</name>
      <uri>https://stocksharp.com/users/6304/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;p&gt;При использовании EmulationTrader наблюдаются следующие проблемы (наблюдал на версия 4.1.7, но судя по сорцам проявиться и в 4.1.8)&lt;/p&gt;
&lt;p&gt;Заявка отправляется в эмулятор.
Получает статус Active и после этого зависает (Не вызывает никаких событий, не исполняется и не отменяется).
При изучении логов наталкиваемся на сообщение
&amp;quot;Невозможно зарегистрировать заявку {0}: нет ни стаканов ни последней цены.&amp;quot; Что выводит нас на код в MarketEmulator&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
	if (depth == null)
				{
					// без стакана маркетные(они всегда новые) и новые лимитные-в-рынок матчатся по посл. сделке
					var last = si.LastTrade;

					if (last != null &amp;amp;&amp;amp; last.Price != 0)
					{
						EvaluateByLast(order, last);
						//if (EvaluateByLast(order, last))
						//	return true;
					}
					else
					{	
						// если нет никаких цен, то фэйл
						ProcessError(order,action, new InvalidOperationException(&amp;quot;Невозможно зарегистрировать заявку {0}: нет ни стаканов ни последней цены.&amp;quot;.Put(order.TransactionId)));
						si.Remove(newNode);
					}
				}

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;внутри функции: private void EvaluateNew(Order order, OrderTraceActions action) ( MarketEmulator.cs:1568 )&lt;/p&gt;
&lt;p&gt;Здесь мы видим, что при наступлении некоторого условия, пытаемся сделать статус заявки Fail.&lt;/p&gt;
&lt;p&gt;Далее смотрим кто вызывает эту функцию. Вызывается она в одном единственном месте. Там написано, что то типа:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
					if (state.State != OrderStates.Active)
						throw new InvalidOperationException(&amp;quot;State!=Active&amp;quot;);
					EvaluateNew(state, action);

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Что наталкивает нас на мысль, что при выполнении верхнего участка кода статус заявки ВСЕГДА будет Active. Что при выполнении ветки&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
                    else
                    {   
                        // если нет никаких цен, то фэйл
                        ProcessError(order,action, new InvalidOperationException(&amp;quot;Невозможно зарегистрировать заявку {0}: нет ни стаканов ни последней цены.&amp;quot;.Put(order.TransactionId)));
                        si.Remove(newNode);
                    }

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Приведет к тому, что мы попытаемся Active заявку перевести в состояние Fail что противоречит логике работы объекта Order (и что выливается в ошибки при ее обработке объектом Strategy и т.п.)&lt;/p&gt;
&lt;p&gt;Предлагаю правку:
Код MarketEmulator&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
private void EvaluateNew(Order order, OrderTraceActions action)
		{
			var si = GetSecurityAuction(order.Security);
			
			var newNode = si.PutInQueue(order);	// запоминаем тк надо сделки потом сводить по этим заявкам

			try
			{
				var depth = si.GetDepth(si);

				if (EvaluateConditional(depth, order))
					return/* true*/;

				if (EvaluateByDepth(order, depth, true))
					return/* true*/;

				if (depth == null)
				{
					// без стакана маркетные(они всегда новые) и новые лимитные-в-рынок матчатся по посл. сделке
					var last = si.LastTrade;

					if (last != null &amp;amp;&amp;amp; last.Price != 0)
					{
						EvaluateByLast(order, last);
						//if (EvaluateByLast(order, last))
						//	return true;
					}
					else
					{	
						// если нет никаких цен, то фэйл
						ProcessError(order,action, new InvalidOperationException(&amp;quot;Невозможно зарегистрировать заявку {0}: нет ни стаканов ни последней цены.&amp;quot;.Put(order.TransactionId)));
						si.Remove(newNode);
					}
				}
			}
			catch (Exception e)
			{
				ProcessDataError(e);
			}

			//return false;
		}

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;заменить на&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
private void EvaluateNew(Order order, OrderTraceActions action)
		{
			var si = GetSecurityAuction(order.Security);
			
			var newNode = si.PutInQueue(order);	// запоминаем тк надо сделки потом сводить по этим заявкам

			try
			{
				var depth = si.GetDepth(si);

				if (EvaluateConditional(depth, order))
					return/* true*/;

				if (EvaluateByDepth(order, depth, true))
					return/* true*/;

				if (depth == null)
				{
					// без стакана маркетные(они всегда новые) и новые лимитные-в-рынок матчатся по посл. сделке
					var last = si.LastTrade;
					if (last != null &amp;amp;&amp;amp; last.Price != 0)
						EvaluateByLast(order, last);
                           }

			}
			catch (Exception e)
			{
				ProcessDataError(e);
			}

			//return false;
		}

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Что дает стабильную работу, по крайней мере на моих тестах.&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
</feed>