﻿<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type='text/css' href='https://stocksharp.com/css/style.css'?>
<?xml-stylesheet type='text/css' href='https://stocksharp.com/css/bbeditor.css'?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title type="html">Нужна помощь (очередь событий)</title>
  <id>~/topic/4120/nuzhna-pomoshsh-(ochered-sobytii)/</id>
  <rights type="text">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  <updated>2026-04-25T19:51:46Z</updated>
  <logo>https://stocksharp.com/images/logo.png</logo>
  <link href="https://stocksharp.com/handlers/atom.ashx?category=topic&amp;id=4120" rel="self" type="application/rss+xml" />
  <entry>
    <id>https://stocksharp.com/posts/m/28187/</id>
    <title type="text">Попробовал. Не помогло. Тот же фарш из потоков. Прям генератор случайных чисел получился))) Поменял ...</title>
    <published>2013-11-13T16:50:35Z</published>
    <updated>2013-11-13T16:50:35Z</updated>
    <author>
      <name>IvanB</name>
      <uri>https://stocksharp.com/users/26984/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Bond &lt;a href="https://stocksharp.com/posts/m/28171/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;Попробовал. Не помогло. Тот же фарш из потоков. Прям генератор случайных чисел получился)))&lt;br /&gt;Поменял код. Решил оставить только одну подписку на события. И забираю коллекцию trader.MyTrades. Потом буду ее потрошить.&lt;br /&gt;&lt;div class='spoilertitle'&gt;&lt;input type='button' value='Show spoiler' class='btn btn-primary' onclick="toggleSpoiler(this, 'spolier_874918fb2a294e9dbd0a3b564410b2c4');" title='Show spoiler' /&gt;&lt;/div&gt;&lt;div class='spoilerbox' id='spolier_874918fb2a294e9dbd0a3b564410b2c4' style='display:none'&gt;&lt;div class="code"&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush: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;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Попробовал с этой подпиской. Вообще вылетает.&lt;br /&gt;&lt;div class='spoilertitle'&gt;&lt;input type='button' value='Show spoiler' class='btn btn-primary' onclick="toggleSpoiler(this, 'spolier_03821d2c961a4d8ca2b1109405de2b4d');" title='Show spoiler' /&gt;&lt;/div&gt;&lt;div class='spoilerbox' id='spolier_03821d2c961a4d8ca2b1109405de2b4d' style='display:none'&gt;&lt;div class="code"&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush: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;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class='spoilertitle'&gt;&lt;input type='button' value='Show spoiler' class='btn btn-primary' onclick="toggleSpoiler(this, 'spolier_2e234a06847143d28c701e9269773e3d');" title='Show spoiler' /&gt;&lt;/div&gt;&lt;div class='spoilerbox' id='spolier_2e234a06847143d28c701e9269773e3d' style='display:none'&gt;&lt;div class="code"&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush: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;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;С событиями заметил, что может только дойти до фигурной скобки и даже не зайти в блок операторов и сразу смениться на новое пришедшее событие.&lt;br /&gt;Даже не знаю, как подойти. Может реализовать очередь событий из того примера в интернете, который я указал в первом сообщении ветки?&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Тот вариант что я рекомендовал, он должен работать, он работает в многопоточном режиме, т.е. не гарантируется, что порядок обработки вызываемых обработчиков будет соответствовать порядку вызовов. Вот Вы и думаете что получается ерунда. Если хотите работать с многопоточностью, то соответственно, может понадобиться и переделывать логику, которая была реализована как линейная.&lt;br /&gt;&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Quote:&lt;/span&gt;&lt;div class="innerquote"&gt;&lt;br /&gt;П.С. Вылетает ошибка, что IEnumerable&amp;lt;MyTrade&amp;gt; нельзя сериализовать.&lt;br /&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;br /&gt;Конвертировать в другую коллекцию? Или можно проще решить?&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;То, что Вы передаете в PnLCalc, я рекомендую объединить в один экземпляр, некоторого класса (нужно создать класс) и этот экземпляр передавать в пул:&lt;br /&gt;System.Threading.ThreadPool.QueueUserWorkItem((s =&amp;gt;&lt;br /&gt;                                {&lt;br /&gt;                                    ...&lt;br /&gt;                                }), &amp;lt;экземпляр класса с параметрами, объектами&amp;gt;)&lt;br /&gt;и этот экземпляр Вы можете использовать внутри пула, т.е. он передается в тело в виде аргумента:&lt;br /&gt;System.Threading.ThreadPool.QueueUserWorkItem((s =&amp;gt;&lt;br /&gt;                                {&lt;br /&gt;                                    &amp;lt;используем s, предварительно явно преобразовав его к типу вашего класса&amp;gt;&lt;br /&gt;                                }), &amp;lt;экземпляр класса с параметрами, объектами&amp;gt;)</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/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.com/users/26882/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Попробовал. Не помогло. Тот же фарш из потоков. Прям генератор случайных чисел получился)))&lt;br /&gt;Поменял код. Решил оставить только одну подписку на события. И забираю коллекцию trader.MyTrades. Потом буду ее потрошить.&lt;br /&gt;&lt;div class='spoilertitle'&gt;&lt;input type='button' value='Show spoiler' class='btn btn-primary' onclick="toggleSpoiler(this, 'spolier_9719565b7e304cbe95257e41365a077d');" title='Show spoiler' /&gt;&lt;/div&gt;&lt;div class='spoilerbox' id='spolier_9719565b7e304cbe95257e41365a077d' style='display:none'&gt;&lt;div class="code"&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush: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;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Попробовал с этой подпиской. Вообще вылетает.&lt;br /&gt;&lt;div class='spoilertitle'&gt;&lt;input type='button' value='Show spoiler' class='btn btn-primary' onclick="toggleSpoiler(this, 'spolier_88bcc7d77a50434dbe1755f8ca4ed142');" title='Show spoiler' /&gt;&lt;/div&gt;&lt;div class='spoilerbox' id='spolier_88bcc7d77a50434dbe1755f8ca4ed142' style='display:none'&gt;&lt;div class="code"&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush: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;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class='spoilertitle'&gt;&lt;input type='button' value='Show spoiler' class='btn btn-primary' onclick="toggleSpoiler(this, 'spolier_541028589f8e437c8ade22e69ca83db3');" title='Show spoiler' /&gt;&lt;/div&gt;&lt;div class='spoilerbox' id='spolier_541028589f8e437c8ade22e69ca83db3' style='display:none'&gt;&lt;div class="code"&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush: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;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;С событиями заметил, что может только дойти до фигурной скобки и даже не зайти в блок операторов и сразу смениться на новое пришедшее событие.&lt;br /&gt;Даже не знаю, как подойти. Может реализовать очередь событий из того примера в интернете, который я указал в первом сообщении ветки?&lt;br /&gt;&lt;br /&gt;П.С. Вылетает ошибка, что IEnumerable&amp;lt;MyTrade&amp;gt; нельзя сериализовать.&lt;br /&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;br /&gt;Конвертировать в другую коллекцию? Или можно проще решить?</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/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.com/users/26882/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;div class='spoilertitle'&gt;&lt;input type='button' value='Show spoiler' class='btn btn-primary' onclick="toggleSpoiler(this, 'spolier_4ddb3ce1c13d477bbceef2f8edaa1fd7');" title='Show spoiler' /&gt;&lt;/div&gt;&lt;div class='spoilerbox' id='spolier_4ddb3ce1c13d477bbceef2f8edaa1fd7' style='display:none'&gt;&lt;div class="code"&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush: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;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;В циклах перебираются параметры при тестировании. Это еще черновая версия, но рабочая. Когда запускаю по одному трейдеру все нормально. Когда больше, то в стратегиях начинают мешаться значения и не получается их вывести. В общем нет синхронизации.&lt;br /&gt;&lt;br /&gt;П.С. Использую циклы по условию для ожилания завершения стратегии и потом только запускаю новую партию стратегий. Есть ли другие более производительные варианты реализации кроме как While? Или и так нормально?</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/28165/</id>
    <title type="text"> while (countVariation != CountAllReadyStrategy - 1) { while (CountAtOnceTrader != CountReadyStrateg...</title>
    <published>2013-11-12T12:05:23Z</published>
    <updated>2013-11-12T12:05:23Z</updated>
    <author>
      <name>IvanB</name>
      <uri>https://stocksharp.com/users/26984/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Bond &lt;a href="https://stocksharp.com/posts/m/28162/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;&lt;div class='spoilertitle'&gt;&lt;input type='button' value='Show spoiler' class='btn btn-primary' onclick="toggleSpoiler(this, 'spolier_9a5425b4182841b8bab2fb5d9f94d69e');" title='Show spoiler' /&gt;&lt;/div&gt;&lt;div class='spoilerbox' id='spolier_9a5425b4182841b8bab2fb5d9f94d69e' style='display:none'&gt;&lt;div class="code"&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush: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;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;В циклах перебираются параметры при тестировании. Это еще черновая версия, но рабочая. Когда запускаю по одному трейдеру все нормально. Когда больше, то в стратегиях начинают мешаться значения и не получается их вывести. В общем нет синхронизации.&lt;br /&gt;&lt;br /&gt;П.С. Использую циклы по условию для ожилания завершения стратегии и потом только запускаю новую партию стратегий. Есть ли другие более производительные варианты реализации кроме как While? Или и так нормально?&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;С циклом все в порядке.&lt;br /&gt;По поводу подсчета прибыли-убытка. Нужно вынести код вычисления в отдельный метод, примерно так:&lt;br /&gt;&lt;div class='spoilertitle'&gt;&lt;input type='button' value='Show spoiler' class='btn btn-primary' onclick="toggleSpoiler(this, 'spolier_44e06f49c4a446a9940f3113d2f3fc0c');" title='Show spoiler' /&gt;&lt;/div&gt;&lt;div class='spoilerbox' id='spolier_44e06f49c4a446a9940f3113d2f3fc0c' style='display:none'&gt;&lt;div class="code"&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush: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;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;И далее его используем так:&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;

//Событие изменения PnL
                            strategy.PnLChanged += () =&amp;gt;
                            {
                                System.Threading.ThreadPool.QueueUserWorkItem((s) =&amp;gt;
                                 {
                                     PnLCalc((MyStrategy)s);
                                          }, strategy);
                            }
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/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.com/users/26882/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Могу всю программу на почту сбросить.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/28161/</id>
    <title type="text">Lock не работает. Перебрал все возможные варианты. Может потому что метод только один и он статичный...</title>
    <published>2013-11-12T10:07:54Z</published>
    <updated>2013-11-12T10:07:54Z</updated>
    <author>
      <name>IvanB</name>
      <uri>https://stocksharp.com/users/26984/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Bond &lt;a href="https://stocksharp.com/posts/m/28160/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;Lock не работает. Перебрал все возможные варианты. Может потому что метод только один и он статичный?&lt;br /&gt;В общем не пошло, а первый вариант пока запустить не получается.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Можно на код взглянуть, где этот кусок используется?</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/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.com/users/26882/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Lock не работает. Перебрал все возможные варианты. Может потому что метод только один и он статичный?&lt;br /&gt;В общем не пошло, а первый вариант пока запустить не получается.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/28158/</id>
    <title type="text">Нужна помощь! Есть код: //Событие изменения PnL strategy.PnLChanged += () =&amp;gt; { x = x + 1; }; Когда з...</title>
    <published>2013-11-12T07:10:32Z</published>
    <updated>2013-11-12T07:10:32Z</updated>
    <author>
      <name>IvanB</name>
      <uri>https://stocksharp.com/users/26984/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Bond &lt;a href="https://stocksharp.com/posts/m/28147/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;Нужна помощь!&lt;br /&gt;&lt;br /&gt;Есть код:&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;

//Событие изменения PnL
strategy.PnLChanged += () =&amp;gt;
  {
     x = x + 1;
  };
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Когда запускаешь несколько стратегий второе приходящее событие обрывает выполнение действия в скобках и начинает свое, в итоге получается белиберда.&lt;br /&gt;&lt;br /&gt;Подскажите как сделать очередь выполнения событий или еще лучше сделать их параллельное вычисление.&lt;br /&gt;&lt;br /&gt;Вот нашел пример в интернете:&lt;br /&gt;&lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAAD3x03bAhv8p7vbYrulZMH85khnZKoVT1XyYfjZZeQG9343eAzPpdcP96z1zD9ZNuQ" title="http://usings.ru/2009/06/22/eventpool/"&gt;http://usings.ru/2009/06/22/eventpool/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Заранее спасибо.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;В теле обработчика события напишите так:&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;

System.Threading.ThreadPool.QueueUserWorkItem((s) =&amp;gt; { 
     x = x + 1;
});
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;это, грубо говоря, через многопоточность.&lt;br /&gt;&lt;br /&gt;Либо попробовать через блокировку:&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;
lock()
{

}&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;a target="_blank" href="http://msdn.microsoft.com/ru-ru/library/c5kehkcz.aspx" title="http://msdn.microsoft.com/ru-ru/library/c5kehkcz.aspx"&gt;http://msdn.microsoft.co...ru/library/c5kehkcz.aspx&lt;/a&gt;</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/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.com/users/26882/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Нужна помощь!&lt;br /&gt;&lt;br /&gt;Есть код:&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;

//Событие изменения PnL
strategy.PnLChanged += () =&amp;gt;
  {
     x = x + 1;
  };
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Когда запускаешь несколько стратегий второе приходящее событие обрывает выполнение действия в скобках и начинает свое, в итоге получается белиберда.&lt;br /&gt;&lt;br /&gt;Подскажите как сделать очередь выполнения событий или еще лучше сделать их параллельное вычисление.&lt;br /&gt;&lt;br /&gt;Вот нашел пример в интернете:&lt;br /&gt;&lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAAD3x03bAhv8p7vbYrulZMH85khnZKoVT1XyYfjZZeQG9343eAzPpdcP96z1zD9ZNuQ" title="http://usings.ru/2009/06/22/eventpool/"&gt;http://usings.ru/2009/06/22/eventpool/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Заранее спасибо.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
</feed>