﻿<?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">Создание роботов с помощью S#. Часть 3. Реализация интерфейсов</title>
  <id>~/topic/357/sozdanie-robotov-s-pomoshshyu-s_-chast-3_-realizatsiya-interfeisov/</id>
  <rights type="text">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  <updated>2026-04-07T18:31:24Z</updated>
  <logo>https://stocksharp.ru/images/logo.png</logo>
  <link href="https://stocksharp.ru/handlers/atom.ashx?category=topic&amp;id=357" rel="self" type="application/rss+xml" />
  <entry>
    <id>https://stocksharp.ru/posts/m/23155/</id>
    <title type="text"> public override LogLevels LogLevel { get { return LogLevels.Debug; } set { } } по вкусу :) Если это...</title>
    <published>2012-12-21T14:28:26Z</published>
    <updated>2012-12-21T14:44:00Z</updated>
    <author>
      <name>Геннадий Ванин (Gennady Vanin)</name>
      <uri>https://stocksharp.ru/users/6413/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;VassilSanych &lt;a href="https://stocksharp.ru/posts/m/23154/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;
public override LogLevels LogLevel
{
	get { return LogLevels.Debug; }
	set { }
} &lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt; &lt;br /&gt;по вкусу :)&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Если этого альтруиста не забанить, то, тогда, прийдётся менять бизнес-модель с бесплатного коммерческого продукта на платный некоммерческий продукт&lt;br /&gt;&lt;br /&gt;Т.е., вместо того, чтобы пытаться продавать техподдержку и обучение того, чем нельзя пользоватьсяновичкам (и, соответственно, не находит широкого использования) на продажу небесплатного продукта с бесплатной техподдержкой-обучением-раскруткой , которым все легко пользуются и с более широким вовлечением волонтеров-разработчиков.&lt;br /&gt;&lt;br /&gt;VassilSanych - коварный и лукавый волонтёр-разработчик, который хочет &lt;b&gt;бесплатно&lt;/b&gt; поучаствовать в развитии проекта StockSharp, поломав давно установившийся и отлаженный статус-кво!</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/23154/</id>
    <title type="text">Смотрю, многие, в том числе и я, пользовались приведённым кодом, как основой. У многих в цитируемом ...</title>
    <published>2012-12-21T13:00:54Z</published>
    <updated>2012-12-21T13:00:54Z</updated>
    <author>
      <name>VassilSanych</name>
      <uri>https://stocksharp.ru/users/6491/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">Смотрю, многие, в том числе и я, пользовались приведённым кодом, как основой. У многих в цитируемом тексте присутствует WriteLog :) &lt;br /&gt;Небольшое замечание: для подключения источника логирования не нужно реализовывать ILogSource.&lt;br /&gt;Достаточно унаследоваться от BaseLogReceiver&amp;lt;ВашКласс&amp;gt; и тогда можно замечательно использовать метод AddLog, и методы предоставляемые для него классом LoggingHelper: AddErrorLog, AddInfoLog и т.п.&lt;br /&gt;Правда для полного логирования необходимо добавить ещё&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;
public override LogLevels LogLevel
{
	get { return LogLevels.Debug; }
	set { }
} &lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt; &lt;br /&gt;по вкусу :)</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/135/</id>
    <title type="text">Теперь приступим к реализации интерфейсов из 2 части статьи “Создание роботов с помощью S#. Часть 2....</title>
    <published>2012-03-18T21:58:56Z</published>
    <updated>2012-12-17T15:06:55Z</updated>
    <author>
      <name>FinDirector</name>
      <uri>https://stocksharp.ru/users/473/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">Теперь приступим к реализации интерфейсов из 2 части статьи “Создание роботов с помощью S#. Часть 2. Базовый класс для всех стратегий”. Здесь западные специалисты рекомендуют вначале реализовывать тестовые версии интерфейсов. И писать сразу UNIT-тесты. Смотрите пример SampleEmulationTesting из библиотеки S#. Но ведь программист — это высшая форма существования разума во Вселенной, и поэтому, в принципе не может ошибаться. Сразу в бой!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;QuikTraderBuilder&lt;/b&gt;&lt;br /&gt;Реализуем создание торговой системы Quik. Основной метод:&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;
public ITrader BuildTrader()&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Нужно учитывать, что метод могут одновременно вызвать из разных потоков и создавать только 1 Quik.&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;
	public sealed class QuikTraderBuilder : ITraderBuilder, ILogSource
	{
		private object lockObject = new object();
		private Task task;
		private bool isConnected;

		public string Path { get; set; }
		public string Login { get; set; }
		public string Password { get; set; }

		public string DdeServer { get; set; }
		public string DllName { get; set; }

		private string title;
		public string Title
		{
			get { return title ?? Login; }
			set { title = value; }
		}

		public ITrader Trader { get; private set; }
		public ICandleManager CandleManager { get; private set; }
		public event Action IsConnectedChanged;

		public ITrader BuildTrader()
		{
			lock (lockObject)
			{
				if (task == null)
					task = Task.Factory.StartNew(CreateTrader);
			}
			task.Wait();
			return Trader;
		}

		private void CreateTrader()
		{
			QuikTerminal terminal = RunTerminalInternal();
			QuikTrader quikTrader;
			WriteLog(ErrorTypes.None, &amp;quot;Создаем шлюз взаимодействия с системой Quik.&amp;quot;);
			if (!string.IsNullOrEmpty(DdeServer))
			{
				if (!string.IsNullOrEmpty(DllName))
					quikTrader = new QuikTrader(terminal.DirectoryName, DdeServer, DllName);
				else
					quikTrader = new QuikTrader(terminal.DirectoryName, DdeServer);
			}
			else
			{
				quikTrader = new QuikTrader(terminal.DirectoryName);
			}
			quikTrader.SecuritiesTable.Columns.Add(DdeSecurityColumns.MarginBuy);
			quikTrader.SecuritiesTable.Columns.Add(DdeSecurityColumns.MinPrice);
			quikTrader.SecuritiesTable.Columns.Add(DdeSecurityColumns.MaxPrice);
			quikTrader.ReConnectionSettings.Interval = TimeSpan.FromSeconds(10);
			quikTrader.ReConnectionSettings.WorkingTime = Exchange.Rts.WorkingTime;

			quikTrader.Connected += () =&amp;gt;
			{
				UpdateIsConnected(null);
				if (!quikTrader.IsExportRunning)
				{
					WriteLog(ErrorTypes.None, &amp;quot;Запускаем экспорт данных.&amp;quot;);
					quikTrader.StartExport();
					Verify(quikTrader.Terminal);
				}
			};
			quikTrader.ConnectionError += ex =&amp;gt; UpdateIsConnected(ex);
			quikTrader.Disconnected += () =&amp;gt; UpdateIsConnected(null);

			Trader = quikTrader;
			CandleManager = new CandleManager(quikTrader);

			WriteLog(ErrorTypes.None, &amp;quot;Производим подключение.&amp;quot;);
			quikTrader.Connect();
		}

		private void UpdateIsConnected(Exception ex)
		{
			var trader = Trader;
			bool isConnectedNew = trader != null &amp;amp;&amp;amp; trader.IsConnected;
			if (isConnected != isConnectedNew)
			{
				isConnected = isConnectedNew;
				WriteLog(ErrorTypes.None, isConnectedNew ? &amp;quot;Соединение подключено.&amp;quot; : &amp;quot;Соединение отключено.&amp;quot;);
				RaiseIsConnectedChanged();
				if (ex != null) WriteLog(ErrorTypes.Error, ex.Message);
			}
		}

		private void RaiseIsConnectedChanged()
		{
			var handler = IsConnectedChanged;
			if (handler != null) handler();
		}

		public void RunTerminal()
		{
			RunTerminalInternal();
		}

		private QuikTerminal RunTerminalInternal()
		{
			QuikTerminal terminal = QuikTerminal.Get(Path);
			if (!terminal.IsLaunched)
				terminal.Launch();
			if (!terminal.IsConnected)
				terminal.Login(Login, Password);
			return terminal;
		}

		private void Verify(QuikTerminal terminal)
		{
			var errors = terminal.GetTableSettings();
			foreach (var error in errors)
			{
				string message = string.Format(&amp;quot;Таблица {0}. {1}&amp;quot;, error.Table.Caption, error.Error.Message);
				WriteLog(ErrorTypes.Warning, message);
			}
		}

		public void Dispose()
		{
			if (task != null)
				task.Dispose();
			if (CandleManager != null)
				CandleManager.Dispose();
			if (Trader != null)
				Trader.Dispose();
		}

		#region ILogSource
		public Ecng.Collections.INotifyList&amp;lt;ILogSource&amp;gt; Childs
		{
			get { return null; }
		}

		private Guid id = Guid.NewGuid();
		public Guid Id
		{
			get { return id; }
		}

		public event Action&amp;lt;LogMessage&amp;gt; Log;

		public string Name
		{
			get { return Title; }
		}

		public ILogSource Parent
		{
			get { return null; }
		}

		private void RaiseLog(LogMessage logMessage)
		{
			var handler = Log;
			if (handler != null)
				handler(logMessage);
		}

		private void WriteLog(ErrorTypes errorType, string message)
		{
			LogMessage logMessage = new LogMessage(this, DateTime.Now, errorType, message);
			RaiseLog(logMessage);
		}
		#endregion
	}&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Создание других торговых систем оставим читателю в качестве домашнего задания.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;PortfolioSelector&lt;/b&gt;&lt;br /&gt;Реализуем получение портфеля по его имени. Основной момент: ждем, когда будет инициализирована сумма на счете, т.к. она нужна для определения размера позиции.&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;
	public class PortfolioSelector : IPortfolioSelector
	{
		private string title;
		public string Title
		{
			get { return title ?? PortfolioName; }
			set { title = value; }
		}

		public string PortfolioName { get; set; }

		public Portfolio GetPortfolio(ITrader trader)
		{
			Portfolio result = FindPortfolio(trader);
			if (result != null)
				return result;
			ManualResetEvent manualResetEvent = new ManualResetEvent(false);
			Action&amp;lt;IEnumerable&amp;lt;Portfolio&amp;gt;&amp;gt; onPortfoliosChanged = p =&amp;gt;
			{
				if (FindPortfolio(trader) != null)
					manualResetEvent.Set();
			};
			trader.NewPortfolios += onPortfoliosChanged;
			trader.PortfoliosChanged += onPortfoliosChanged;
			manualResetEvent.WaitOne(TimeSpan.FromSeconds(30));
			trader.NewPortfolios -= onPortfoliosChanged;
			trader.PortfoliosChanged -= onPortfoliosChanged;
			result = FindPortfolio(trader);
			return result;
		}

		private Portfolio FindPortfolio(ITrader trader)
		{
			return trader.Portfolios.FirstOrDefault(p =&amp;gt; p.Name == PortfolioName &amp;amp;&amp;amp; p.BeginAmount.Value != 0);
		}
	}&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;SecuritySelector&lt;/b&gt;&lt;br /&gt;Поиск инструмента по его коду. Реализация аналогична PortfolioSelector.&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;
	public class SecuritySelector : ISecuritySelector
	{
		private string title;
		public string Title
		{
			get { return title ?? SecurityCode; }
			set { title = value; }
		}

		public string SecurityCode { get; set; }

		public Security GetSecurity(ITrader trader)
		{
			Security result = FindSecurity(trader);
			if (result != null)
				return result;
			ManualResetEvent manualResetEvent = new ManualResetEvent(false);
			Action&amp;lt;IEnumerable&amp;lt;Security&amp;gt;&amp;gt; onNewSecurities = s =&amp;gt;
			{
				if (FindSecurity(trader) != null)
					manualResetEvent.Set();
			};
			trader.NewSecurities += onNewSecurities;
			manualResetEvent.WaitOne(TimeSpan.FromSeconds(30));
			trader.NewSecurities -= onNewSecurities;
			result = FindSecurity(trader);
			return result;
		}

		private Security FindSecurity(ITrader trader)
		{
			return trader.Securities.FirstOrDefault(s =&amp;gt; s.Code == SecurityCode);
		}
	}&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;MarginVolumeSizer&lt;/b&gt;&lt;br /&gt;Определение размера позиции по лимиту открытых позиций и гарантийному обеспечению.&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;
	public class MarginVolumeSizer : IVolumeSizer
	{
		public double Ratio { get; set; }
		public decimal MaxCapital { get; set; }

		public MarginVolumeSizer()
		{
			MaxCapital = decimal.MaxValue;
		}

		public int GetVolume(Portfolio portfolio, Security security)
		{
			decimal capital = Math.Min(portfolio.BeginAmount.Value, MaxCapital);
			int quantity = (int)(capital * (decimal)Ratio / security.MarginBuy);
			return quantity;
		}
	}&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;RegistrySettingsProvider&lt;/b&gt;&lt;br /&gt;Чтение и запись состояния стратегии из реестра.&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;
	public class RegistrySettingsProvider : ISettingsProvider
	{
		public string SubKey { get; set; }

		public RegistrySettingsProvider()
		{
			SubKey = @&amp;quot;Software\FinDirector&amp;quot;;
		}

		public string ReadSetting(string name)
		{
			using (RegistryKey registryKey = Registry.CurrentUser.CreateSubKey(SubKey))
			{
				return (string)registryKey.GetValue(name);
			}
		}

		public void WriteSetting(string name, string value)
		{
			using (RegistryKey registryKey = Registry.CurrentUser.CreateSubKey(SubKey))
			{
				registryKey.SetValue(name, value);
			}
		}
	}&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;FinamHistoryCandleProvider&lt;/b&gt;&lt;br /&gt;Получение исторических свечей с сайта финама. Реализацию не выкладываю, т.к. много кода.&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;
	public class FinamHistoryCandleProvider : IHistoryCandleProvider
	{
		public int FinamSecurityCode { get; set; }
		public TimeSpan TimeFrame { get; set; }

		public FinamHistoryCandleProvider()
		{
			FinamSecurityCode = 17455;
			TimeFrame = TimeSpan.FromHours(1);
		}

		public List&amp;lt;TimeFrameCandle&amp;gt; GetHistoryCandles(DateTime beginDate, DateTime endDate)
		{
			…
}&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:120%"&gt;&lt;div align="right"&gt;&lt;b&gt;Автор статьи — Вадим Чижов&lt;/b&gt;&lt;/div&gt;&lt;/span&gt;</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/22770/</id>
    <title type="text">Даже не знаю в чем точто была проблема но все заработало. FinDirector, с вашего позволения могу выло...</title>
    <published>2012-12-02T15:01:37Z</published>
    <updated>2012-12-02T15:01:37Z</updated>
    <author>
      <name>serebryakov_a</name>
      <uri>https://stocksharp.ru/users/28627/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Serg &lt;a href="https://stocksharp.ru/posts/m/21560/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;Даже не знаю в чем точто была проблема но все заработало. &lt;br /&gt;&lt;b&gt;FinDirector&lt;/b&gt;, с вашего позволения могу выложить проект-шаблон целиком.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Добрый день! Попытался реализовать описанный выше каркас - появились ошибки реализации  интерфейсов(ITraderBuilder, ILogSource). версия библиотеки 4.1.6. Можете ли вы поделиться реализацией проекта-шаблона или подсказать в чем там были траблы? </content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/22705/</id>
    <title type="text"> FinamSecurityCode = 17455; Пока, я просто выбираю руками нужный инструмент и слушаю tcpmon&amp;apos;ом запро...</title>
    <published>2012-11-28T13:51:18Z</published>
    <updated>2012-11-28T13:51:18Z</updated>
    <author>
      <name>Den</name>
      <uri>https://stocksharp.ru/users/6003/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;FinDirector &lt;a href="https://stocksharp.ru/posts/m/22618/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;&lt;div class="code"&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;

			FinamSecurityCode = 17455;
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Пока, я просто выбираю руками нужный инструмент и слушаю tcpmon&amp;#39;ом запрос браузра и оттуда достаю код.&lt;br /&gt;&lt;br /&gt;Подскажите, пожалуйста, как получить список всех доступных кодов инструментов?&lt;br /&gt;</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/22625/</id>
    <title type="text">Огромное спасибо! </title>
    <published>2012-11-21T18:19:19Z</published>
    <updated>2012-11-21T18:19:19Z</updated>
    <author>
      <name>Gunn7</name>
      <uri>https://stocksharp.ru/users/27628/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">Огромное спасибо! </content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/22618/</id>
    <title type="text"> using System; using System.Collections.Generic; using System.ComponentModel; using System.Globaliza...</title>
    <published>2012-11-20T12:41:24Z</published>
    <updated>2012-11-20T12:41:24Z</updated>
    <author>
      <name>FinDirector</name>
      <uri>https://stocksharp.ru/users/473/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&lt;div class="code"&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Globalization;
using System.IO;
using System.Net;
using FinDirector.Infrastructure;

namespace FinDirector.Modules.SharedServices
{
	public class FinamHistoryCandleProvider : IHistoryCandleProvider
	{
		public int FinamSecurityCode { get; set; }

		[Description(&amp;quot;Таймфрейм.&amp;quot;)]
		public TimeSpan TimeFrame { get; set; }

		public FinamHistoryCandleProvider()
		{
			FinamSecurityCode = 17455;
			TimeFrame = TimeSpan.FromHours(1);
		}

		public IList&amp;lt;Candle&amp;gt; GetHistoryCandles(DateTime beginDate, DateTime endDate)
		{
			string uri = GetInstrumentUrl(beginDate, endDate);
			WebRequest request = WebRequest.Create(uri);
			using (StreamReader sr = new StreamReader(request.GetResponse().GetResponseStream()))
			{
				IList&amp;lt;Candle&amp;gt; result = new CandleReader().ReadCandles(sr);
				return result;
			}
		}

		private int GetPeriodCode()
		{
			int period = 3;
			if (TimeFrame == TimeSpan.FromMinutes(5))
				period = 3;
			else if (TimeFrame == TimeSpan.FromHours(1))
				period = 7;
			else if (TimeFrame == TimeSpan.FromDays(1))
				period = 8;
			return period;
		}

		private string GetInstrumentUrl(DateTime beginDate, DateTime endDate)
		{
			int period = GetPeriodCode();

			string Ticker = &amp;quot;data&amp;quot;;
			string fileName = Ticker + &amp;quot;.txt&amp;quot;;
			string url = string.Format(CultureInfo.InvariantCulture,
				&amp;quot;http://195.128.78.52/{0}?d=d&amp;amp;market=14&amp;amp;em={8}&amp;amp;df={2}&amp;amp;mf={3}&amp;amp;yf={4}&amp;amp;dt={5}&amp;amp;mt={6}&amp;amp;yt={7}&amp;amp;p={9}&amp;amp;f={0}&amp;amp;e=.txt&amp;amp;cn={1}&amp;amp;dtf=1&amp;amp;tmf=1&amp;amp;MSOR=0&amp;amp;sep=1&amp;amp;sep2=1&amp;amp;datf=1&amp;amp;at=1&amp;quot;,
				fileName, Ticker,
				beginDate.Day, beginDate.Month - 1, beginDate.Year,
				endDate.Day, endDate.Month - 1, endDate.Year,
				FinamSecurityCode, period);
			return url;
		}
	}
}

	class CandleReader
	{
		private bool SkipFirstLine = true;
		private char Separator = &amp;#39;,&amp;#39;;

		public IList&amp;lt;Candle&amp;gt; ReadCandles(StreamReader sr)
		{
			List&amp;lt;Candle&amp;gt; result = new List&amp;lt;Candle&amp;gt;();
			if (SkipFirstLine)
			{
				sr.ReadLine();
			}
			while (!sr.EndOfStream)
			{
				string line = sr.ReadLine();
				string[] values = line.Split(new char[] { Separator });
				Candle candle = ReadCandle(values);
				result.Add(candle);
			}
			return result;
		}

		private Candle ReadCandle(string[] line)
		{
			int dateIndex = 2;
			int timeIndex = 3;
			int openIndex = 4;
			int highIndex = 5;
			int lowIndex = 6;
			int closeIndex = 7;

			int date = Int32.Parse(line[dateIndex], CultureInfo.InvariantCulture);
			int time = Int32.Parse(line[timeIndex], CultureInfo.InvariantCulture);

			var result = new Candle()
			{
				DateTime = new DateTime(date / 10000, (date / 100) % 100, date % 100,
					time / 10000, (time / 100) % 100, 0),
				OpenPrice = double.Parse(line[openIndex], CultureInfo.InvariantCulture),
				ClosePrice = double.Parse(line[closeIndex], CultureInfo.InvariantCulture),
				HighPrice = double.Parse(line[highIndex], CultureInfo.InvariantCulture),
				LowPrice = double.Parse(line[lowIndex], CultureInfo.InvariantCulture)
			};

			return result;
		}
	}

&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.ru/posts/m/22008/</id>
    <title type="text">Присоединяюсь к serq, спасибо за статьи. Может все же выложите реализацию получения свечей с финама....</title>
    <published>2012-10-24T20:09:44Z</published>
    <updated>2012-10-24T20:09:44Z</updated>
    <author>
      <name>Gunn7</name>
      <uri>https://stocksharp.ru/users/27628/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">Присоединяюсь к serq, спасибо за статьи.&lt;br /&gt;Может все же выложите реализацию получения свечей с финама. Повис на этом уже который день...&lt;br /&gt;&lt;br /&gt;</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/21560/</id>
    <title type="text">Даже не знаю в чем точто была проблема но все заработало. FinDirector, с вашего позволения могу выло...</title>
    <published>2012-09-27T13:53:42Z</published>
    <updated>2012-09-27T13:53:42Z</updated>
    <author>
      <name>Serg</name>
      <uri>https://stocksharp.ru/users/484/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">Даже не знаю в чем точто была проблема но все заработало. &lt;br /&gt;&lt;b&gt;FinDirector&lt;/b&gt;, с вашего позволения могу выложить проект-шаблон целиком.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/21552/</id>
    <title type="text">Тоже использую 4.0.23. Все работает. Могу только посоветовать создать новый пустой проект и наладить...</title>
    <published>2012-09-27T11:04:35Z</published>
    <updated>2012-09-27T11:04:35Z</updated>
    <author>
      <name>FinDirector</name>
      <uri>https://stocksharp.ru/users/473/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">Тоже использую 4.0.23. Все работает. Могу только посоветовать создать новый пустой проект и наладить в нем логи, и в уже имеющемся проекте отключить логи. Тогда и разберетесь, что именно и почему не работает.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/21549/</id>
    <title type="text">LogManager.Listeners.Add(new GuiLogListener(_monitor)); Да я вроде так и делаю но почемуто все вообщ...</title>
    <published>2012-09-27T09:20:20Z</published>
    <updated>2012-09-27T09:42:01Z</updated>
    <author>
      <name>Serg</name>
      <uri>https://stocksharp.ru/users/484/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;FinDirector &lt;a href="https://stocksharp.ru/posts/m/21540/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;&lt;div class="code"&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;
LogManager.Listeners.Add(new GuiLogListener(_monitor));&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Да я вроде так и делаю но почемуто все вообще виснет. Может проблема в версии 4.0.23? Вы какую версию используете? &lt;br /&gt;&lt;br /&gt;ps: да и в логфайл сообщения от трейдера также не попадают( Мне кажется что гуи синхронизация здесь непричем. Скорее проблема с реализацией ILogSourse. Хотя могу только догадыватся так как не профи)&lt;br /&gt;FinDirector, подскажите, у вас то все работает или всетаки чтото меняли после публикации своих статей?</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/21540/</id>
    <title type="text">LogManager.Listeners.Add(new GuiLogListener(_monitor));</title>
    <published>2012-09-27T06:02:29Z</published>
    <updated>2012-09-27T06:02:29Z</updated>
    <author>
      <name>FinDirector</name>
      <uri>https://stocksharp.ru/users/473/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&lt;div class="code"&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;
LogManager.Listeners.Add(new GuiLogListener(_monitor));&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.ru/posts/m/21534/</id>
    <title type="text">Спасибо за статьи) Пытаюсь разбираться. Завис на реализации QuikTraderBuilder. Никак не разберусь по...</title>
    <published>2012-09-26T21:19:25Z</published>
    <updated>2012-09-26T21:19:58Z</updated>
    <author>
      <name>Serg</name>
      <uri>https://stocksharp.ru/users/484/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">Спасибо за статьи) &lt;br /&gt;Пытаюсь разбираться. Завис на реализации QuikTraderBuilder. Никак не разберусь почему монитор не получает сообщения от QuikTraderBuilder, видимо что-то с реализацией ILogSource.&lt;br /&gt;  &lt;div class="code"&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;
private void RaiseLog(LogMessage logMessage)
  {
    var handler = Log;
    if (handler != null)
      handler(logMessage);   &amp;lt;&amp;lt;-- здесь возникает ошибка Current thread is not a GUI.
  }&lt;/pre&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>
</feed>