﻿<?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">не понятен механизм работы метода AddRange</title>
  <id>~/topic/1755/ne-ponyaten-mehanizm-raboty-metoda-addrange/</id>
  <rights type="text">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  <updated>2026-06-15T17:01:54Z</updated>
  <logo>https://stocksharp.com/images/logo.png</logo>
  <link href="https://stocksharp.com/handlers/atom.ashx?category=topic&amp;id=1755" rel="self" type="application/rss+xml" />
  <entry>
    <id>https://stocksharp.com/posts/m/10147/</id>
    <title type="text">Alexander: У вас логика работы некорректная. Зачем использовать Trader у MainWindow.Instance ? Ведь ...</title>
    <published>2011-08-03T11:36:05Z</published>
    <updated>2011-08-03T11:36:05Z</updated>
    <author>
      <name>vader</name>
      <uri>https://stocksharp.com/users/28223/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(9748)" rel="nofollow" target="_blank"&gt;Alexander&lt;/a&gt;:&lt;/strong&gt;
У вас логика работы некорректная.&lt;/p&gt;
&lt;p&gt;Зачем использовать Trader у MainWindow.Instance ? Ведь он есть у Strategy&lt;/p&gt;
&lt;p&gt;Блокировки не нужны, пользуйтесь событиями и When\Do.
Коллекции вообще не нужны. Все сделки есть в Strategy.MyTrades, заявки - Strategy.Orders
Эти коллекции - синхронизированные (SynchronizedList и SynchronizedSet соответственно).&lt;/p&gt;
&lt;p&gt;А вы объявляете свою коллекцию как ObservableCollection и удивляетесь что она не синхронизирована :)&lt;/p&gt;
&lt;p&gt;А так - надо пользоваться
When(order.Matched()).Do(blablabla);
When(order.NewTrades()).Do(blablabla);
Alexander? не моглы бы вы прояснить, как правильно использовать коллекции заявок и сделок.
я хочу вычтавлять заявки последовательно, онда за другой.
Есть условие для высталения завок и дополнительное условие ,заключающееся в том, что пока одна заявка не исполнится, следующая не выставляается.
Но списки сделок и заявок не успевают обновится.
Допустим в этом методе дожен расчитыватся обший объем купленных лотов ,но из-за того ,что список сделок не успевает дополнится, часто объем считается не верно.
К примеру, прошли две сделки объемом 1 и 7, купленный объем посчитается как 2.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
private bool RecalculateVolume()
	{		if(this.MyTrades.Count &amp;gt; 0){
			_curLotBuySellNow += this.MyTrades[this.MyTrades.Count-1].Trade.Volume;
			//MessageBox.Show(_curLotBuySellNow.ToString() + &amp;quot; Volume= &amp;quot; + this.Volume.ToString());
			if (_curLotBuySellNow &amp;gt;= this.Volume){
				this.Stop();
				return false;
			}
		}
		return true;
	}

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;можно ли как-то заставить все стратегию выполнятся в одном потоке?
Атрибут [Synchronization] не помогает.&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/9754/</id>
    <title type="text">vader: esper, да я это видел, но я прошу пример не только стратегии но и её комплексного использован...</title>
    <published>2011-07-21T08:37:03Z</published>
    <updated>2011-07-21T08:37:03Z</updated>
    <author>
      <name>Alexander</name>
      <uri>https://stocksharp.com/users/2826/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(9752)" rel="nofollow" target="_blank"&gt;vader&lt;/a&gt;:&lt;/strong&gt;
esper, да я это видел, но я прошу пример не только стратегии но и её комплексного использования в роботе.
чтобы было понятно, как с ней работать.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;см. SampleSMA.
Работа с событийной стратегией ничем не отличается.&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/9752/</id>
    <title type="text">esper, да я это видел, но я прошу пример не только стратегии но и её комплексного использования в ро...</title>
    <published>2011-07-21T08:32:58Z</published>
    <updated>2011-07-21T08:32:58Z</updated>
    <author>
      <name>vader</name>
      <uri>https://stocksharp.com/users/28223/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;p&gt;esper, да я это видел, но я прошу пример не только стратегии но и её комплексного использования в роботе.
чтобы было понятно, как с ней работать.&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/9751/</id>
    <title type="text">vader: Ориентируюся на ваши посты, я понял, что надо писать через стратегии. я видел у вас пример по...</title>
    <published>2011-07-21T08:25:50Z</published>
    <updated>2011-07-21T08:25:50Z</updated>
    <author>
      <name>esper</name>
      <uri>https://stocksharp.com/users/5990/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(9750)" rel="nofollow" target="_blank"&gt;vader&lt;/a&gt;:&lt;/strong&gt;
Ориентируюся на ваши посты, я понял, что надо писать через стратегии.
я видел у вас пример позиционной стратегии(итерационной).
Есть ли у вас пример использование и работы с событийной стратегии?( как  у вас есть пример SampleSMA)?
А то тяжеловато разобратся.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;В &lt;a href="http://stocksharp.com/doc/html/8c0327db-494a-4fe0-aba8-0d4b93dea60e.htm"&gt;документации&lt;/a&gt; есть пример&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/9750/</id>
    <title type="text">Ориентируюся на ваши посты, я понял, что надо писать через стратегии. я видел у вас пример позиционн...</title>
    <published>2011-07-21T08:22:26Z</published>
    <updated>2011-07-21T08:22:26Z</updated>
    <author>
      <name>vader</name>
      <uri>https://stocksharp.com/users/28223/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;p&gt;Ориентируюся на ваши посты, я понял, что надо писать через стратегии.
я видел у вас пример позиционной стратегии(итерационной).
Есть ли у вас пример использование и работы с событийной стратегии?( как  у вас есть пример SampleSMA)?
А то тяжеловато разобратся.&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/9748/</id>
    <title type="text">У вас логика работы некорректная. Зачем использовать Trader у MainWindow.Instance ? Ведь он есть у S...</title>
    <published>2011-07-21T07:41:01Z</published>
    <updated>2011-07-21T07:41:01Z</updated>
    <author>
      <name>Alexander</name>
      <uri>https://stocksharp.com/users/2826/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;p&gt;У вас логика работы некорректная.&lt;/p&gt;
&lt;p&gt;Зачем использовать Trader у MainWindow.Instance ? Ведь он есть у Strategy&lt;/p&gt;
&lt;p&gt;Блокировки не нужны, пользуйтесь событиями и When\Do.
Коллекции вообще не нужны. Все сделки есть в Strategy.MyTrades, заявки - Strategy.Orders
Эти коллекции - синхронизированные (SynchronizedList и SynchronizedSet соответственно).&lt;/p&gt;
&lt;p&gt;А вы объявляете свою коллекцию как ObservableCollection и удивляетесь что она не синхронизирована :)&lt;/p&gt;
&lt;p&gt;А так - надо пользоваться
When(order.Matched()).Do(blablabla);
When(order.NewTrades()).Do(blablabla);&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/9747/</id>
    <title type="text">MainWindow.Instance.Trader.RegisterOrder(order); я использую для регистрации заявки. Для чего нужны ...</title>
    <published>2011-07-21T06:52:57Z</published>
    <updated>2011-07-21T06:52:57Z</updated>
    <author>
      <name>vader</name>
      <uri>https://stocksharp.com/users/28223/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;p&gt;MainWindow.Instance.Trader.RegisterOrder(order); я использую для регистрации заявки.&lt;/p&gt;
&lt;p&gt;Для чего нужны эти блокировки (waitHandle.WaitOne();...)?
Для того. чтобы знать, что заявки исполнена. Блокировка снимается, когда происходит событие получения новой сделки.
Добавление в коллекцию - для того, чтобы отображать собственные заявки.
Удаляю я не активные заявки.&lt;/p&gt;
&lt;p&gt;Это делается не внутри класса Strategy.
public ObservableCollection&lt;MyTrade&gt; Trades { get; private set; }
public ObservableCollection&lt;Order&gt; Orders { get; private set; }&lt;/p&gt;
&lt;p&gt;По поводу главного вопроса.
Я в цикле сталю заявки, и жду их исполнения, чтобы ставить следующие, опираясь на зену исполнения последней сделки.
Как мне узнать о том, что заявки исполнена?
Раньше я проверял так -  Orders[Orders.Count-1].IsMatched()
Но, видимо, если часть заявки исполняется сразу, то коллекция не успевает обновится и робот, думает, что заявка исполнена, т.к. он видит прошлую, которая уже исполнена.
Я предролагаю, что анонимных метод синхронизированый, но видимо, это не так, иначе бы все заявки и сделки попадлибы в свои коллекции, а потом происходили бы дальнейшие действия.&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/9730/</id>
    <title type="text">Про метод AddRange есть на MSDN Совсем не понятно зачем строить такую логику - использовать внутри с...</title>
    <published>2011-07-20T14:46:52Z</published>
    <updated>2011-07-20T14:46:52Z</updated>
    <author>
      <name>Alexander</name>
      <uri>https://stocksharp.com/users/2826/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;p&gt;Про метод AddRange &lt;a href="http://msdn.microsoft.com/ru-ru/library/system.collections.arraylist.addrange.aspx" target="_blank"&gt;есть на MSDN&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Совсем не понятно зачем строить такую логику - использовать внутри стратегии обращение к MainWindow.Instance.Trader к примеру.
Для чего нужны эти блокировки (waitHandle.WaitOne();...)?
Зачем удалять \ добавлять в коллекции?&lt;/p&gt;
&lt;p&gt;Или же это делается не внутри стратегии (класса Strategy)? Как тогда задеклорированы Trades и Orders?
В любом случае отвечая на вопрос в заголовке - см. MSDN, там есть описание данного метода&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/9728/</id>
    <title type="text">здравствуйте. Пытаюсь реализовать такую стратегию, в которой, цена следующей заявки зависит от цены ...</title>
    <published>2011-07-20T14:24:53Z</published>
    <updated>2011-07-20T14:24:53Z</updated>
    <author>
      <name>vader</name>
      <uri>https://stocksharp.com/users/28223/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;p&gt;здравствуйте.
Пытаюсь реализовать такую стратегию, в которой, цена следующей заявки зависит от цены предидущей.
Для этого подпислся на событие получения новых моих сделок, сохраняю их в коллекцию, и получаю цену последней сделки.
Регистрирую заявку, жду когда придет сделка, извлекаю последную сдлку и беру цену.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
MainWindow.Instance.Trader.RegisterOrder(order);
waitHandle.WaitOne();
						if (_backgroundWorker.CancellationPending){return;}
						_backgroundWorker.ReportProgress(4, order); 						                                curLotBuyNow += Trades[Trades.Count-1].Order.Volume;
						MessageBox.Show(&amp;quot;Id= &amp;quot;+Trades[Trades.Count-1].Order.Id.ToString()+&amp;quot; curLotBuyNow= &amp;quot; + curLotBuyNow.ToString());
						waitHandle.Reset();
						
						price = Math.Min(_priceOfOrder, Trades[Trades.Count-1].Trade.Price);

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;При получении сделки, я хочу чтобы сначала, сделки добавились в коллекцию, а потом произошла разблокировка потока и произошло извлечение цены.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
MainWindow.Instance.Trader.NewMyTrades += trades =&amp;gt;this.GuiAsync(() =&amp;gt;
			                                                                 {
			                                                                 	lock(this)
			                                                                 	{
			                                                                 		trades = from n in trades
			                                                                 			where (n.Trade.Security == _security) &amp;amp;&amp;amp; (n.Order.ExtensionInfo == &amp;quot;S#&amp;quot;)
			                                                                 			select n;
			                                                                 		int startSize = Trades.Count;
			                                                                 		MessageBox.Show(&amp;quot;startSize= &amp;quot;+startSize.ToString());
			                                                                 		this.Trades.AddRange(trades);
			                                                                 		while(startSize == Trades.Count){
			                                                                 		}
			                                                                 		MessageBox.Show(&amp;quot;Count= &amp;quot;+Trades.Count.ToString());
			                                                                 		//Если по другому инструменту?
			                                                                 		if((Orders.Count != 0) &amp;amp;&amp;amp; Orders[Orders.Count-1].IsMatched()){
			                                                                 			this.Orders.RemoveAt(Orders.Count-1);
			                                                                 			waitHandle.Set();
			                                                                 		}
			                                                                 	}
			                                                                 });

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Но этого не происходит. Часто этот код  curLotBuyNow += Trades[Trades.Count-1].Order.Volume;
извлает предпоследнуюю сделку. Я пытался и цикл ожидания использовать(while(startSize == Trades.Count)) и lock, но ничего не помогает.
Помогите, пожалуйста, разобратся.&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
</feed>