Баг в EmulationTrader~/topic/3425/bag-v-emulationtrader/Copyright @ StockSharp Platform LLC 2010 - 20242024-03-29T14:46:57Zhttps://stocksharp.com/images/logo.pnghttps://stocksharp.com/posts/m/24229/Накатил 4.1.8 проблема пропала. Спасибо. 2013-02-26T05:19:09Z2013-02-26T05:19:09ZAASorokovoyhttps://stocksharp.com/users/6304/info@stocksharp.comНакатил 4.1.8 проблема пропала.<br />Спасибо. Copyright @ StockSharp Platform LLC 2010 - 2024https://stocksharp.com/posts/m/24226/При использовании EmulationTrader наблюдаются следующие проблемы (наблюдал на версия 4.1.7, но судя ...2013-02-25T17:55:47Z2013-02-25T17:55:47ZMikhail Sukhovhttps://stocksharp.com/users/201/info@stocksharp.com<div class="quote"><span class="quotetitle">AASorokovoy <a href="https://stocksharp.com/posts/m/24212/"><img src="https://stocksharp.com/images/icon_latest_reply.gif" title="Go to" alt="Go to" /></a></span><div class="innerquote">При использовании EmulationTrader наблюдаются следующие проблемы (наблюдал на версия 4.1.7, но судя по сорцам проявиться и в 4.1.8) <br /></div></div><br /><br />Посмотрите релиз 4.1.8 Там есть такая проблема?Copyright @ StockSharp Platform LLC 2010 - 2024https://stocksharp.com/posts/m/24212/При использовании EmulationTrader наблюдаются следующие проблемы (наблюдал на версия 4.1.7, но судя ...2013-02-25T09:57:58Z2013-02-25T09:57:58ZAASorokovoyhttps://stocksharp.com/users/6304/info@stocksharp.comПри использовании EmulationTrader наблюдаются следующие проблемы (наблюдал на версия 4.1.7, но судя по сорцам проявиться и в 4.1.8) <br /><br />Заявка отправляется в эмулятор.<br />Получает статус Active и после этого зависает (Не вызывает никаких событий, не исполняется и не отменяется). <br />При изучении логов наталкиваемся на сообщение <br />"Невозможно зарегистрировать заявку {0}: нет ни стаканов ни последней цены." Что выводит нас на код в MarketEmulator<br /><br /><div class="code"><strong>Code</strong><div class="innercode"><pre class="brush:csharp">
if (depth == null)
{
// без стакана маркетные(они всегда новые) и новые лимитные-в-рынок матчатся по посл. сделке
var last = si.LastTrade;
if (last != null && last.Price != 0)
{
EvaluateByLast(order, last);
//if (EvaluateByLast(order, last))
// return true;
}
else
{
// если нет никаких цен, то фэйл
ProcessError(order,action, new InvalidOperationException("Невозможно зарегистрировать заявку {0}: нет ни стаканов ни последней цены.".Put(order.TransactionId)));
si.Remove(newNode);
}
}
</pre>
</div></div><br /><br />внутри функции: private void EvaluateNew(Order order, OrderTraceActions action) ( MarketEmulator.cs:1568 )<br /><br />Здесь мы видим, что при наступлении некоторого условия, пытаемся сделать статус заявки Fail.<br /><br />Далее смотрим кто вызывает эту функцию. Вызывается она в одном единственном месте. Там написано, что то типа:<br /><div class="code"><strong>Code</strong><div class="innercode"><pre class="brush:csharp">
if (state.State != OrderStates.Active)
throw new InvalidOperationException("State!=Active");
EvaluateNew(state, action);
</pre>
</div></div><br /><br />Что наталкивает нас на мысль, что при выполнении верхнего участка кода статус заявки ВСЕГДА будет Active. Что при выполнении ветки <br /><br /><div class="code"><strong>Code</strong><div class="innercode"><pre class="brush:csharp">
else
{
// если нет никаких цен, то фэйл
ProcessError(order,action, new InvalidOperationException("Невозможно зарегистрировать заявку {0}: нет ни стаканов ни последней цены.".Put(order.TransactionId)));
si.Remove(newNode);
}
</pre>
</div></div><br /><br />Приведет к тому, что мы попытаемся Active заявку перевести в состояние Fail что противоречит логике работы объекта Order (и что выливается в ошибки при ее обработке объектом Strategy и т.п.)<br /><br />Предлагаю правку: <br />Код MarketEmulator <br /><br /><div class="code"><strong>Code</strong><div class="innercode"><pre class="brush:csharp">
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 && last.Price != 0)
{
EvaluateByLast(order, last);
//if (EvaluateByLast(order, last))
// return true;
}
else
{
// если нет никаких цен, то фэйл
ProcessError(order,action, new InvalidOperationException("Невозможно зарегистрировать заявку {0}: нет ни стаканов ни последней цены.".Put(order.TransactionId)));
si.Remove(newNode);
}
}
}
catch (Exception e)
{
ProcessDataError(e);
}
//return false;
}
</pre>
</div></div><br /><br />заменить на <br /><br /><div class="code"><strong>Code</strong><div class="innercode"><pre class="brush:csharp">
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 && last.Price != 0)
EvaluateByLast(order, last);
}
}
catch (Exception e)
{
ProcessDataError(e);
}
//return false;
}
</pre>
</div></div><br /><br />Что дает стабильную работу, по крайней мере на моих тестах. Copyright @ StockSharp Platform LLC 2010 - 2024