Стратегия котирования MarketQuotingStrategy в AlfaTrader

Стратегия котирования MarketQuotingStrategy в AlfaTrader
Atom
2/22/2012
seashaman


Очень хочется эту полезную штуку приладить в альфе. Стратегия при выставлении первой заявки, считает что позиция изменилась(а это не так) и завершается. И мы имеем висящий без контроля лимитник, который может исполниться а может и нет. Получается MarketQuotingStrategy принимает неверное решение, что заявка исполнилась, а она на самом деле стоит активной.


Tags:


Thanks: Sergey Masyura


1 2  >
Sergey Masyura

Avatar
Date: 2/22/2012
Reply


seashaman: Очень хочется эту полезную штуку приладить в альфе. Стратегия при выставлении первой заявки, считает что позиция изменилась(а это не так) и завершается. И мы имеем висящий без контроля лимитник, который может исполниться а может и нет. Получается MarketQuotingStrategy принимает неверное решение, что заявка исполнилась, а она на самом деле стоит активной.

Да, котирование не работает. Сейчас отлаживаю версию, где работа с выставлением ордеров происходит через отдельную очередь и обработчики финансовой информации в отдельных тасках. Это намного улучшит ситуацию.

Thanks:

Sergey Masyura

Avatar
Date: 3/7/2012
Reply


Sergey Masyura:

seashaman: Очень хочется эту полезную штуку приладить в альфе. Стратегия при выставлении первой заявки, считает что позиция изменилась(а это не так) и завершается. И мы имеем висящий без контроля лимитник, который может исполниться а может и нет. Получается MarketQuotingStrategy принимает неверное решение, что заявка исполнилась, а она на самом деле стоит активной.

Да, котирование не работает. Сейчас отлаживаю версию, где работа с выставлением ордеров происходит через отдельную очередь и обработчики финансовой информации в отдельных тасках. Это намного улучшит ситуацию.

Залил изменения - http://stocksharp.codeplex.com/SourceControl/changeset/changes/15395#trunk%2fConnectors%2fAlfa%2fConnector%2fAlfaWrapper.cs Ордера сливаются в один поток и складываются в очередь, получение id стало блокирующим. Обработка рыночных данных (стаканы, лента) тоже идет в отдельных тасках. Сделал пару тестов, котирование в целом работает и особых проблем не замечено. Если будут какие замечания или баги - пишите.

Thanks:

ra81

Avatar
Date: 3/7/2012
Reply


Sergey Masyura:

Sergey Masyura:

seashaman: Очень хочется эту полезную штуку приладить в альфе. Стратегия при выставлении первой заявки, считает что позиция изменилась(а это не так) и завершается. И мы имеем висящий без контроля лимитник, который может исполниться а может и нет. Получается MarketQuotingStrategy принимает неверное решение, что заявка исполнилась, а она на самом деле стоит активной.

Да, котирование не работает. Сейчас отлаживаю версию, где работа с выставлением ордеров происходит через отдельную очередь и обработчики финансовой информации в отдельных тасках. Это намного улучшит ситуацию.

Залил изменения - http://stocksharp.codeplex.com/SourceControl/changeset/changes/15395#trunk%2fConnectors%2fAlfa%2fConnector%2fAlfaWrapper.cs Ордера сливаются в один поток и складываются в очередь, получение id стало блокирующим. Обработка рыночных данных (стаканы, лента) тоже идет в отдельных тасках. Сделал пару тестов, котирование в целом работает и особых проблем не замечено. Если будут какие замечания или баги - пишите.

Ну сразу тем кто будет тестировать скажу что вероятность багов котирования очень высока. Терминал ведет себя не очень адекватно в определенные моменты. У меня подобная схема, в общем работает, но иногда совершенно неадекватно. Пытаюсь вылечить.

Thanks: Sergey Masyura

ra81

Avatar
Date: 3/23/2012
Reply


Обнаружились дедлоки в стратегии котирования. Происходят достаточно часто в следующих условиях:

  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.


Thanks:

ra81

Avatar
Date: 3/26/2012
Reply


Поскольку разбираться с дедлоками никто не захотел, переделал коннектор. Проблема решилась.

http://stocksharp.com/posts/m/17697/

Thanks:

Mikhail Sukhov

Avatar
Date: 3/26/2012
Reply


ra81: Поскольку разбираться с дедлоками никто не захотел, переделал коннектор. Проблема решилась.

http://stocksharp.com/posts/m/17697/

Плаза и Квик сейчас в нескольких потоках транслируют данные.

Thanks:

Mikhail Sukhov

Avatar
Date: 3/26/2012
Reply


Mikhail Sukhov:

ra81: Поскольку разбираться с дедлоками никто не захотел, переделал коннектор. Проблема решилась.

http://stocksharp.com/posts/m/17697/

Плаза и Квик сейчас в нескольких потоках транслируют данные.

Еще раз посмотрел спойлеры. Все потоки заканчиваются на методах Monitor.Enter. Это значит, что поток виновник в спойлерах отсутствует. Должен быть еще один, который как раз вошел через Monitor и которого ждут другие. Можете попробовать со старой версией еще раз? Я скажу тогда точнее, где ошибка.

И судя по последней записи "Новая Buy сделка 134729285 по цене 96,4 на 10 заявки 3845653905." - все встало в RegisterOrder. Так как там были локи, то, я думаю, уже почти понятно, что виновник шлюз.

Thanks:

ra81

Avatar
Date: 3/27/2012
Reply


Mikhail Sukhov: Еще раз посмотрел спойлеры. Все потоки заканчиваются на методах Monitor.Enter. Это значит, что поток виновник в спойлерах отсутствует. Должен быть еще один, который как раз вошел через Monitor и которого ждут другие. Можете попробовать со старой версией еще раз? Я скажу тогда точнее, где ошибка.

И судя по последней записи "Новая Buy сделка 134729285 по цене 96,4 на 10 заявки 3845653905." - все встало в RegisterOrder. Так как там были локи, то, я думаю, уже почти понятно, что виновник шлюз.

Я не буду отрицать что виновник в конце концов шлюз. Просто потому что например событие SecurityChanged может прийти одновременно с разных потоков при предыдущей схеме приема данных. С потока обрабатывающего трейды и потока обрабатывающего Security. И похоже когда все это смешивается в одну кучу, данные по бумаге, ордер и остановка стратегии, происходит дедлок. Он только когда стратегия останавливается.

В общем и целом я не настаиваю на том что бы кто-то ковырялся в моем коде, но если у вас все же появилось сомнение в абсолютной правильности кода S#, то я могу передать Сергею код который вызывал дедлоки. Сказать как их получить. Ну а дальше уже думаю найдете без проблем.

При текущей однопоточной схеме передачи данных от терминала, работать стало все заметно адекватнее чем раньше. Отсюда следует: либо я не совсем так реализовал многопоточность в данных (по незнанию скорее чем по злому умыслу:), ибо библиотека весьма сложная и данных мало), либо таки есть проблема (ну а вы просто используете стандартный подход, который сию проблему обходит).

Thanks:

Mikhail Sukhov

Avatar
Date: 3/27/2012
Reply


ra81: Я не буду отрицать что виновник в конце концов шлюз. Просто потому что например событие SecurityChanged может прийти одновременно с разных потоков при предыдущей схеме приема данных. С потока обрабатывающего трейды и потока обрабатывающего Security. И похоже когда все это смешивается в одну кучу, данные по бумаге, ордер и остановка стратегии, происходит дедлок. Он только когда стратегия останавливается.

Это не привело к дедлоку. Привелок лог на транзакциях. События с данными отработали нормально и ждали другой поток, когда он закончил. А он завис. Это видно по логу, так как до и после вызова метода RegisterOrder в лог пишутся соответствующие строчки. Была написана только строчка до. После уже нет. Значит все подвисло в RegisterOrder. А у вас там лок. Вот и вся причина.

Thanks:

ra81

Avatar
Date: 3/27/2012
Reply


Mikhail Sukhov:

ra81: Я не буду отрицать что виновник в конце концов шлюз. Просто потому что например событие SecurityChanged может прийти одновременно с разных потоков при предыдущей схеме приема данных. С потока обрабатывающего трейды и потока обрабатывающего Security. И похоже когда все это смешивается в одну кучу, данные по бумаге, ордер и остановка стратегии, происходит дедлок. Он только когда стратегия останавливается.

Это не привело к дедлоку. Привелок лог на транзакциях. События с данными отработали нормально и ждали другой поток, когда он закончил. А он завис. Это видно по логу, так как до и после вызова метода RegisterOrder в лог пишутся соответствующие строчки. Была написана только строчка до. После уже нет. Значит все подвисло в RegisterOrder. А у вас там лок. Вот и вся причина. Мне конечно тяжело левелом в данном случае меряться, но просмотрел все трейсы, проглядел все потоки и где они встали. Ну нет локов у меня. Или я их не вижу. Сделал мегатрейс со всех потоков. Прилагаю его тупо файлом, а так же лог котирования.

bugs2.txt 45 KB (463)
Thanks: Mikhail Sukhov
1 2  >

Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy