﻿<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type='text/css' href='https://stocksharp.ru/css/style.css'?>
<?xml-stylesheet type='text/css' href='https://stocksharp.ru/css/bbeditor.css'?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title type="html">Нужна помощь (очередь событий)</title>
  <id>~/topic/4120/nuzhna-pomoshsh-(ochered-sobytii)/</id>
  <rights type="text">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  <updated>2026-06-21T06:43:01Z</updated>
  <logo>https://stocksharp.ru/images/logo.png</logo>
  <link href="https://stocksharp.ru/handlers/atom.ashx?category=topic&amp;id=4120" rel="self" type="application/rss+xml" />
  <entry>
    <id>https://stocksharp.ru/posts/m/28187/</id>
    <title type="text">Bond: Попробовал. Не помогло. Тот же фарш из потоков. Прям генератор случайных чисел получился))) По...</title>
    <published>2013-11-13T16:50:35Z</published>
    <updated>2013-11-13T16:50:35Z</updated>
    <author>
      <name>IvanB</name>
      <uri>https://stocksharp.ru/users/26984/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(28171)" rel="nofollow" target="_blank"&gt;Bond&lt;/a&gt;:&lt;/strong&gt;
Попробовал. Не помогло. Тот же фарш из потоков. Прям генератор случайных чисел получился)))
Поменял код. Решил оставить только одну подписку на события. И забираю коллекцию trader.MyTrades. Потом буду ее потрошить.&lt;/p&gt;
&lt;div class="spoiler"&gt;&lt;/div&gt;&lt;/blockquote&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
//Событие изменения стратегии
                            trader.StateChanged += (oldState, newState) =&amp;gt;
                            {
                                if (trader.State == EmulationStates.Started)
                                {
                                    //Запускаем стратегию когда эмулятор запустился
                                    strategy.Start();
                                }

                                //Если стратегия остановлена
                                if (trader.State == EmulationStates.Stopped)
                                {
                                    double count = 0;

                                    arrayMyTrades[strategy.LongSma.Length, strategy.ShortSma.Length] = trader.MyTrades;

                                    foreach (var myTrade in arrayMyTrades[strategy.LongSma.Length, strategy.ShortSma.Length])
                                    {
                                        count = count + 1;
                                    }

                                    Console.WriteLine(&amp;quot;Стратегия #{3} ({1}, {2}). Время: {0} \nКоличество сделок: {4}.&amp;quot;, DateTime.Now - afterDateTime, strategy.LongSma.Length, strategy.ShortSma.Length, CountAllReadyStrategy, count);
                                    
                                    afterDateTime = DateTime.Now;

                                    CountReadyStrategy = CountReadyStrategy + 1;
                                    CountAllReadyStrategy = CountAllReadyStrategy + 1;

                                    trader.Stop();
                                    trader.Dispose();
                                    trader = null;
                                    strategy.Stop();
                                    strategy.Dispose();
                                    strategy = null;
                                    candleManager.Dispose();
                                    candleManager = null;

                                    if (CountAllReadyStrategy == countVariation + 1) Console.WriteLine(&amp;quot;Тестирование закончено за {0}!&amp;quot;, (DateTime.Now - startEmulationTime).ToString().Remove(11));
                                }
                            };

&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;blockquote&gt;
&lt;p&gt;Попробовал с этой подпиской. Вообще вылетает.&lt;/p&gt;
&lt;div class="spoiler"&gt;&lt;/div&gt;&lt;/blockquote&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
trader.StateChanged += (oldState, newState) =&amp;gt;
                            {
                                System.Threading.ThreadPool.QueueUserWorkItem((s =&amp;gt;
                                {
                                    PnLCalc((EmulationTrader)s, strategy, arrayMyTrades, CountReadyStrategy, CountAllReadyStrategy, countVariation);
                                }), trader);
                            };

&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;div class="spoiler"&gt;&lt;/div&gt;&lt;/blockquote&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
private static void PnLCalc(EmulationTrader trader, SmaStrategy strategy, IEnumerable&amp;lt;MyTrade&amp;gt;[,] arrayMyTrades, int CountReadyStrategy, int CountAllReadyStrategy, int countVariation)
        {
            double count = 0;

            arrayMyTrades[strategy.LongSma.Length, strategy.ShortSma.Length] = trader.MyTrades;

            foreach (var myTrade in arrayMyTrades[strategy.LongSma.Length, strategy.ShortSma.Length])
            {
                count = count + 1;
            }

            Console.WriteLine(&amp;quot;Стратегия # ({1}, {2}). Время: {0} \nКоличество сделок: {3}.&amp;quot;, DateTime.Now /*- afterDateTime*/, strategy.LongSma.Length, strategy.ShortSma.Length/*, CountAllReadyStrategy*/, count);

            //afterDateTime = DateTime.Now;

            CountReadyStrategy = CountReadyStrategy + 1;
            CountAllReadyStrategy = CountAllReadyStrategy + 1;

            trader.Stop();
            trader.Dispose();
            trader = null;
            strategy.Stop();
            strategy.Dispose();
            strategy = null;
            //candleManager.Dispose();
            //candleManager = null;

            if (CountAllReadyStrategy == countVariation + 1) Console.WriteLine(&amp;quot;Тестирование закончено за {0}!&amp;quot;, (DateTime.Now /*- startEmulationTime*/).ToString().Remove(11));

        }

&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;blockquote&gt;
&lt;p&gt;С событиями заметил, что может только дойти до фигурной скобки и даже не зайти в блок операторов и сразу смениться на новое пришедшее событие.
Даже не знаю, как подойти. Может реализовать очередь событий из того примера в интернете, который я указал в первом сообщении ветки?
Тот вариант что я рекомендовал, он должен работать, он работает в многопоточном режиме, т.е. не гарантируется, что порядок обработки вызываемых обработчиков будет соответствовать порядку вызовов. Вот Вы и думаете что получается ерунда. Если хотите работать с многопоточностью, то соответственно, может понадобиться и переделывать логику, которая была реализована как линейная.
П.С. Вылетает ошибка, что IEnumerable&amp;lt;MyTrade&amp;gt; нельзя сериализовать.
&amp;quot;Тип &amp;quot;Ecng.ComponentModel.NotifiableObject&amp;quot; в сборке &amp;quot;Ecng.ComponentModel, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null&amp;quot; не помечен как сериализуемый.&amp;quot;
Конвертировать в другую коллекцию? Или можно проще решить?
То, что Вы передаете в PnLCalc, я рекомендую объединить в один экземпляр, некоторого класса (нужно создать класс) и этот экземпляр передавать в пул:
System.Threading.ThreadPool.QueueUserWorkItem((s =&amp;gt;
), &amp;lt;экземпляр класса с параметрами, объектами&amp;gt;)
и этот экземпляр Вы можете использовать внутри пула, т.е. он передается в тело в виде аргумента:
System.Threading.ThreadPool.QueueUserWorkItem((s =&amp;gt;
{
&amp;lt;используем s, предварительно явно преобразовав его к типу вашего класса&amp;gt;
}), &amp;lt;экземпляр класса с параметрами, объектами&amp;gt;)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/div&gt;</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/28171/</id>
    <title type="text">Попробовал. Не помогло. Тот же фарш из потоков. Прям генератор случайных чисел получился))) Поменял ...</title>
    <published>2013-11-12T19:50:40Z</published>
    <updated>2013-11-13T16:36:34Z</updated>
    <author>
      <name>Bond</name>
      <uri>https://stocksharp.ru/users/26882/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&lt;p&gt;Попробовал. Не помогло. Тот же фарш из потоков. Прям генератор случайных чисел получился)))
Поменял код. Решил оставить только одну подписку на события. И забираю коллекцию trader.MyTrades. Потом буду ее потрошить.&lt;/p&gt;
&lt;div class="spoiler"&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
//Событие изменения стратегии
                            trader.StateChanged += (oldState, newState) =&amp;gt;
                            {
                                if (trader.State == EmulationStates.Started)
                                {
                                    //Запускаем стратегию когда эмулятор запустился
                                    strategy.Start();
                                }

                                //Если стратегия остановлена
                                if (trader.State == EmulationStates.Stopped)
                                {
                                    double count = 0;

                                    arrayMyTrades[strategy.LongSma.Length, strategy.ShortSma.Length] = trader.MyTrades;

                                    foreach (var myTrade in arrayMyTrades[strategy.LongSma.Length, strategy.ShortSma.Length])
                                    {
                                        count = count + 1;
                                    }

                                    Console.WriteLine(&amp;quot;Стратегия #{3} ({1}, {2}). Время: {0} \nКоличество сделок: {4}.&amp;quot;, DateTime.Now - afterDateTime, strategy.LongSma.Length, strategy.ShortSma.Length, CountAllReadyStrategy, count);
                                    
                                    afterDateTime = DateTime.Now;

                                    CountReadyStrategy = CountReadyStrategy + 1;
                                    CountAllReadyStrategy = CountAllReadyStrategy + 1;

                                    trader.Stop();
                                    trader.Dispose();
                                    trader = null;
                                    strategy.Stop();
                                    strategy.Dispose();
                                    strategy = null;
                                    candleManager.Dispose();
                                    candleManager = null;

                                    if (CountAllReadyStrategy == countVariation + 1) Console.WriteLine(&amp;quot;Тестирование закончено за {0}!&amp;quot;, (DateTime.Now - startEmulationTime).ToString().Remove(11));
                                }
                            };

&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Попробовал с этой подпиской. Вообще вылетает.&lt;/p&gt;
&lt;div class="spoiler"&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
trader.StateChanged += (oldState, newState) =&amp;gt;
                            {
                                System.Threading.ThreadPool.QueueUserWorkItem((s =&amp;gt;
                                {
                                    PnLCalc((EmulationTrader)s, strategy, arrayMyTrades, CountReadyStrategy, CountAllReadyStrategy, countVariation);
                                }), trader);
                            };

&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;div class="spoiler"&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
private static void PnLCalc(EmulationTrader trader, SmaStrategy strategy, IEnumerable&amp;lt;MyTrade&amp;gt;[,] arrayMyTrades, int CountReadyStrategy, int CountAllReadyStrategy, int countVariation)
        {
            double count = 0;

            arrayMyTrades[strategy.LongSma.Length, strategy.ShortSma.Length] = trader.MyTrades;

            foreach (var myTrade in arrayMyTrades[strategy.LongSma.Length, strategy.ShortSma.Length])
            {
                count = count + 1;
            }

            Console.WriteLine(&amp;quot;Стратегия # ({1}, {2}). Время: {0} \nКоличество сделок: {3}.&amp;quot;, DateTime.Now /*- afterDateTime*/, strategy.LongSma.Length, strategy.ShortSma.Length/*, CountAllReadyStrategy*/, count);

            //afterDateTime = DateTime.Now;

            CountReadyStrategy = CountReadyStrategy + 1;
            CountAllReadyStrategy = CountAllReadyStrategy + 1;

            trader.Stop();
            trader.Dispose();
            trader = null;
            strategy.Stop();
            strategy.Dispose();
            strategy = null;
            //candleManager.Dispose();
            //candleManager = null;

            if (CountAllReadyStrategy == countVariation + 1) Console.WriteLine(&amp;quot;Тестирование закончено за {0}!&amp;quot;, (DateTime.Now /*- startEmulationTime*/).ToString().Remove(11));

        }

&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;С событиями заметил, что может только дойти до фигурной скобки и даже не зайти в блок операторов и сразу смениться на новое пришедшее событие.
Даже не знаю, как подойти. Может реализовать очередь событий из того примера в интернете, который я указал в первом сообщении ветки?&lt;/p&gt;
&lt;p&gt;П.С. Вылетает ошибка, что IEnumerable&amp;lt;MyTrade&amp;gt; нельзя сериализовать.
&amp;quot;Тип &amp;quot;Ecng.ComponentModel.NotifiableObject&amp;quot; в сборке &amp;quot;Ecng.ComponentModel, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null&amp;quot; не помечен как сериализуемый.&amp;quot;
Конвертировать в другую коллекцию? Или можно проще решить?&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/28162/</id>
    <title type="text"> while (countVariation != CountAllReadyStrategy - 1) { while (CountAtOnceTrader != CountReadyStrateg...</title>
    <published>2013-11-12T11:03:22Z</published>
    <updated>2013-11-12T12:06:03Z</updated>
    <author>
      <name>Bond</name>
      <uri>https://stocksharp.ru/users/26882/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&lt;div class="spoiler"&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
while (countVariation != CountAllReadyStrategy - 1)
            {
                while (CountAtOnceTrader != CountReadyStrategy - 1)
                {
                    //Перебираем параметры стратегий в циклах
                    for (int i = end_i; i &amp;lt; lenghtArrayFirstParametr; i++)
                    {
                        if (CountAddTrader == CountAtOnceTrader) break;                       

                        for (int j = end_j; j &amp;lt; lenghtArraySecondParametr; j++)
                        {
                            //Создаем шлюз для эмуляции
                            var trader = new EmulationTrader(new[] {security}, new[] {portfolio}, storageRegistry)
                                {
                                    StorageRegistry = storageRegistry,
                                    UseCandlesTimeFrame = timeFrame,
                                };

                            //Соединяемся с трейдером и запускаем экспорт, чтобы инициализировать переданными инструментами и портфелями необходимые свойства EmulationTrader
                            trader.Connect();
                            trader.StartExport();

                            //Создаем менеджера свечек
                            var candleManager = new CandleManager(trader);
                            candleManager.Start(series);

                            //Создаем торговую стратегию
                            var strategy = new SmaStrategy(series, new SimpleMovingAverage {Length = arrayFirstParametr[i]}, new SimpleMovingAverage {Length = arraySecondParametr[j]})
                                {
                                    Volume = 1,
                                    Security = security,
                                    Portfolio = portfolio,
                                    Trader = trader,
                                };

                            //Событие изменения стратегии
                            trader.StateChanged += (oldState, newState) =&amp;gt;
                            {
                                if (trader.State == EmulationStates.Started)
                                {
                                    //Запускаем стратегию когда эмулятор запустился
                                    strategy.Start();
                                }

                                //Если стратегия остановлена
                                if (trader.State == EmulationStates.Stopped)
                                {
                                    //Console.WriteLine(&amp;quot;Стратегия #{3} ({1}, {2}) Time: {0}.&amp;quot;, DateTime.Now - afterDateTime, strategy.LongSma.Length, strategy.ShortSma.Length, CountAllReadyStrategy);

                                    Console.WriteLine(&amp;quot;Стратегия #{3} ({1}, {2}) Time: {0}.&amp;quot;, DateTime.Now - afterDateTime, strategy.LongSma.Length, strategy.ShortSma.Length, CountAllReadyStrategy);
                                    Console.WriteLine(&amp;quot;Max знач. прибыли: {0}; Росла {1}% времени&amp;quot;, arrayMaxPnL[strategy.LongSma.Length, strategy.ShortSma.Length], arrayPnLUpPer[strategy.LongSma.Length, strategy.ShortSma.Length]);
                                    Console.WriteLine(&amp;quot;Min знач. прибыли: {0}; Падала {1}% времени&amp;quot;, arrayMinPnL[strategy.LongSma.Length, strategy.ShortSma.Length], 100 - arrayPnLUpPer[strategy.LongSma.Length, strategy.ShortSma.Length]);
                                    Console.WriteLine(&amp;quot;Последнее значение: {0}.&amp;quot;, arrayPnLAfter[strategy.LongSma.Length, strategy.ShortSma.Length]);
                                    
                                    afterDateTime = DateTime.Now;

                                    CountReadyStrategy = CountReadyStrategy + 1;
                                    CountAllReadyStrategy = CountAllReadyStrategy + 1;

                                    trader.Stop();
                                    trader.Dispose();
                                    trader = null;
                                    strategy.Stop();
                                    strategy.Dispose();
                                    strategy = null;
                                    candleManager.Dispose();
                                    candleManager = null;

                                    if (CountAllReadyStrategy == countVariation + 1) Console.WriteLine(&amp;quot;Тестирование закончено за {0}!&amp;quot;, (DateTime.Now - startEmulationTime).ToString().Remove(11));
                                }
                            };

                            //System.Threading.ThreadPool.QueueUserWorkItem()
                            
                            //Событие изменения PnL
                            strategy.PnLChanged += () =&amp;gt;
                            {
                                //arrayPnLCollect[strategy.LongSma.Length, strategy.ShortSma.Length].Add(new Tuple&amp;lt;DateTime, double&amp;gt;(strategy.GetMarketTime(), (double)strategy.PnL));


                                int _i = strategy.LongSma.Length;
                                int _j = strategy.ShortSma.Length;

                                if ((double)strategy.PnL &amp;gt; arrayMaxPnL[_i, _j]) arrayMaxPnL[_i, _j] = (double)strategy.PnL;
                                if ((double)strategy.PnL &amp;lt; arrayMinPnL[_i, _j]) arrayMinPnL[_i, _j] = (double)strategy.PnL;

                                if (arrayPnLAfter[_i, _j] &amp;lt; (double)strategy.PnL) arrayPnLUp[_i, _j] = arrayPnLUp[_i, _j] + 1;
                                else arrayPnLDown[_i, _j] = arrayPnLDown[_i, _j] + 1;

                                arrayPnLAfter[_i, _j] = (double)strategy.PnL;

                                arrayPnLUpPer[_i, _j] = (arrayPnLUp[_i, _j] * 100 / (arrayPnLUp[_i, _j] + arrayPnLDown[_i, _j]));

                            };                                                      

                            //Запускаем трейдера
                            trader.Start(startTime, stopTime);

                            CountAddTrader = CountAddTrader + 1;

                            if (j == lenghtArraySecondParametr - 1) end_j = 0;
                           
                            if (CountAddTrader == CountAtOnceTrader)
                            {
                                end_j = j + 1;
                                end_i = i;
                                break;
                            }
                        }

                        if (end_j == lenghtArraySecondParametr)
                        {
                            end_i = i + 1;
                            end_j = 0;
                        }

                    }
                }

                CountReadyStrategy = 1;
                CountAddTrader = 0;

                Console.WriteLine(&amp;quot;-----------------------------------------------&amp;quot;);
            }
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;В циклах перебираются параметры при тестировании. Это еще черновая версия, но рабочая. Когда запускаю по одному трейдеру все нормально. Когда больше, то в стратегиях начинают мешаться значения и не получается их вывести. В общем нет синхронизации.&lt;/p&gt;
&lt;p&gt;П.С. Использую циклы по условию для ожилания завершения стратегии и потом только запускаю новую партию стратегий. Есть ли другие более производительные варианты реализации кроме как While? Или и так нормально?&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/28165/</id>
    <title type="text">Bond: while (countVariation != CountAllReadyStrategy - 1) { while (CountAtOnceTrader != CountReadySt...</title>
    <published>2013-11-12T12:05:23Z</published>
    <updated>2013-11-12T12:05:23Z</updated>
    <author>
      <name>IvanB</name>
      <uri>https://stocksharp.ru/users/26984/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(28162)" rel="nofollow" target="_blank"&gt;Bond&lt;/a&gt;:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="spoiler"&gt;&lt;/div&gt;&lt;/blockquote&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
while (countVariation != CountAllReadyStrategy - 1)
            {
                while (CountAtOnceTrader != CountReadyStrategy - 1)
                {
                    //Перебираем параметры стратегий в циклах
                    for (int i = end_i; i &amp;lt; lenghtArrayFirstParametr; i++)
                    {
                        if (CountAddTrader == CountAtOnceTrader) break;                       

                        for (int j = end_j; j &amp;lt; lenghtArraySecondParametr; j++)
                        {
                            //Создаем шлюз для эмуляции
                            var trader = new EmulationTrader(new[] {security}, new[] {portfolio}, storageRegistry)
                                {
                                    StorageRegistry = storageRegistry,
                                    UseCandlesTimeFrame = timeFrame,
                                };

                            //Соединяемся с трейдером и запускаем экспорт, чтобы инициализировать переданными инструментами и портфелями необходимые свойства EmulationTrader
                            trader.Connect();
                            trader.StartExport();

                            //Создаем менеджера свечек
                            var candleManager = new CandleManager(trader);
                            candleManager.Start(series);

                            //Создаем торговую стратегию
                            var strategy = new SmaStrategy(series, new SimpleMovingAverage {Length = arrayFirstParametr[i]}, new SimpleMovingAverage {Length = arraySecondParametr[j]})
                                {
                                    Volume = 1,
                                    Security = security,
                                    Portfolio = portfolio,
                                    Trader = trader,
                                };

                            //Событие изменения стратегии
                            trader.StateChanged += (oldState, newState) =&amp;gt;
                            {
                                if (trader.State == EmulationStates.Started)
                                {
                                    //Запускаем стратегию когда эмулятор запустился
                                    strategy.Start();
                                }

                                //Если стратегия остановлена
                                if (trader.State == EmulationStates.Stopped)
                                {
                                    //Console.WriteLine(&amp;quot;Стратегия #{3} ({1}, {2}) Time: {0}.&amp;quot;, DateTime.Now - afterDateTime, strategy.LongSma.Length, strategy.ShortSma.Length, CountAllReadyStrategy);

                                    Console.WriteLine(&amp;quot;Стратегия #{3} ({1}, {2}) Time: {0}.&amp;quot;, DateTime.Now - afterDateTime, strategy.LongSma.Length, strategy.ShortSma.Length, CountAllReadyStrategy);
                                    Console.WriteLine(&amp;quot;Max знач. прибыли: {0}; Росла {1}% времени&amp;quot;, arrayMaxPnL[strategy.LongSma.Length, strategy.ShortSma.Length], arrayPnLUpPer[strategy.LongSma.Length, strategy.ShortSma.Length]);
                                    Console.WriteLine(&amp;quot;Min знач. прибыли: {0}; Падала {1}% времени&amp;quot;, arrayMinPnL[strategy.LongSma.Length, strategy.ShortSma.Length], 100 - arrayPnLUpPer[strategy.LongSma.Length, strategy.ShortSma.Length]);
                                    Console.WriteLine(&amp;quot;Последнее значение: {0}.&amp;quot;, arrayPnLAfter[strategy.LongSma.Length, strategy.ShortSma.Length]);
                                    
                                    afterDateTime = DateTime.Now;

                                    CountReadyStrategy = CountReadyStrategy + 1;
                                    CountAllReadyStrategy = CountAllReadyStrategy + 1;

                                    trader.Stop();
                                    trader.Dispose();
                                    trader = null;
                                    strategy.Stop();
                                    strategy.Dispose();
                                    strategy = null;
                                    candleManager.Dispose();
                                    candleManager = null;

                                    if (CountAllReadyStrategy == countVariation + 1) Console.WriteLine(&amp;quot;Тестирование закончено за {0}!&amp;quot;, (DateTime.Now - startEmulationTime).ToString().Remove(11));
                                }
                            };

                            //System.Threading.ThreadPool.QueueUserWorkItem()
                            
                            //Событие изменения PnL
                            strategy.PnLChanged += () =&amp;gt;
                            {
                                //arrayPnLCollect[strategy.LongSma.Length, strategy.ShortSma.Length].Add(new Tuple&amp;lt;DateTime, double&amp;gt;(strategy.GetMarketTime(), (double)strategy.PnL));


                                int _i = strategy.LongSma.Length;
                                int _j = strategy.ShortSma.Length;

                                if ((double)strategy.PnL &amp;gt; arrayMaxPnL[_i, _j]) arrayMaxPnL[_i, _j] = (double)strategy.PnL;
                                if ((double)strategy.PnL &amp;lt; arrayMinPnL[_i, _j]) arrayMinPnL[_i, _j] = (double)strategy.PnL;

                                if (arrayPnLAfter[_i, _j] &amp;lt; (double)strategy.PnL) arrayPnLUp[_i, _j] = arrayPnLUp[_i, _j] + 1;
                                else arrayPnLDown[_i, _j] = arrayPnLDown[_i, _j] + 1;

                                arrayPnLAfter[_i, _j] = (double)strategy.PnL;

                                arrayPnLUpPer[_i, _j] = (arrayPnLUp[_i, _j] * 100 / (arrayPnLUp[_i, _j] + arrayPnLDown[_i, _j]));

                            };                                                      

                            //Запускаем трейдера
                            trader.Start(startTime, stopTime);

                            CountAddTrader = CountAddTrader + 1;

                            if (j == lenghtArraySecondParametr - 1) end_j = 0;
                           
                            if (CountAddTrader == CountAtOnceTrader)
                            {
                                end_j = j + 1;
                                end_i = i;
                                break;
                            }
                        }

                        if (end_j == lenghtArraySecondParametr)
                        {
                            end_i = i + 1;
                            end_j = 0;
                        }

                    }
                }

                CountReadyStrategy = 1;
                CountAddTrader = 0;

                Console.WriteLine(&amp;quot;-----------------------------------------------&amp;quot;);
            }
&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;blockquote&gt;
&lt;p&gt;В циклах перебираются параметры при тестировании. Это еще черновая версия, но рабочая. Когда запускаю по одному трейдеру все нормально. Когда больше, то в стратегиях начинают мешаться значения и не получается их вывести. В общем нет синхронизации.&lt;/p&gt;
&lt;p&gt;П.С. Использую циклы по условию для ожилания завершения стратегии и потом только запускаю новую партию стратегий. Есть ли другие более производительные варианты реализации кроме как While? Или и так нормально?
С циклом все в порядке.
По поводу подсчета прибыли-убытка. Нужно вынести код вычисления в отдельный метод, примерно так:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="spoiler"&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
private void PnLCalc(MyStrategy strategy)
        {
            int _i = strategy.LongSma.Length;
            int _j = strategy.ShortSma.Length;

            if ((double)strategy.PnL &amp;gt; arrayMaxPnL[_i, _j]) arrayMaxPnL[_i, _j] = (double)strategy.PnL;
            if ((double)strategy.PnL &amp;lt; arrayMinPnL[_i, _j]) arrayMinPnL[_i, _j] = (double)strategy.PnL;

            if (arrayPnLAfter[_i, _j] &amp;lt; (double)strategy.PnL) arrayPnLUp[_i, _j] = arrayPnLUp[_i, _j] + 1;
            else arrayPnLDown[_i, _j] = arrayPnLDown[_i, _j] + 1;

            arrayPnLAfter[_i, _j] = (double)strategy.PnL;

            arrayPnLUpPer[_i, _j] = (arrayPnLUp[_i, _j] * 100 / (arrayPnLUp[_i, _j] + arrayPnLDown[_i, _j]));
        }

&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;И далее его используем так:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
//Событие изменения PnL
                            strategy.PnLChanged += () =&amp;gt;
                            {
                                System.Threading.ThreadPool.QueueUserWorkItem((s) =&amp;gt;
                                 {
                                     PnLCalc((MyStrategy)s);
                                          }, strategy);
                            }

&lt;/code&gt;&lt;/pre&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/28164/</id>
    <title type="text">Могу всю программу на почту сбросить. </title>
    <published>2013-11-12T11:41:51Z</published>
    <updated>2013-11-12T11:41:51Z</updated>
    <author>
      <name>Bond</name>
      <uri>https://stocksharp.ru/users/26882/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&lt;p&gt;Могу всю программу на почту сбросить.&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/28161/</id>
    <title type="text">Bond: Lock не работает. Перебрал все возможные варианты. Может потому что метод только один и он ста...</title>
    <published>2013-11-12T10:07:54Z</published>
    <updated>2013-11-12T10:07:54Z</updated>
    <author>
      <name>IvanB</name>
      <uri>https://stocksharp.ru/users/26984/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(28160)" rel="nofollow" target="_blank"&gt;Bond&lt;/a&gt;:&lt;/strong&gt;
Lock не работает. Перебрал все возможные варианты. Может потому что метод только один и он статичный?
В общем не пошло, а первый вариант пока запустить не получается.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Можно на код взглянуть, где этот кусок используется?&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/28160/</id>
    <title type="text">Lock не работает. Перебрал все возможные варианты. Может потому что метод только один и он статичный...</title>
    <published>2013-11-12T09:39:54Z</published>
    <updated>2013-11-12T09:39:54Z</updated>
    <author>
      <name>Bond</name>
      <uri>https://stocksharp.ru/users/26882/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&lt;p&gt;Lock не работает. Перебрал все возможные варианты. Может потому что метод только один и он статичный?
В общем не пошло, а первый вариант пока запустить не получается.&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/28158/</id>
    <title type="text">Bond: Нужна помощь! Есть код: //Событие изменения PnL strategy.PnLChanged += () =&amp;gt; { x = x + 1; }; &amp;gt;...</title>
    <published>2013-11-12T07:10:32Z</published>
    <updated>2013-11-12T07:10:32Z</updated>
    <author>
      <name>IvanB</name>
      <uri>https://stocksharp.ru/users/26984/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(28147)" rel="nofollow" target="_blank"&gt;Bond&lt;/a&gt;:&lt;/strong&gt;
Нужна помощь!&lt;/p&gt;
&lt;p&gt;Есть код:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;//Событие изменения PnL
strategy.PnLChanged += () =&amp;gt;
{
x = x + 1;
};&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; 
&amp;gt; Когда запускаешь несколько стратегий второе приходящее событие обрывает выполнение действия в скобках и начинает свое, в итоге получается белиберда.
&amp;gt; 
&amp;gt; Подскажите как сделать очередь выполнения событий или еще лучше сделать их параллельное вычисление.
&amp;gt; 
&amp;gt; Вот нашел пример в интернете:
&amp;gt; &amp;lt;http://usings.ru/2009/06/22/eventpool/&amp;gt;
&amp;gt; 
&amp;gt; Заранее спасибо.

В теле обработчика события напишите так:
```csharp

System.Threading.ThreadPool.QueueUserWorkItem((s) =&amp;gt; { 
     x = x + 1;
});

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;это, грубо говоря, через многопоточность.&lt;/p&gt;
&lt;p&gt;Либо попробовать через блокировку:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;lock()
{

}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href="http://msdn.microsoft.com/ru-ru/library/c5kehkcz.aspx" target="_blank"&gt;http://msdn.microsoft.com/ru-ru/library/c5kehkcz.aspx&lt;/a&gt;&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/28147/</id>
    <title type="text">Нужна помощь! Есть код: //Событие изменения PnL strategy.PnLChanged += () =&amp;gt; { x = x + 1; }; Когда з...</title>
    <published>2013-11-11T23:06:42Z</published>
    <updated>2013-11-12T05:18:43Z</updated>
    <author>
      <name>Bond</name>
      <uri>https://stocksharp.ru/users/26882/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&lt;p&gt;Нужна помощь!&lt;/p&gt;
&lt;p&gt;Есть код:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
//Событие изменения PnL
strategy.PnLChanged += () =&amp;gt;
  {
     x = x + 1;
  };

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Когда запускаешь несколько стратегий второе приходящее событие обрывает выполнение действия в скобках и начинает свое, в итоге получается белиберда.&lt;/p&gt;
&lt;p&gt;Подскажите как сделать очередь выполнения событий или еще лучше сделать их параллельное вычисление.&lt;/p&gt;
&lt;p&gt;Вот нашел пример в интернете:
&lt;a href="http://usings.ru/2009/06/22/eventpool/" rel="nofollow" target="_blank"&gt;http://usings.ru/2009/06/22/eventpool/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Заранее спасибо.&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
</feed>