﻿<?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">Создание роботов с помощью S#. Часть 2. Базовый класс для всех стратегий</title>
  <id>~/topic/358/sozdanie-robotov-s-pomoshshyu-s_-chast-2_-bazovyi-klass-dlya-vseh-strategii/</id>
  <rights type="text">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  <updated>2026-04-07T15:22:54Z</updated>
  <logo>https://stocksharp.com/images/logo.png</logo>
  <link href="https://stocksharp.com/handlers/atom.ashx?category=topic&amp;id=358" rel="self" type="application/rss+xml" />
  <entry>
    <id>https://stocksharp.com/posts/m/23731/</id>
    <title type="text">Тут</title>
    <published>2013-02-03T15:15:40Z</published>
    <updated>2016-08-16T00:11:27Z</updated>
    <author>
      <name>Moadip</name>
      <uri>https://stocksharp.com/users/5973/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;a href="http://stocksharp.com/posts/m/23728/" title="http://stocksharp.com/posts/m/23728/"&gt;Тут&lt;/a&gt;</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/23740/</id>
    <title type="text">Скоростью. Т.к. тестирование идет уже на готовых свечках а не на тиках.</title>
    <published>2013-02-03T19:12:49Z</published>
    <updated>2013-02-03T19:12:49Z</updated>
    <author>
      <name>Moadip</name>
      <uri>https://stocksharp.com/users/5973/</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/23738/</id>
    <title type="text"> На текущий момент, это пример уже еще раз переделан. И дока не успевает за обновлениями. Поэтому то...</title>
    <published>2013-02-03T19:00:48Z</published>
    <updated>2013-02-03T19:00:48Z</updated>
    <author>
      <name>Den</name>
      <uri>https://stocksharp.com/users/6003/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Moadip &lt;a href="https://stocksharp.com/posts/m/23737/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;&lt;br /&gt;На текущий момент, это пример уже еще раз переделан. И дока не успевает за обновлениями.[biggrin] &lt;br /&gt;Поэтому то что в доке, и в примере &lt;b&gt;SampleHistoryTesting&lt;/b&gt; отличается, но не сильно.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Поясните, пожалуйста, на что влияет установка &lt;b&gt;UseCandlesTimeFrame = emulationInfo.UseCandleTimeFrame&lt;/b&gt;&lt;br /&gt;Чем это будет отличаться от тикового тестирования, по которому все равно генерятся 5m свечки?</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/23737/</id>
    <title type="text">В доке был изменен топик по тестированию На истории. Переделан пример SampleHistoryTesting, для срав...</title>
    <published>2013-02-03T18:50:15Z</published>
    <updated>2013-02-03T18:50:15Z</updated>
    <author>
      <name>Moadip</name>
      <uri>https://stocksharp.com/users/5973/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">В доке был изменен топик по тестированию &lt;a href="http://stocksharp.com/doc/html/5b90a23e-24b9-474a-a699-da47b666194a.htm" title="http://stocksharp.com/doc/html/5b90a23e-24b9-474a-a699-da47b666194a.htm"&gt;На истории&lt;/a&gt;.&lt;br /&gt;Переделан пример &lt;b&gt;SampleHistoryTesting&lt;/b&gt;, для сравнительного теста на различных маркет-данных.&lt;br /&gt;&lt;br /&gt;На текущий момент, это пример уже еще раз переделан. И дока не успевает за обновлениями.[biggrin] &lt;br /&gt;Поэтому то что в доке, и в примере &lt;b&gt;SampleHistoryTesting&lt;/b&gt; отличается, но не сильно.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/23736/</id>
    <title type="text">А кто сказал что будет CandleToken? Его уже давно нет. То что нашлось по CandleToken, это недосмотр,...</title>
    <published>2013-02-03T18:40:55Z</published>
    <updated>2013-02-03T18:43:16Z</updated>
    <author>
      <name>Den</name>
      <uri>https://stocksharp.com/users/6003/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Moadip &lt;a href="https://stocksharp.com/posts/m/23735/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;А кто сказал что будет CandleToken? Его уже давно нет.&lt;br /&gt;То что нашлось по CandleToken, это недосмотр, когда переделывалась дока. Будет исправлено.&lt;br /&gt;В &lt;a href="http://stocksharp.com/doc/" title="http://stocksharp.com/doc/"&gt;доке&lt;/a&gt; надо почитать раздел &lt;a href="http://stocksharp.com/doc/html/cd52cfcf-938c-4fce-9a56-4e9a001f0792.htm" title="http://stocksharp.com/doc/html/cd52cfcf-938c-4fce-9a56-4e9a001f0792.htm"&gt;Свечки&lt;/a&gt;, и все его подразделы.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;В анонсе 4.1.7 сказано, что появилось тестирование на свечках.&lt;br /&gt;Что имеется в виду и отражено ли это в доке?</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/23735/</id>
    <title type="text">А кто сказал что будет CandleToken? Его уже давно нет. То что нашлось по CandleToken, это недосмотр,...</title>
    <published>2013-02-03T17:44:55Z</published>
    <updated>2013-02-03T17:44:55Z</updated>
    <author>
      <name>Moadip</name>
      <uri>https://stocksharp.com/users/5973/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">А кто сказал что будет CandleToken? Его уже давно нет.&lt;br /&gt;То что нашлось по CandleToken, это недосмотр, когда переделывалась дока. Будет исправлено.&lt;br /&gt;&lt;br /&gt;В &lt;a href="http://stocksharp.com/doc/" title="http://stocksharp.com/doc/"&gt;доке&lt;/a&gt; надо почитать раздел &lt;a href="http://stocksharp.com/doc/html/cd52cfcf-938c-4fce-9a56-4e9a001f0792.htm" title="http://stocksharp.com/doc/html/cd52cfcf-938c-4fce-9a56-4e9a001f0792.htm"&gt;Свечки&lt;/a&gt;, и все его подразделы.&lt;br /&gt;&lt;br /&gt;&lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAAB9IU5EfsQFXLuKkrNTufYd" title="http://"&gt;Поиск вернули&lt;/a&gt;. Можно им пользоваться, а не google.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/23733/</id>
    <title type="text">забил в гугл: site:http://stocksharp.com/doc/ candletoken хм...ответ только на эту страницу http://w...</title>
    <published>2013-02-03T17:29:17Z</published>
    <updated>2013-02-03T17:29:53Z</updated>
    <author>
      <name>beemo</name>
      <uri>https://stocksharp.com/users/26841/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">забил в гугл: site:http://stocksharp.com/doc/ candletoken&lt;br /&gt;&lt;br /&gt;хм...ответ только на эту страницу&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.stocksharp.com/doc/html/9d3b0442-0633-4ba5-97e1-22829adcd025.htm
" title="http://www.stocksharp.com/doc/html/9d3b0442-0633-4ba5-97e1-22829adcd025.htm
"&gt;http://www.stocksharp.co...5-97e1-22829adcd025.htm
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;а вот в каком namespace это лежит не сказано. &lt;br /&gt;поиск по reference в проекте тоже сказал что ничего нет.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/23725/</id>
    <title type="text">в версии 4.1.7 нет CandleToken! Чем его заменить?</title>
    <published>2013-02-03T12:52:35Z</published>
    <updated>2013-02-03T12:52:35Z</updated>
    <author>
      <name>beemo</name>
      <uri>https://stocksharp.com/users/26841/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">в версии 4.1.7 нет CandleToken! Чем его заменить?</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/134/</id>
    <title type="text">Все наши стратегии будем наследовать от класса StandardStrategy. Зачем он нужен? Дело в том, что все...</title>
    <published>2012-03-18T21:58:41Z</published>
    <updated>2012-12-17T15:07:01Z</updated>
    <author>
      <name>FinDirector</name>
      <uri>https://stocksharp.com/users/473/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Все наши стратегии будем наследовать от класса StandardStrategy. Зачем он нужен? Дело в том, что все стратегии часто должны уметь делать одни и теже вещи: брать откуда-то торговую систему, портфель, инструмент, исторические свечки, хранить состояние, устанавливать  размер позиции. Чтобы не решать каждый раз эти проблемы, можно сделать так:&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;
	public abstract class StandardStrategy : Strategy
	{
		public virtual string Description { get { return Name; } }
		public ITraderBuilder TraderBuilder { get; set; }
		public IPortfolioSelector PortfolioSelector { get; set; }
		public ISecuritySelector SecuritySelector { get; set; }
		public IVolumeSizer VolumeSizer { get; set; }
		public IHistoryCandleProvider HistoryCandleProvider { get; set; }
		public ISettingsProvider SettingsProvider { get; set; }
		public Unit PriceDelta { get; set; }

		protected StandardStrategy()
		{
			PriceDelta = 0.1.Percents();
		}
	}&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;ITraderBuilder будет  уметь волшебным образом создавать торговую систему:&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;
	public interface ITraderBuilder : IDisposable
	{
		string Title { get; }
		ITrader Trader { get; }
		ICandleManager CandleManager { get; }
		void RunTerminal();
		ITrader BuildTrader();
		event Action IsConnectedChanged;
	}&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;IPortfolioSelector будет находить портфель:&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;
	public interface IPortfolioSelector
	{
		string Title { get; }
		Portfolio GetPortfolio(ITrader trader);
	}&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;ISecuritySelector находить инструмент:&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;
	public interface ISecuritySelector
	{
		string Title { get; }
		Security GetSecurity(ITrader trader);
	}&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;IVolumeSizer расчитывать размер позиции:&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;
	public interface IVolumeSizer
	{
		int GetVolume(Portfolio portfolio, Security security);
	}&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;IHistoryCandleProvider получать исторические свечки:&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;
	public interface IHistoryCandleProvider
	{
		List&amp;lt;TimeFrameCandle&amp;gt; GetHistoryCandles(DateTime beginDate, DateTime endDate);
	}&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;ISettingsProvider хранить состояние стратегии:&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;
	public interface ISettingsProvider
	{
		string ReadSetting(string name);
		void WriteSetting(string name, string value);
	}&lt;/pre&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;
	public class StrikeStrategy : StandardStrategy
	{
		public override string Description
		{
			get { return &amp;quot;Стратегия для ловли ударного дня&amp;quot;; }
		}

		CandleToken candleToken;
		DateTime strategyStartTime;

		public TimeSpan TimeFrame { get; set; }

		public StrikeStrategy()
		{
			TimeFrame = TimeSpan.FromMinutes(5);
		}

		protected override void OnStarting()
		{
			try
			{
				Trader = TraderBuilder.BuildTrader();
				if (Trader == null)
					throw new ApplicationException(string.Format(&amp;quot;Отсутствует трейдер {0}.&amp;quot;, TraderBuilder.Title));
				strategyStartTime = Trader.MarketTime;

				Portfolio = PortfolioSelector.GetPortfolio(Trader);
				if (Portfolio == null)
					throw new ApplicationException(string.Format(&amp;quot;Отсутствует портфель {0}.&amp;quot;, PortfolioSelector.Title));

				Security = SecuritySelector.GetSecurity(Trader);
				if (this.Security == null)
					throw new ApplicationException(string.Format(&amp;quot;Отсутствует инструмент {0}.&amp;quot;, SecuritySelector.Title));
				Trader.RegisterQuotes(Security);

				if (VolumeSizer != null)
				{
					Volume = VolumeSizer.GetVolume(Portfolio, Security);
					this.AddInfoLog(&amp;quot;Объем: {0}&amp;quot;, Volume);
				}

				if (TraderBuilder.CandleManager.IsTimeFrameCandlesRegistered(Security, TimeFrame))
				{
					candleToken = TraderBuilder.CandleManager.GetToken(typeof(TimeFrameCandle), Security, TimeFrame);
				}
				else
				{
					candleToken = TraderBuilder.CandleManager.RegisterTimeFrameCandles(Security, TimeFrame);
				}

				this.When(candleToken.CandlesFinished())
					.Do&amp;lt;IEnumerable&amp;lt;Candle&amp;gt;&amp;gt;(OnCandlesFinished);
			}
			catch (ApplicationException ex)
			{
				this.AddErrorLog(ex.Message);
			}

			base.OnStarting();
		}

		void OnCandlesFinished(IEnumerable&amp;lt;Candle&amp;gt; newCandles)
		{
			foreach (Candle candle in newCandles)
			{
				OnCandleFinished(candle);
			}
		}

		void OnCandleFinished(Candle candle)
		{
			DateTime currentDate = candle.Time;

			if (candle.Time &amp;lt; strategyStartTime)
				return;

			...
		}
	}&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.com/posts/m/22720/</id>
    <title type="text">Ндааа... API уже совсем не тот.</title>
    <published>2012-11-29T15:33:09Z</published>
    <updated>2012-11-29T15:33:09Z</updated>
    <author>
      <name>VassilSanych</name>
      <uri>https://stocksharp.com/users/6491/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Ндааа... API уже совсем не тот.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
</feed>