﻿<?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">интерфейс ICandleSource</title>
  <id>~/topic/1556/interfeis-icandlesource/</id>
  <rights type="text">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  <updated>2026-06-17T13:40:31Z</updated>
  <logo>https://stocksharp.com/images/logo.png</logo>
  <link href="https://stocksharp.com/handlers/atom.ashx?category=topic&amp;id=1556" rel="self" type="application/rss+xml" />
  <entry>
    <id>https://stocksharp.com/posts/m/7908/</id>
    <title type="text">Спасибо большое! Буду разбираться.. </title>
    <published>2011-05-05T14:37:01Z</published>
    <updated>2011-05-05T14:37:01Z</updated>
    <author>
      <name>Дмитрий</name>
      <uri>https://stocksharp.com/users/28183/</uri>
      <email>info@stocksharp.com</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.com/posts/m/7907/</id>
    <title type="text">Дмитрий: А можете релизацию этого интерфейса в объекте trader показать? Пусть даже сильно обрезанную...</title>
    <published>2011-05-05T13:19:35Z</published>
    <updated>2011-05-05T13:19:35Z</updated>
    <author>
      <name>Mikhail Sukhov</name>
      <uri>https://stocksharp.com/users/201/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(7906)" rel="nofollow" target="_blank"&gt;Дмитрий&lt;/a&gt;:&lt;/strong&gt;
А можете релизацию этого интерфейса в объекте trader показать? Пусть даже сильно обрезанную. Чтобы все методы и событие интерфейса были описаны.
Честно говоря, из этого кода по-прежнему не ясно, что делать.&lt;/p&gt;
&lt;p&gt;Я правильно понял, что мой класс будет забирать данные из массива, и класть их в MySource.Trades именно в методе AddTrades? И какая специфика есть в SafeInvoke? Что-то с многопоточностью связанное?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;
namespace Ecng.Trading.Algo.Candles
{
	using System;
	using System.Collections.Generic;
	using System.Linq;
	using System.Threading;

	using Ecng.Collections;
	using Ecng.Common;
	using Ecng.Trading.BusinessEntities;

	/// &amp;lt;summary&amp;gt;
	/// Базовый источник тиковых сделок для &amp;lt;see cref=&amp;quot;CandleManager&amp;quot;/&amp;gt;, получаемых через событие &amp;lt;see cref=&amp;quot;ITrader.NewTrades&amp;quot;/&amp;gt;.
	/// &amp;lt;/summary&amp;gt;
	public abstract class TraderCandleSource : Disposable, ICandleSource
	{
		private readonly int _maxTradeCount;
		private readonly int _maxCandleCount;
		private readonly SynchronizedList&amp;lt;Trade&amp;gt; _trades;
		private readonly SynchronizedDictionary&amp;lt;Candle, SynchronizedList&amp;lt;Trade&amp;gt;&amp;gt; _candleTrades;

		/// &amp;lt;summary&amp;gt;
		/// Инициализировать &amp;lt;see cref=&amp;quot;TraderCandleSource&amp;quot;/&amp;gt;.
		/// &amp;lt;/summary&amp;gt;
		/// &amp;lt;param name=&amp;quot;trader&amp;quot;&amp;gt;Торговый шлюз, у которого используется событие &amp;lt;see cref=&amp;quot;ITrader.NewTrades&amp;quot;/&amp;gt;.&amp;lt;/param&amp;gt;
		/// &amp;lt;param name=&amp;quot;maxTradeCount&amp;quot;&amp;gt;Максимальное количество сделок, которые нужно хранить.&amp;lt;/param&amp;gt;
		/// &amp;lt;param name=&amp;quot;maxCandleCount&amp;quot;&amp;gt;Максимальное количество свечек, которые нужно хранить.&amp;lt;/param&amp;gt;
		protected TraderCandleSource(ITrader trader, int maxTradeCount, int maxCandleCount)
		{
			if (trader == null)
				throw new ArgumentNullException(&amp;quot;trader&amp;quot;);

			this.Trader = trader;
			this.Trader.NewTrades += OnNewTrades;

			_maxTradeCount = maxTradeCount;
			_maxCandleCount = maxCandleCount;
			_trades = new SynchronizedList&amp;lt;Trade&amp;gt;(100000);
			_candleTrades = new SynchronizedDictionary&amp;lt;Candle, SynchronizedList&amp;lt;Trade&amp;gt;&amp;gt;(1000);
		}

		/// &amp;lt;summary&amp;gt;
		/// Шлюз к торговой системе.
		/// &amp;lt;/summary&amp;gt;
		public ITrader Trader { get; private set; }

		/// &amp;lt;summary&amp;gt;
		/// Событие появления всех новых сделок.
		/// &amp;lt;/summary&amp;gt;
		public event Action&amp;lt;IEnumerable&amp;lt;Trade&amp;gt;&amp;gt; NewTrades;

		/// &amp;lt;summary&amp;gt;
		/// Все накопленные сделки.
		/// &amp;lt;/summary&amp;gt;
		public virtual IEnumerable&amp;lt;Trade&amp;gt; Trades
		{
			get { return _trades.SyncGet(c =&amp;gt; c.ToArray()); }
		}

		/// &amp;lt;summary&amp;gt;
		/// Добавить сделку для свечки.
		/// &amp;lt;/summary&amp;gt;
		/// &amp;lt;param name=&amp;quot;candle&amp;quot;&amp;gt;Свечка, для которой нужно добавить сделку.&amp;lt;/param&amp;gt;
		/// &amp;lt;param name=&amp;quot;trade&amp;quot;&amp;gt;Новая сделка.&amp;lt;/param&amp;gt;
		public void AddTrade(Candle candle, Trade trade)
		{
			_candleTrades.SafeAdd(candle).Add(trade);

			if (_candleTrades.Count &amp;gt; _maxCandleCount * 1.5)
			{
				_candleTrades.SyncDo(c =&amp;gt;
				{
					var elapsed = c.Skip(_maxCandleCount / 2).ToArray();
					c.Clear();
					c.AddRange(elapsed);
				});
			}
		}

		/// &amp;lt;summary&amp;gt;
		/// Получить все сделки по свечке.
		/// &amp;lt;/summary&amp;gt;
		/// &amp;lt;param name=&amp;quot;candle&amp;quot;&amp;gt;Свечка, по которой нужно найти сделки.&amp;lt;/param&amp;gt;
		/// &amp;lt;returns&amp;gt;Найденные сделки.&amp;lt;/returns&amp;gt;
		public IEnumerable&amp;lt;Trade&amp;gt; GetTrades(Candle candle)
		{
			var trades = _candleTrades.TryGetValue(candle);
			return trades != null ? trades.SyncGet(c =&amp;gt; c.ToArray()) : new Trade[0];
		}

		/// &amp;lt;summary&amp;gt;
		/// Обработчик события &amp;lt;see cref=&amp;quot;ITrader.NewTrades&amp;quot;/&amp;gt;.
		/// &amp;lt;/summary&amp;gt;
		/// &amp;lt;param name=&amp;quot;trades&amp;quot;&amp;gt;Новые сделки.&amp;lt;/param&amp;gt;
		protected virtual void OnNewTrades(IEnumerable&amp;lt;Trade&amp;gt; trades)
		{
			_trades.AddRange(trades);

			if (_trades.Count &amp;gt; _maxTradeCount * 1.5)
			{
				_trades.SyncDo(c =&amp;gt;
				{
					var elapsed = c.Skip(_maxTradeCount / 2).ToArray();
					c.Clear();
					c.AddRange(elapsed);
				});
			}
		}

		/// &amp;lt;summary&amp;gt;
		/// Вызвать событие &amp;lt;see cref=&amp;quot;NewTrades&amp;quot;/&amp;gt;.
		/// &amp;lt;/summary&amp;gt;
		/// &amp;lt;param name=&amp;quot;trades&amp;quot;&amp;gt;Новые сделки.&amp;lt;/param&amp;gt;
		protected void RaiseNewTrades(IEnumerable&amp;lt;Trade&amp;gt; trades)
		{
			this.NewTrades.SafeInvoke(trades);
		}

		/// &amp;lt;summary&amp;gt;
		/// Освободить занятые ресурсы.
		/// &amp;lt;/summary&amp;gt;
		protected override void DisposeManaged()
		{
			this.Trader.NewTrades -= OnNewTrades;
			base.DisposeManaged();
		}
	}

	/// &amp;lt;summary&amp;gt;
	/// Источник тиковых сделок для &amp;lt;see cref=&amp;quot;CandleManager&amp;quot;/&amp;gt;, получаемых через событие &amp;lt;see cref=&amp;quot;ITrader.NewTrades&amp;quot;/&amp;gt;, 
	/// и отправляемый в &amp;lt;see cref=&amp;quot;CandleManager&amp;quot;/&amp;gt; с определенным интервалом.
	/// &amp;lt;/summary&amp;gt;
	public class ParallelTraderCandleSource : TraderCandleSource
	{
		private readonly SynchronizedList&amp;lt;Trade&amp;gt; _newTrades = new SynchronizedList&amp;lt;Trade&amp;gt;();

		private bool _isInProcess;
		private readonly Timer _timer;

		/// &amp;lt;summary&amp;gt;
		/// Создать &amp;lt;see cref=&amp;quot;ParallelTraderCandleSource&amp;quot;/&amp;gt;.
		/// &amp;lt;/summary&amp;gt;
		/// &amp;lt;param name=&amp;quot;trader&amp;quot;&amp;gt;Торговый шлюз, у которого используется событие &amp;lt;see cref=&amp;quot;ITrader.NewTrades&amp;quot;/&amp;gt;.&amp;lt;/param&amp;gt;
		public ParallelTraderCandleSource(ITrader trader)
			: this(trader, TimeSpan.FromMilliseconds(300))
		{
		}

		/// &amp;lt;summary&amp;gt;
		/// Создать &amp;lt;see cref=&amp;quot;ParallelTraderCandleSource&amp;quot;/&amp;gt;.
		/// &amp;lt;/summary&amp;gt;
		/// &amp;lt;param name=&amp;quot;trader&amp;quot;&amp;gt;Торговый шлюз, у которого используется событие &amp;lt;see cref=&amp;quot;ITrader.NewTrades&amp;quot;/&amp;gt;.&amp;lt;/param&amp;gt;
		/// &amp;lt;param name=&amp;quot;interval&amp;quot;&amp;gt;Интервал отправки новых сделок.&amp;lt;/param&amp;gt;
		public ParallelTraderCandleSource(ITrader trader, TimeSpan interval)
			: base(trader, int.MaxValue, int.MaxValue)
		{
			if (trader == null)
				throw new ArgumentNullException(&amp;quot;trader&amp;quot;);

			_timer = interval.CreateTimer(OnProcessTrades);
		}

		/// &amp;lt;summary&amp;gt;
		/// Обработчик события &amp;lt;see cref=&amp;quot;ITrader.NewTrades&amp;quot;/&amp;gt;.
		/// &amp;lt;/summary&amp;gt;
		/// &amp;lt;param name=&amp;quot;trades&amp;quot;&amp;gt;Новые сделки.&amp;lt;/param&amp;gt;
		protected override void OnNewTrades(IEnumerable&amp;lt;Trade&amp;gt; trades)
		{
			base.OnNewTrades(trades);

			_newTrades.AddRange(trades);
		}

		private void OnProcessTrades()
		{
			if (_isInProcess)
				return;

			_isInProcess = true;

			try
			{
				var newTrades = _newTrades.SyncGet(c =&amp;gt;
				{
					var retVal = c.ToArray();
					c.Clear();
					return retVal;
				});

				if (newTrades.Length &amp;gt; 0)
					base.RaiseNewTrades(newTrades);
			}
			finally
			{
				_isInProcess = false;
			}
		}

		/// &amp;lt;summary&amp;gt;
		/// Освободить занятые ресурсы.
		/// &amp;lt;/summary&amp;gt;
		protected override void DisposeManaged()
		{
			_timer.Dispose();
			base.DisposeManaged();
		}
	}

	/// &amp;lt;summary&amp;gt;
	/// Источник тиковых сделок для &amp;lt;see cref=&amp;quot;CandleManager&amp;quot;/&amp;gt;, получаемых через событие &amp;lt;see cref=&amp;quot;ITrader.NewTrades&amp;quot;/&amp;gt;,
	/// и хранящий последние полученные сделки за определенный период.
	/// &amp;lt;/summary&amp;gt;
	public class SyncTraderCandleSource : TraderCandleSource
	{
		/// &amp;lt;summary&amp;gt;
		/// Создать &amp;lt;see cref=&amp;quot;SyncTraderCandleSource&amp;quot;/&amp;gt;.
		/// &amp;lt;/summary&amp;gt;
		/// &amp;lt;param name=&amp;quot;trader&amp;quot;&amp;gt;Торговый шлюз, у которого используется событие &amp;lt;see cref=&amp;quot;ITrader.NewTrades&amp;quot;/&amp;gt;.&amp;lt;/param&amp;gt;
		public SyncTraderCandleSource(ITrader trader)
			: this(trader, 100000, 1000)
		{
		}

		/// &amp;lt;summary&amp;gt;
		/// Создать &amp;lt;see cref=&amp;quot;SyncTraderCandleSource&amp;quot;/&amp;gt;.
		/// &amp;lt;/summary&amp;gt;
		/// &amp;lt;param name=&amp;quot;trader&amp;quot;&amp;gt;Торговый шлюз, у которого используется событие &amp;lt;see cref=&amp;quot;ITrader.NewTrades&amp;quot;/&amp;gt;.&amp;lt;/param&amp;gt;
		/// &amp;lt;param name=&amp;quot;maxTradeCount&amp;quot;&amp;gt;Максимальное количество сделок, которые нужно хранить.&amp;lt;/param&amp;gt;
		/// &amp;lt;param name=&amp;quot;maxCandleCount&amp;quot;&amp;gt;Максимальное количество свечек, которые нужно хранить.&amp;lt;/param&amp;gt;
		public SyncTraderCandleSource(ITrader trader, int maxTradeCount, int maxCandleCount)
			: base(trader, maxTradeCount, maxCandleCount)
		{
		}

		/// &amp;lt;summary&amp;gt;
		/// Обработчик события &amp;lt;see cref=&amp;quot;ITrader.NewTrades&amp;quot;/&amp;gt;.
		/// &amp;lt;/summary&amp;gt;
		/// &amp;lt;param name=&amp;quot;trades&amp;quot;&amp;gt;Новые сделки.&amp;lt;/param&amp;gt;
		protected override void OnNewTrades(IEnumerable&amp;lt;Trade&amp;gt; trades)
		{
			base.OnNewTrades(trades);
			base.RaiseNewTrades(trades);
		}
	}
}

&lt;/code&gt;&lt;/pre&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/7906/</id>
    <title type="text">А можете релизацию этого интерфейса в объекте trader показать? Пусть даже сильно обрезанную. Чтобы в...</title>
    <published>2011-05-05T12:33:10Z</published>
    <updated>2011-05-05T12:33:10Z</updated>
    <author>
      <name>Дмитрий</name>
      <uri>https://stocksharp.com/users/28183/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;p&gt;А можете релизацию этого интерфейса в объекте trader показать? Пусть даже сильно обрезанную. Чтобы все методы и событие интерфейса были описаны.
Честно говоря, из этого кода по-прежнему не ясно, что делать.&lt;/p&gt;
&lt;p&gt;Я правильно понял, что мой класс будет забирать данные из массива, и класть их в MySource.Trades именно в методе AddTrades? И какая специфика есть в SafeInvoke? Что-то с многопоточностью связанное?&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/7904/</id>
    <title type="text">Дмитрий: Мне надо на график выводить данные из массива (не из объекта trader). В примерах есть что-т...</title>
    <published>2011-05-05T11:30:06Z</published>
    <updated>2011-05-05T11:30:06Z</updated>
    <author>
      <name>Mikhail Sukhov</name>
      <uri>https://stocksharp.com/users/201/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(7903)" rel="nofollow" target="_blank"&gt;Дмитрий&lt;/a&gt;:&lt;/strong&gt;
Мне надо на график выводить данные из  массива (не из объекта trader).
В примерах есть что-то подобное?
Я не совсем понимаю, как реализовать методы addTrade и getTrades. Да и с событием не совсем понятно ) Как его фаерить, если у меня массив на входе?&lt;/p&gt;
&lt;p&gt;Может у Вас были похожие задачи, где этот интерфес реализовывался для каких-то целей? Кусок кода бы...&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Как-то так:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;class MySource : ICandleSource
{
   public void AddTrades(Trade[] array)
   {
      /* нужно куда то сохранить для ICandleSource.Trades */
      NewTrades.SafeInvoke(array);
   }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;и из кода соответственно вызывать метод AddTrades&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/7903/</id>
    <title type="text">Мне надо на график выводить данные из массива (не из объекта trader). В примерах есть что-то подобно...</title>
    <published>2011-05-05T09:42:00Z</published>
    <updated>2011-05-05T09:42:00Z</updated>
    <author>
      <name>Дмитрий</name>
      <uri>https://stocksharp.com/users/28183/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;p&gt;Мне надо на график выводить данные из  массива (не из объекта trader).
В примерах есть что-то подобное?
Я не совсем понимаю, как реализовать методы addTrade и getTrades. Да и с событием не совсем понятно ) Как его фаерить, если у меня массив на входе?&lt;/p&gt;
&lt;p&gt;Может у Вас были похожие задачи, где этот интерфес реализовывался для каких-то целей? Кусок кода бы...&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/7890/</id>
    <title type="text">Дмитрий: Доброе время суток. Можете показать пример реализации интерфейса ICandleSource? Посмотрите ...</title>
    <published>2011-05-04T19:08:26Z</published>
    <updated>2011-05-04T19:08:26Z</updated>
    <author>
      <name>Mikhail Sukhov</name>
      <uri>https://stocksharp.com/users/201/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(7824)" rel="nofollow" target="_blank"&gt;Дмитрий&lt;/a&gt;:&lt;/strong&gt;
Доброе время суток. Можете показать пример реализации интерфейса ICandleSource?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Посмотрите те, что идут стандартно в S#. Какое поведение хотите добиться?&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/7824/</id>
    <title type="text">Доброе время суток. Можете показать пример реализации интерфейса ICandleSource? </title>
    <published>2011-05-02T12:47:52Z</published>
    <updated>2011-05-02T12:47:52Z</updated>
    <author>
      <name>Дмитрий</name>
      <uri>https://stocksharp.com/users/28183/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;p&gt;Доброе время суток. Можете показать пример реализации интерфейса ICandleSource?&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
</feed>