Sergey Masyura
|
Дата: 22.02.2012
seashaman Очень хочется эту полезную штуку приладить в альфе. Стратегия при выставлении первой заявки, считает что позиция изменилась(а это не так) и завершается. И мы имеем висящий без контроля лимитник, который может исполниться а может и нет. Получается MarketQuotingStrategy принимает неверное решение, что заявка исполнилась, а она на самом деле стоит активной. Да, котирование не работает. Сейчас отлаживаю версию, где работа с выставлением ордеров происходит через отдельную очередь и обработчики финансовой информации в отдельных тасках. Это намного улучшит ситуацию.
|
|
Спасибо:
|
|
|
|
|
Sergey Masyura
|
Дата: 07.03.2012
Sergey Masyura seashaman Очень хочется эту полезную штуку приладить в альфе. Стратегия при выставлении первой заявки, считает что позиция изменилась(а это не так) и завершается. И мы имеем висящий без контроля лимитник, который может исполниться а может и нет. Получается MarketQuotingStrategy принимает неверное решение, что заявка исполнилась, а она на самом деле стоит активной. Да, котирование не работает. Сейчас отлаживаю версию, где работа с выставлением ордеров происходит через отдельную очередь и обработчики финансовой информации в отдельных тасках. Это намного улучшит ситуацию. Залил изменения - http://stocksharp.codepl...nector%2fAlfaWrapper.cs
Ордера сливаются в один поток и складываются в очередь, получение id стало блокирующим. Обработка рыночных данных (стаканы, лента) тоже идет в отдельных тасках. Сделал пару тестов, котирование в целом работает и особых проблем не замечено. Если будут какие замечания или баги - пишите.
|
|
Спасибо:
|
|
|
|
|
ra81
|
Дата: 07.03.2012
|
|
|
|
Sergey Masyura Sergey Masyura seashaman Очень хочется эту полезную штуку приладить в альфе. Стратегия при выставлении первой заявки, считает что позиция изменилась(а это не так) и завершается. И мы имеем висящий без контроля лимитник, который может исполниться а может и нет. Получается MarketQuotingStrategy принимает неверное решение, что заявка исполнилась, а она на самом деле стоит активной. Да, котирование не работает. Сейчас отлаживаю версию, где работа с выставлением ордеров происходит через отдельную очередь и обработчики финансовой информации в отдельных тасках. Это намного улучшит ситуацию. Залил изменения - http://stocksharp.codepl...nector%2fAlfaWrapper.cs
Ордера сливаются в один поток и складываются в очередь, получение id стало блокирующим. Обработка рыночных данных (стаканы, лента) тоже идет в отдельных тасках. Сделал пару тестов, котирование в целом работает и особых проблем не замечено. Если будут какие замечания или баги - пишите. Ну сразу тем кто будет тестировать скажу что вероятность багов котирования очень высока. Терминал ведет себя не очень адекватно в определенные моменты. У меня подобная схема, в общем работает, но иногда совершенно неадекватно. Пытаюсь вылечить.
|
|
|
|
|
ra81
|
Дата: 23.03.2012
|
|
|
|
Обнаружились дедлоки в стратегии котирования. Происходят достаточно часто в следующих условиях: 1) создаю простую стратегию Она проверяет позицию. // проверим есть ли позиция по бумаге. Код
if (HavePosition())
{
this.AddInfoLog("Есть позиция. Продаем позицию.");
_sellStrategy = new MarketQuotingStrategy(OrderDirections.Sell, this.Volume);
ChildStrategies.Add(_sellStrategy);
}
else
{
this.AddInfoLog("Нет позиции. Покупаем позицию.");
_buyStrategy = new MarketQuotingStrategy(OrderDirections.Buy, this.Volume);
ChildStrategies.Add(_buyStrategy);
}
Если позиция есть,то продаем, если нет то покупаем. В итоге периодически происходят дедлоки. Снял все что мог прикладываю ниже. Дедлоки происходят в стратегиях. Лочатся три потока обрабатывающие Orders, Security, Trades. Нужно учесть что для каждого типа данных есть отдельный поток. Отсюда имеем три потока. Они все заблокированы друг на друге. Waiting of System.object on 10784 - значит что поток ждет Объект которым владеет поток 10784 ProcessOrders - поток Код
Waiting of System.object on 10784
Unflagged > 12820 15 Worker Thread Worker Thread StockSharp.AlfaDirect.AlfaTrader.ProcessOrders Normal
[In a sleep, wait, or join]
mscorlib.dll!System.Threading.Monitor.Enter(object obj, ref bool lockTaken) + 0x14 bytes
StockSharp.Algo.dll!StockSharp.Algo.Strategies.Strategy.#=qTDmEOJAXN6AiB3d8_jMIme9JTN8pm4tbdETsZKmKJfY=(StockSharp.Algo.Strategies.ProcessStates #=qqI37IXj9Mx3EF3T0kEaGkw==) + 0x39e bytes
StockSharp.Algo.dll!StockSharp.Algo.Strategies.Strategy.Stop() + 0x35 bytes
StockSharp.Algo.dll!StockSharp.Algo.Strategies.QuotingStrategy.#=q_OymE1LrO6mBmBiGBXUuVlJvIGxdP0oAR4ZAtaE$cLU=() + 0x169 bytes
StockSharp.Algo.dll!StockSharp.Algo.Strategies.StrategyRule<StockSharp.Algo.Strategies.Strategy>.#=q3UdZn4RtstjLq$DRetpesg5QHEWCq7YlJajlNGOsMZM=.#=qxHTZgXO2qPQ3sKeiMbfnRQ==(StockSharp.Algo.Strategies.Strategy #=qZfFNF0attQuS2e7WWV32Bg==) + 0x28 bytes
StockSharp.Algo.dll!StockSharp.Algo.Strategies.StrategyRule<StockSharp.Algo.Strategies.Strategy>.#=q9fxDA2uk83qN2hqy64gS7aCaYFKjhrUItVaD9IDM_y8=.#=qSPSaiCBjV8Lyz1$s73B95A==(StockSharp.Algo.Strategies.StrategyRule<StockSharp.Algo.Strategies.Strategy> #=qOowYotreh$jcvHRSMC0BaQ==, StockSharp.Algo.Strategies.Strategy #=qDuL5qsA23AXqWrfycetm$A==) + 0x2b bytes
StockSharp.Algo.dll!StockSharp.Algo.Strategies.StrategyRule<StockSharp.Algo.Strategies.Strategy>.#=qpYptxUNnz8Pd9$tZanTx_mVpfZhO6K8desSRLy7foec=.#=qdaxFnV3rghhTtK24tyRtiA==(StockSharp.Algo.Strategies.StrategyRule<StockSharp.Algo.Strategies.Strategy> #=qgeoiPSYPqop2JhTFvM33Yw==, StockSharp.Algo.Strategies.Strategy #=qv0xmKDurs$ExCph5wb_DJw==) + 0x3d bytes
StockSharp.Algo.dll!StockSharp.Algo.Strategies.StrategyRule<StockSharp.Algo.Strategies.Strategy>.#=qcLTDwFm1Bxxu1fGzOFoL8piSpZ$mHRiW4sDpS6J5Gic=<object>.#=qUhNfrEkEciKXRG3fcrQa9Q==(StockSharp.Algo.Strategies.Strategy #=qgg0ZO_iqoxbHxjCUB1T71g==) + 0x3d bytes
StockSharp.Algo.dll!StockSharp.Algo.Strategies.StrategyRule<StockSharp.Algo.Strategies.Strategy>.#=qiybaNQzAjlpLWxYoJQ31L32aKHZTPOV3Lm_Uoo7cyeg=.#=qhhbQppyqHyAG50LKIk6mB4msaofk$1N4XldzdkqWbwg=() + 0x33 bytes
StockSharp.Algo.dll!StockSharp.Algo.Strategies.Strategy.#=qFWoXU$ZKzUe5tDGLM9ZC2w==(StockSharp.Algo.Strategies.IStrategyRule #=qBqI1251CoeTXfqIcCCs04w==, System.Func<bool> #=qflMLATlvQNT8H1cMC0wpuA==) + 0x2ab bytes
StockSharp.Algo.dll!StockSharp.Algo.Strategies.StrategyRule<StockSharp.Algo.Strategies.Strategy>.Activate(StockSharp.Algo.Strategies.Strategy value) + 0x113 bytes
StockSharp.Algo.dll!StockSharp.Algo.Strategies.StrategyRuleHelper.#=qC9ERfLHGtL6mUVGO1lYnf600aQjeSbmVWBcp_VC_cW0=.#=qKoKnTZq06SYggqp9qbsrqUyW8T0s2pzdk0cy18dLX3o=() + 0x33 bytes
Ecng.Common.dll!Ecng.Common.DelegateHelper.SafeInvoke(System.Action handler) + 0x33 bytes
StockSharp.Algo.dll!StockSharp.Algo.Positions.BasePositionManager.Position.set(decimal value) + 0x84 bytes
StockSharp.Algo.dll!StockSharp.Algo.Positions.StrategyPositionManager.ProcessOrder(StockSharp.BusinessEntities.Order order) + 0xf8 bytes
Ecng.Common.dll!Ecng.Common.DelegateHelper.SafeInvoke<StockSharp.BusinessEntities.Order>(System.Action<StockSharp.BusinessEntities.Order> handler, StockSharp.BusinessEntities.Order arg) + 0x39 bytes
StockSharp.Algo.dll!StockSharp.Algo.Strategies.Strategy.OnOrderChanged(StockSharp.BusinessEntities.Order order) + 0x33 bytes
Ecng.Collections.dll!Ecng.Collections.CollectionHelper.ForEach<StockSharp.BusinessEntities.Order>(System.Collections.Generic.IEnumerable<StockSharp.BusinessEntities.Order> source, System.Action<StockSharp.BusinessEntities.Order> action) + 0x131 bytes
StockSharp.Algo.dll!StockSharp.Algo.Strategies.Strategy.OnOrdersChanged(System.Collections.Generic.IEnumerable<StockSharp.BusinessEntities.Order> orders) + 0x55 bytes
StockSharp.Algo.dll!StockSharp.Algo.Strategies.Strategy.#=qN3WOmt7BFWfQbMKxJ_MWES5Sln1pYggX6TqVYWpiHdU=.#=q_WvkDu79g0zEyv34vEq8s9ONCTedQLJa7LuobcBVG0Q=() + 0x29 bytes
StockSharp.Algo.dll!StockSharp.Algo.Strategies.Strategy.#=q3tLr$QxrenSG5YjlASuEIwx7FHHel43i_Orgh7NoFnE=.#=qSELvSN4e0V3$jmc2198VeGqFMtvOPG1FigaqZg66FgY=() + 0x3f bytes
StockSharp.Algo.dll!StockSharp.Algo.Strategies.Strategy.#=qjE0c_IOjLdmbYm5RQrEuRmgM27UiHpimA_neMkRInWA=.#=qOkfXbhnmD3YEV8YBhgidpg==(System.Action #=qudomD_SbkRqgw$9kAIIJlg==) + 0xc7 bytes
StockSharp.Algo.dll!StockSharp.Algo.Strategies.Strategy.#=qoLgZh3$SD209eKw4mVNAJg==(System.Action #=qzsDQtiJCSy9LJmaBo0S$og==) + 0x8c bytes
StockSharp.Algo.dll!StockSharp.Algo.Strategies.Strategy.#=qrJPUmZoPMoOwgUgCqPNrD6FwYrymsvA8v_2q6lunq$0=(System.Collections.Generic.IEnumerable<StockSharp.BusinessEntities.Order> #=qeCDul3fIrwGtECAbrrGHnw==) + 0x102 bytes
Ecng.Common.dll!Ecng.Common.DelegateHelper.SafeInvoke<System.Collections.Generic.IEnumerable<StockSharp.BusinessEntities.Order>>(System.Action<System.Collections.Generic.IEnumerable<StockSharp.BusinessEntities.Order>> handler, System.Collections.Generic.IEnumerable<StockSharp.BusinessEntities.Order> arg) + 0x39 bytes
StockSharp.Algo.dll!StockSharp.Algo.BaseTrader.#=qQEXQqNuhu0B$rj$eiQSNF5IxnrNjb1R2Vq1LVlxU5bs=<StockSharp.BusinessEntities.Order>.#=q8AOrUlOa9v1k3xP4JC$DNQ==(System.Collections.Generic.IEnumerable<StockSharp.BusinessEntities.Order> #=qMJpl$WkQIKDsmTqPJc013g==) + 0x59 bytes
StockSharp.Algo.dll!StockSharp.Algo.BaseTrader.#=qQEXQqNuhu0B$rj$eiQSNF5IxnrNjb1R2Vq1LVlxU5bs=<StockSharp.BusinessEntities.Order>.#=qtxVbih27W95zvoJwCXK4hg==() + 0x98 bytes
StockSharp.Algo.dll!StockSharp.Algo.BaseTrader.#=qfT05YmZI2PygcTHIA8kHR6Z9X3X6WehTYNtqm4MhCQY=.#=qWspl_jCkomQCvE5MfnVIDZhlyYLj01BsxjjTCW6rNVc=(StockSharp.Algo.BaseTrader.#=qfT05YmZI2PygcTHIA8kHR6Z9X3X6WehTYNtqm4MhCQY= #=q1NvfCQIBPXxx8myp7sFTzg==) + 0x20 bytes
mscorlib.dll!System.Collections.Generic.List<StockSharp.Algo.BaseTrader.#=qfT05YmZI2PygcTHIA8kHR6Z9X3X6WehTYNtqm4MhCQY=>.ForEach(System.Action<StockSharp.Algo.BaseTrader.#=qfT05YmZI2PygcTHIA8kHR6Z9X3X6WehTYNtqm4MhCQY=> action) + 0x92 bytes
StockSharp.Algo.dll!StockSharp.Algo.BaseTrader.#=qfT05YmZI2PygcTHIA8kHR6Z9X3X6WehTYNtqm4MhCQY=.#=q$qzLdQu$HzSj$CgIA7l2_A==() + 0xbc bytes
StockSharp.Algo.dll!StockSharp.Algo.BaseTrader.ProcessEvents(System.Action handler) + 0xbb bytes
StockSharp.AlfaDirect.dll!StockSharp.AlfaDirect.AlfaTrader.ProcessOrders(StockSharp.AlfaDirect.Tables.TableData data) Line 737 + 0x2a bytes
StockSharp.AlfaDirect.Tables.dll!StockSharp.AlfaDirect.Tables.Table.ProcessDataPortion(StockSharp.AlfaDirect.Tables.TableDataPortion dataPortion) Line 279 + 0x21 bytes
StockSharp.AlfaDirect.Tables.dll!StockSharp.AlfaDirect.Tables.Table.QueueProcessor() Line 242 + 0x16 bytes
mscorlib.dll!System.Threading.Tasks.Task.InnerInvoke() + 0x27 bytes
mscorlib.dll!System.Threading.Tasks.Task.Execute() + 0x43 bytes
mscorlib.dll!System.Threading.Tasks.Task.ExecutionContextCallback(object obj) + 0x27 bytes
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool ignoreSyncCtx) + 0xb0 bytes
mscorlib.dll!System.Threading.Tasks.Task.ExecuteWithThreadLocal(ref System.Threading.Tasks.Task currentTaskSlot) + 0x154 bytes
mscorlib.dll!System.Threading.Tasks.Task.ExecuteEntry(bool bPreventDoubleExecution) + 0x8b bytes
mscorlib.dll!System.Threading.Tasks.Task.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() + 0x7 bytes
mscorlib.dll!System.Threading.ThreadPoolWorkQueue.Dispatch() + 0x147 bytes
mscorlib.dll!System.Threading._ThreadPoolWaitCallback.PerformWaitCallback() + 0x2d bytes
[Native to Managed Transition]
ProcessSecurities - поток Код
Waiting of System.object on 10784
Unflagged > 11692 20 Worker Thread Worker Thread StockSharp.AlfaDirect.AlfaTrader.ProcessSecurities Normal
[In a sleep, wait, or join]
mscorlib.dll!System.Threading.Monitor.Enter(object obj, ref bool lockTaken) + 0x14 bytes
StockSharp.Algo.dll!StockSharp.Algo.Strategies.Strategy.#=qFWoXU$ZKzUe5tDGLM9ZC2w==(StockSharp.Algo.Strategies.IStrategyRule #=qBqI1251CoeTXfqIcCCs04w==, System.Func<bool> #=qflMLATlvQNT8H1cMC0wpuA==) + 0x278 bytes
StockSharp.Algo.dll!StockSharp.Algo.Strategies.StrategyRule<StockSharp.BusinessEntities.Security>.Activate(StockSharp.BusinessEntities.Security value) + 0x113 bytes
StockSharp.Algo.dll!StockSharp.Algo.Strategies.StrategyRuleHelper.#=qM8ofW3XbLDzfIMKapfbDcgTA0Ik7WyIkJwdcSgTaMpE=.#=qzLlGjciHY5M39imCClebWFsmbuoIpv4TSIvXWp5DVdE=(System.Collections.Generic.IEnumerable<StockSharp.BusinessEntities.Security> #=qNhyXP53eaaxj6iwPmnxdSg==) + 0x1aa bytes
Ecng.Common.dll!Ecng.Common.DelegateHelper.SafeInvoke<System.Collections.Generic.IEnumerable<StockSharp.BusinessEntities.Security>>(System.Action<System.Collections.Generic.IEnumerable<StockSharp.BusinessEntities.Security>> handler, System.Collections.Generic.IEnumerable<StockSharp.BusinessEntities.Security> arg) + 0x39 bytes
StockSharp.Algo.dll!StockSharp.Algo.BaseTrader.#=qQEXQqNuhu0B$rj$eiQSNF5IxnrNjb1R2Vq1LVlxU5bs=<StockSharp.BusinessEntities.Security>.#=q8AOrUlOa9v1k3xP4JC$DNQ==(System.Collections.Generic.IEnumerable<StockSharp.BusinessEntities.Security> #=qMJpl$WkQIKDsmTqPJc013g==) + 0x59 bytes
StockSharp.Algo.dll!StockSharp.Algo.BaseTrader.#=qQEXQqNuhu0B$rj$eiQSNF5IxnrNjb1R2Vq1LVlxU5bs=<StockSharp.BusinessEntities.Security>.#=qtxVbih27W95zvoJwCXK4hg==() + 0x98 bytes
StockSharp.Algo.dll!StockSharp.Algo.BaseTrader.#=qfT05YmZI2PygcTHIA8kHR6Z9X3X6WehTYNtqm4MhCQY=.#=qWspl_jCkomQCvE5MfnVIDZhlyYLj01BsxjjTCW6rNVc=(StockSharp.Algo.BaseTrader.#=qfT05YmZI2PygcTHIA8kHR6Z9X3X6WehTYNtqm4MhCQY= #=q1NvfCQIBPXxx8myp7sFTzg==) + 0x20 bytes
mscorlib.dll!System.Collections.Generic.List<StockSharp.Algo.BaseTrader.#=qfT05YmZI2PygcTHIA8kHR6Z9X3X6WehTYNtqm4MhCQY=>.ForEach(System.Action<StockSharp.Algo.BaseTrader.#=qfT05YmZI2PygcTHIA8kHR6Z9X3X6WehTYNtqm4MhCQY=> action) + 0x92 bytes
StockSharp.Algo.dll!StockSharp.Algo.BaseTrader.#=qfT05YmZI2PygcTHIA8kHR6Z9X3X6WehTYNtqm4MhCQY=.#=q$qzLdQu$HzSj$CgIA7l2_A==() + 0xbc bytes
StockSharp.Algo.dll!StockSharp.Algo.BaseTrader.ProcessEvents(System.Action handler) + 0xbb bytes
StockSharp.AlfaDirect.dll!StockSharp.AlfaDirect.AlfaTrader.ProcessSecurities(StockSharp.AlfaDirect.Tables.TableData data) Line 562 + 0x2a bytes
StockSharp.AlfaDirect.Tables.dll!StockSharp.AlfaDirect.Tables.Table.ProcessDataPortion(StockSharp.AlfaDirect.Tables.TableDataPortion dataPortion) Line 279 + 0x21 bytes
StockSharp.AlfaDirect.Tables.dll!StockSharp.AlfaDirect.Tables.Table.QueueProcessor() Line 242 + 0x16 bytes
mscorlib.dll!System.Threading.Tasks.Task.InnerInvoke() + 0x27 bytes
mscorlib.dll!System.Threading.Tasks.Task.Execute() + 0x43 bytes
mscorlib.dll!System.Threading.Tasks.Task.ExecutionContextCallback(object obj) + 0x27 bytes
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool ignoreSyncCtx) + 0xb0 bytes
mscorlib.dll!System.Threading.Tasks.Task.ExecuteWithThreadLocal(ref System.Threading.Tasks.Task currentTaskSlot) + 0x154 bytes
mscorlib.dll!System.Threading.Tasks.Task.ExecuteEntry(bool bPreventDoubleExecution) + 0x8b bytes
mscorlib.dll!System.Threading.Tasks.Task.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() + 0x7 bytes
mscorlib.dll!System.Threading.ThreadPoolWorkQueue.Dispatch() + 0x147 bytes
mscorlib.dll!System.Threading._ThreadPoolWaitCallback.PerformWaitCallback() + 0x2d bytes
[Native to Managed Transition]
ProcessTrades - поток Код
Waiting of System.object on 12820
Unflagged 10784 17 Worker Thread Worker Thread StockSharp.AlfaDirect.AlfaTrader.ProcessTrades Normal
[In a sleep, wait, or join]
mscorlib.dll!System.Threading.Monitor.Enter(object obj, ref bool lockTaken) + 0x14 bytes
StockSharp.Algo.dll!StockSharp.Algo.Strategies.QuotingStrategy.ProcessQuoting() + 0x50 bytes
StockSharp.Algo.dll!StockSharp.Algo.Strategies.StrategyRule<object>.#=q3UdZn4RtstjLq$DRetpesg5QHEWCq7YlJajlNGOsMZM=.#=qxHTZgXO2qPQ3sKeiMbfnRQ==(object #=qZfFNF0attQuS2e7WWV32Bg==) + 0x28 bytes
StockSharp.Algo.dll!StockSharp.Algo.Strategies.StrategyRule<object>.#=q9fxDA2uk83qN2hqy64gS7aCaYFKjhrUItVaD9IDM_y8=.#=qSPSaiCBjV8Lyz1$s73B95A==(StockSharp.Algo.Strategies.StrategyRule<object> #=qOowYotreh$jcvHRSMC0BaQ==, object #=qDuL5qsA23AXqWrfycetm$A==) + 0x2b bytes
StockSharp.Algo.dll!StockSharp.Algo.Strategies.StrategyRule<object>.#=qpYptxUNnz8Pd9$tZanTx_mVpfZhO6K8desSRLy7foec=.#=qdaxFnV3rghhTtK24tyRtiA==(StockSharp.Algo.Strategies.StrategyRule<object> #=qgeoiPSYPqop2JhTFvM33Yw==, object #=qv0xmKDurs$ExCph5wb_DJw==) + 0x3d bytes
StockSharp.Algo.dll!StockSharp.Algo.Strategies.StrategyRule<object>.#=qcLTDwFm1Bxxu1fGzOFoL8piSpZ$mHRiW4sDpS6J5Gic=<object>.#=qUhNfrEkEciKXRG3fcrQa9Q==(object #=qgg0ZO_iqoxbHxjCUB1T71g==) + 0x3d bytes
StockSharp.Algo.dll!StockSharp.Algo.Strategies.StrategyRule<object>.#=qiybaNQzAjlpLWxYoJQ31L32aKHZTPOV3Lm_Uoo7cyeg=.#=qhhbQppyqHyAG50LKIk6mB4msaofk$1N4XldzdkqWbwg=() + 0x33 bytes
StockSharp.Algo.dll!StockSharp.Algo.Strategies.Strategy.#=qFWoXU$ZKzUe5tDGLM9ZC2w==(StockSharp.Algo.Strategies.IStrategyRule #=qBqI1251CoeTXfqIcCCs04w==, System.Func<bool> #=qflMLATlvQNT8H1cMC0wpuA==) + 0x2ab bytes
StockSharp.Algo.dll!StockSharp.Algo.Strategies.StrategyRule<object>.Activate(object value) + 0x113 bytes
StockSharp.Algo.dll!StockSharp.Algo.Strategies.StrategyRule<object>.Activate() + 0x2c bytes
StockSharp.Algo.dll!StockSharp.Algo.Strategies.StrategyRule<StockSharp.BusinessEntities.Security>.#=q3UdZn4RtstjLq$DRetpesg5QHEWCq7YlJajlNGOsMZM=.#=qxHTZgXO2qPQ3sKeiMbfnRQ==(StockSharp.BusinessEntities.Security #=qZfFNF0attQuS2e7WWV32Bg==) + 0x28 bytes
StockSharp.Algo.dll!StockSharp.Algo.Strategies.StrategyRule<StockSharp.BusinessEntities.Security>.#=q9fxDA2uk83qN2hqy64gS7aCaYFKjhrUItVaD9IDM_y8=.#=qSPSaiCBjV8Lyz1$s73B95A==(StockSharp.Algo.Strategies.StrategyRule<StockSharp.BusinessEntities.Security> #=qOowYotreh$jcvHRSMC0BaQ==, StockSharp.BusinessEntities.Security #=qDuL5qsA23AXqWrfycetm$A==) + 0x2b bytes
StockSharp.Algo.dll!StockSharp.Algo.Strategies.StrategyRule<StockSharp.BusinessEntities.Security>.#=qpYptxUNnz8Pd9$tZanTx_mVpfZhO6K8desSRLy7foec=.#=qdaxFnV3rghhTtK24tyRtiA==(StockSharp.Algo.Strategies.StrategyRule<StockSharp.BusinessEntities.Security> #=qgeoiPSYPqop2JhTFvM33Yw==, StockSharp.BusinessEntities.Security #=qv0xmKDurs$ExCph5wb_DJw==) + 0x3d bytes
StockSharp.Algo.dll!StockSharp.Algo.Strategies.StrategyRule<StockSharp.BusinessEntities.Security>.#=qcLTDwFm1Bxxu1fGzOFoL8piSpZ$mHRiW4sDpS6J5Gic=<object>.#=qUhNfrEkEciKXRG3fcrQa9Q==(StockSharp.BusinessEntities.Security #=qgg0ZO_iqoxbHxjCUB1T71g==) + 0x3d bytes
StockSharp.Algo.dll!StockSharp.Algo.Strategies.StrategyRule<StockSharp.BusinessEntities.Security>.#=qiybaNQzAjlpLWxYoJQ31L32aKHZTPOV3Lm_Uoo7cyeg=.#=qhhbQppyqHyAG50LKIk6mB4msaofk$1N4XldzdkqWbwg=() + 0x33 bytes
StockSharp.Algo.dll!StockSharp.Algo.Strategies.Strategy.#=qFWoXU$ZKzUe5tDGLM9ZC2w==(StockSharp.Algo.Strategies.IStrategyRule #=qBqI1251CoeTXfqIcCCs04w==, System.Func<bool> #=qflMLATlvQNT8H1cMC0wpuA==) + 0x2ab bytes
StockSharp.Algo.dll!StockSharp.Algo.Strategies.StrategyRule<StockSharp.BusinessEntities.Security>.Activate(StockSharp.BusinessEntities.Security value) + 0x113 bytes
StockSharp.Algo.dll!StockSharp.Algo.Strategies.StrategyRuleHelper.#=qM8ofW3XbLDzfIMKapfbDcgTA0Ik7WyIkJwdcSgTaMpE=.#=qzLlGjciHY5M39imCClebWFsmbuoIpv4TSIvXWp5DVdE=(System.Collections.Generic.IEnumerable<StockSharp.BusinessEntities.Security> #=qNhyXP53eaaxj6iwPmnxdSg==) + 0x1aa bytes
Ecng.Common.dll!Ecng.Common.DelegateHelper.SafeInvoke<System.Collections.Generic.IEnumerable<StockSharp.BusinessEntities.Security>>(System.Action<System.Collections.Generic.IEnumerable<StockSharp.BusinessEntities.Security>> handler, System.Collections.Generic.IEnumerable<StockSharp.BusinessEntities.Security> arg) + 0x39 bytes
StockSharp.Algo.dll!StockSharp.Algo.BaseTrader.#=qQEXQqNuhu0B$rj$eiQSNF5IxnrNjb1R2Vq1LVlxU5bs=<StockSharp.BusinessEntities.Security>.#=q8AOrUlOa9v1k3xP4JC$DNQ==(System.Collections.Generic.IEnumerable<StockSharp.BusinessEntities.Security> #=qMJpl$WkQIKDsmTqPJc013g==) + 0x59 bytes
StockSharp.Algo.dll!StockSharp.Algo.BaseTrader.#=qQEXQqNuhu0B$rj$eiQSNF5IxnrNjb1R2Vq1LVlxU5bs=<StockSharp.BusinessEntities.Security>.#=qtxVbih27W95zvoJwCXK4hg==() + 0x98 bytes
StockSharp.Algo.dll!StockSharp.Algo.BaseTrader.#=qfT05YmZI2PygcTHIA8kHR6Z9X3X6WehTYNtqm4MhCQY=.#=qWspl_jCkomQCvE5MfnVIDZhlyYLj01BsxjjTCW6rNVc=(StockSharp.Algo.BaseTrader.#=qfT05YmZI2PygcTHIA8kHR6Z9X3X6WehTYNtqm4MhCQY= #=q1NvfCQIBPXxx8myp7sFTzg==) + 0x20 bytes
mscorlib.dll!System.Collections.Generic.List<StockSharp.Algo.BaseTrader.#=qfT05YmZI2PygcTHIA8kHR6Z9X3X6WehTYNtqm4MhCQY=>.ForEach(System.Action<StockSharp.Algo.BaseTrader.#=qfT05YmZI2PygcTHIA8kHR6Z9X3X6WehTYNtqm4MhCQY=> action) + 0x92 bytes
StockSharp.Algo.dll!StockSharp.Algo.BaseTrader.#=qfT05YmZI2PygcTHIA8kHR6Z9X3X6WehTYNtqm4MhCQY=.#=q$qzLdQu$HzSj$CgIA7l2_A==() + 0xbc bytes
StockSharp.Algo.dll!StockSharp.Algo.BaseTrader.ProcessEvents(System.Action handler) + 0xbb bytes
StockSharp.AlfaDirect.dll!StockSharp.AlfaDirect.AlfaTrader.ProcessTrades(StockSharp.AlfaDirect.Tables.TableData data) Line 1044 + 0x29 bytes
StockSharp.AlfaDirect.Tables.dll!StockSharp.AlfaDirect.Tables.Table.ProcessDataPortion(StockSharp.AlfaDirect.Tables.TableDataPortion dataPortion) Line 279 + 0x21 bytes
StockSharp.AlfaDirect.Tables.dll!StockSharp.AlfaDirect.Tables.Table.QueueProcessor() Line 242 + 0x16 bytes
mscorlib.dll!System.Threading.Tasks.Task.InnerInvoke() + 0x27 bytes
mscorlib.dll!System.Threading.Tasks.Task.Execute() + 0x43 bytes
mscorlib.dll!System.Threading.Tasks.Task.ExecutionContextCallback(object obj) + 0x27 bytes
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool ignoreSyncCtx) + 0xb0 bytes
mscorlib.dll!System.Threading.Tasks.Task.ExecuteWithThreadLocal(ref System.Threading.Tasks.Task currentTaskSlot) + 0x154 bytes
mscorlib.dll!System.Threading.Tasks.Task.ExecuteEntry(bool bPreventDoubleExecution) + 0x8b bytes
mscorlib.dll!System.Threading.Tasks.Task.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() + 0x7 bytes
mscorlib.dll!System.Threading.ThreadPoolWorkQueue.Dispatch() + 0x147 bytes
mscorlib.dll!System.Threading._ThreadPoolWaitCallback.PerformWaitCallback() + 0x2d bytes
[Native to Managed Transition
Логи котирования Код
MQS | 23.03.2012 11:29:59.313 | | Стратегия запущена.
MQS | 23.03.2012 11:29:59.313 | | Котирование на Buy объема 10.
MQS | 23.03.2012 11:29:59.313 | | Цена текущей NULL и лучшей 96,4.
MQS | 23.03.2012 11:29:59.313 | | Лучший бид 96,4 и лучший аск 96,44.
MQS | 23.03.2012 11:29:59.313 | | Регистрация новой заявки на Buy с ценой 96,4 и объемом 10.
MQS | 23.03.2012 11:29:59.313 | | Заявка 3845653905 на Buy отправлена с ценой 96,4 объемом 10.
MQS | 23.03.2012 11:29:59.313 | Внимание | Заявка 3845653905 в процессе регистрации.
MQS | 23.03.2012 11:30:00.313 | Внимание | Заявка 3845653905 в процессе регистрации.
MQS | 23.03.2012 11:30:00.313 | Внимание | Заявка 3845653905 в процессе регистрации.
MQS | 23.03.2012 11:30:00.313 | Внимание | Заявка 3845653905 в процессе регистрации.
MQS | 23.03.2012 11:30:00.313 | Внимание | Заявка 3845653905 в процессе регистрации.
MQS | 23.03.2012 11:30:00.313 | Внимание | Заявка 3845653905 в процессе регистрации.
MQS | 23.03.2012 11:30:00.313 | Внимание | Заявка 3845653905 в процессе регистрации.
MQS | 23.03.2012 11:30:00.313 | Внимание | Заявка 3845653905 в процессе регистрации.
MQS | 23.03.2012 11:30:00.313 | Внимание | Заявка 3845653905 в процессе регистрации.
MQS | 23.03.2012 11:30:01.313 | Внимание | Заявка 3845653905 в процессе регистрации.
MQS | 23.03.2012 11:30:01.313 | Внимание | Заявка 3845653905 в процессе регистрации.
MQS | 23.03.2012 11:30:01.313 | Внимание | Заявка 3845653905 в процессе регистрации.
MQS | 23.03.2012 11:30:01.313 | Внимание | Заявка 3845653905 в процессе регистрации.
MQS | 23.03.2012 11:30:01.313 | Внимание | Заявка 3845653905 в процессе регистрации.
MQS | 23.03.2012 11:30:01.313 | Внимание | Заявка 3845653905 в процессе регистрации.
MQS | 23.03.2012 11:30:01.313 | Внимание | Заявка 3845653905 в процессе регистрации.
MQS | 23.03.2012 11:30:01.313 | Внимание | Заявка 3845653905 в процессе регистрации.
MQS | 23.03.2012 11:30:02.313 | Внимание | Заявка 3845653905 в процессе регистрации.
MQS | 23.03.2012 11:30:02.313 | Внимание | Заявка 3845653905 в процессе регистрации.
MQS | 23.03.2012 11:30:02.313 | | Заявка 3845653905 принята биржей.
MQS | 23.03.2012 11:30:02.313 | | Цена текущей 96,4 и лучшей 96,39.
MQS | 23.03.2012 11:30:02.313 | | Лучший бид 96,39 и лучший аск 96,43.
MQS | 23.03.2012 11:30:02.313 | | Котирование заявки 3845653905 на Buy с ценой 96,4 объемом 10.
MQS | 23.03.2012 11:30:02.313 | | Отмена заявки 3845653905.
MQS | 23.03.2012 11:30:02.313 | | Новая позиция 10.
MQS | 23.03.2012 11:30:02.313 | | Позиция изменилась на 10. Оставшийся объем 0.
MQS | 23.03.2012 11:30:02.313 | | Заканчиваем котирование.
MQS | 23.03.2012 11:30:02.313 | | Отмена заявки 3845653905.
MQS | 23.03.2012 11:30:02.313 | | Стратегия останавливается.
MQS | 23.03.2012 11:30:05.313 | | Новая Buy сделка 134729285 по цене 96,4 на 10 заявки 3845653905.
Логи базовой стратегии Код
SS | 23.03.2012 11:29:37.360 | | Стратегия запущена.
SS | 23.03.2012 11:29:59.313 | | Свеча завершена, начинаем проверку условий.
SS | 23.03.2012 11:29:59.313 | | Нет позиции. Покупаем позицию.
SS | 23.03.2012 11:30:02.313 | | Новая позиция 10.
SS | 23.03.2012 11:30:05.313 | | Новая Buy сделка 134729285 по цене 96,4 на 10 заявки 3845653905.
|
|
Спасибо:
|
|
|
|
|
ra81
|
Дата: 26.03.2012
|
|
Спасибо:
|
|
|
|
|
Mikhail Sukhov
|
Дата: 26.03.2012
Плаза и Квик сейчас в нескольких потоках транслируют данные.
|
|
Спасибо:
|
|
|
|
|
Mikhail Sukhov
|
Дата: 26.03.2012
Mikhail Sukhov Плаза и Квик сейчас в нескольких потоках транслируют данные. Еще раз посмотрел спойлеры. Все потоки заканчиваются на методах Monitor.Enter. Это значит, что поток виновник в спойлерах отсутствует. Должен быть еще один, который как раз вошел через Monitor и которого ждут другие. Можете попробовать со старой версией еще раз? Я скажу тогда точнее, где ошибка. И судя по последней записи "Новая Buy сделка 134729285 по цене 96,4 на 10 заявки 3845653905." - все встало в RegisterOrder. Так как там были локи, то, я думаю, уже почти понятно, что виновник шлюз.
|
|
Спасибо:
|
|
|
|
|
ra81
|
Дата: 27.03.2012
|
|
|
|
Mikhail Sukhov Еще раз посмотрел спойлеры. Все потоки заканчиваются на методах Monitor.Enter. Это значит, что поток виновник в спойлерах отсутствует. Должен быть еще один, который как раз вошел через Monitor и которого ждут другие. Можете попробовать со старой версией еще раз? Я скажу тогда точнее, где ошибка.
И судя по последней записи "Новая Buy сделка 134729285 по цене 96,4 на 10 заявки 3845653905." - все встало в RegisterOrder. Так как там были локи, то, я думаю, уже почти понятно, что виновник шлюз.
Я не буду отрицать что виновник в конце концов шлюз. Просто потому что например событие SecurityChanged может прийти одновременно с разных потоков при предыдущей схеме приема данных. С потока обрабатывающего трейды и потока обрабатывающего Security. И похоже когда все это смешивается в одну кучу, данные по бумаге, ордер и остановка стратегии, происходит дедлок. Он только когда стратегия останавливается. В общем и целом я не настаиваю на том что бы кто-то ковырялся в моем коде, но если у вас все же появилось сомнение в абсолютной правильности кода S#, то я могу передать Сергею код который вызывал дедлоки. Сказать как их получить. Ну а дальше уже думаю найдете без проблем. При текущей однопоточной схеме передачи данных от терминала, работать стало все заметно адекватнее чем раньше. Отсюда следует: либо я не совсем так реализовал многопоточность в данных (по незнанию скорее чем по злому умыслу:), ибо библиотека весьма сложная и данных мало), либо таки есть проблема (ну а вы просто используете стандартный подход, который сию проблему обходит).
|
|
Спасибо:
|
|
|
|
|
Mikhail Sukhov
|
Дата: 27.03.2012
ra81 Я не буду отрицать что виновник в конце концов шлюз. Просто потому что например событие SecurityChanged может прийти одновременно с разных потоков при предыдущей схеме приема данных. С потока обрабатывающего трейды и потока обрабатывающего Security. И похоже когда все это смешивается в одну кучу, данные по бумаге, ордер и остановка стратегии, происходит дедлок. Он только когда стратегия останавливается.
Это не привело к дедлоку. Привелок лог на транзакциях. События с данными отработали нормально и ждали другой поток, когда он закончил. А он завис. Это видно по логу, так как до и после вызова метода RegisterOrder в лог пишутся соответствующие строчки. Была написана только строчка до. После уже нет. Значит все подвисло в RegisterOrder. А у вас там лок. Вот и вся причина.
|
|
Спасибо:
|
|
|
|
|
ra81
|
Дата: 27.03.2012
|
|
|
|
Mikhail Sukhov ra81 Я не буду отрицать что виновник в конце концов шлюз. Просто потому что например событие SecurityChanged может прийти одновременно с разных потоков при предыдущей схеме приема данных. С потока обрабатывающего трейды и потока обрабатывающего Security. И похоже когда все это смешивается в одну кучу, данные по бумаге, ордер и остановка стратегии, происходит дедлок. Он только когда стратегия останавливается.
Это не привело к дедлоку. Привелок лог на транзакциях. События с данными отработали нормально и ждали другой поток, когда он закончил. А он завис. Это видно по логу, так как до и после вызова метода RegisterOrder в лог пишутся соответствующие строчки. Была написана только строчка до. После уже нет. Значит все подвисло в RegisterOrder. А у вас там лок. Вот и вся причина. Мне конечно тяжело левелом в данном случае меряться, но просмотрел все трейсы, проглядел все потоки и где они встали. Ну нет локов у меня. Или я их не вижу. Сделал мегатрейс со всех потоков. Прилагаю его тупо файлом, а так же лог котирования.
|
|
|
|