Создание роботов с помощью S#. Часть 2. Базовый класс для всех стратегий

Создание роботов с помощью S#. Часть 2. Базовый класс для всех стратегий
Atom
19.03.2012
FinDirector


Все наши стратегии будем наследовать от класса StandardStrategy. Зачем он нужен? Дело в том, что все стратегии часто должны уметь делать одни и теже вещи: брать откуда-то торговую систему, портфель, инструмент, исторические свечки, хранить состояние, устанавливать размер позиции. Чтобы не решать каждый раз эти проблемы, можно сделать так:
Код
	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();
		}
	}


ITraderBuilder будет уметь волшебным образом создавать торговую систему:
Код
	public interface ITraderBuilder : IDisposable
	{
		string Title { get; }
		ITrader Trader { get; }
		ICandleManager CandleManager { get; }
		void RunTerminal();
		ITrader BuildTrader();
		event Action IsConnectedChanged;
	}


IPortfolioSelector будет находить портфель:

Код
	public interface IPortfolioSelector
	{
		string Title { get; }
		Portfolio GetPortfolio(ITrader trader);
	}

ISecuritySelector находить инструмент:

Код
	public interface ISecuritySelector
	{
		string Title { get; }
		Security GetSecurity(ITrader trader);
	}


IVolumeSizer расчитывать размер позиции:
Код
	public interface IVolumeSizer
	{
		int GetVolume(Portfolio portfolio, Security security);
	}

IHistoryCandleProvider получать исторические свечки:
Код
	public interface IHistoryCandleProvider
	{
		List<TimeFrameCandle> GetHistoryCandles(DateTime beginDate, DateTime endDate);
	}

ISettingsProvider хранить состояние стратегии:
Код
	public interface ISettingsProvider
	{
		string ReadSetting(string name);
		void WriteSetting(string name, string value);
	}


Представим, что у нас уже есть реалзации всех этих интерфесов (этим мы займемся позже). Как будет выглядить конкретная стратегия?
Код
	public class StrikeStrategy : StandardStrategy
	{
		public override string Description
		{
			get { return "Стратегия для ловли ударного дня"; }
		}

		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("Отсутствует трейдер {0}.", TraderBuilder.Title));
				strategyStartTime = Trader.MarketTime;

				Portfolio = PortfolioSelector.GetPortfolio(Trader);
				if (Portfolio == null)
					throw new ApplicationException(string.Format("Отсутствует портфель {0}.", PortfolioSelector.Title));

				Security = SecuritySelector.GetSecurity(Trader);
				if (this.Security == null)
					throw new ApplicationException(string.Format("Отсутствует инструмент {0}.", SecuritySelector.Title));
				Trader.RegisterQuotes(Security);

				if (VolumeSizer != null)
				{
					Volume = VolumeSizer.GetVolume(Portfolio, Security);
					this.AddInfoLog("Объем: {0}", 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<IEnumerable<Candle>>(OnCandlesFinished);
			}
			catch (ApplicationException ex)
			{
				this.AddErrorLog(ex.Message);
			}

			base.OnStarting();
		}

		void OnCandlesFinished(IEnumerable<Candle> newCandles)
		{
			foreach (Candle candle in newCandles)
			{
				OnCandleFinished(candle);
			}
		}

		void OnCandleFinished(Candle candle)
		{
			DateTime currentDate = candle.Time;

			if (candle.Time < strategyStartTime)
				return;

			...
		}
	}


Автор статьи — Вадим Чижов


VassilSanych

Фотография
Дата: 29.11.2012
Ответить


Ндааа... API уже совсем не тот.
Спасибо:

beemo

Фотография
Дата: 03.02.2013
Ответить


в версии 4.1.7 нет CandleToken! Чем его заменить?
Спасибо:

Moadip

Фотография
Дата: 03.02.2013
Ответить


Спасибо:

beemo

Фотография
Дата: 03.02.2013
Ответить


забил в гугл: site:http://stocksharp.com/doc/ candletoken

хм...ответ только на эту страницу

http://www.stocksharp.co...5-97e1-22829adcd025.htm

а вот в каком namespace это лежит не сказано.
поиск по reference в проекте тоже сказал что ничего нет.
Спасибо:

Moadip

Фотография
Дата: 03.02.2013
Ответить


А кто сказал что будет CandleToken? Его уже давно нет.
То что нашлось по CandleToken, это недосмотр, когда переделывалась дока. Будет исправлено.

В доке надо почитать раздел Свечки, и все его подразделы.

Поиск вернули. Можно им пользоваться, а не google.
Спасибо:

Den

Фотография
Дата: 03.02.2013
Ответить


Moadip
А кто сказал что будет CandleToken? Его уже давно нет.
То что нашлось по CandleToken, это недосмотр, когда переделывалась дока. Будет исправлено.
В доке надо почитать раздел Свечки, и все его подразделы.


В анонсе 4.1.7 сказано, что появилось тестирование на свечках.
Что имеется в виду и отражено ли это в доке?
Спасибо:

Moadip

Фотография
Дата: 03.02.2013
Ответить


В доке был изменен топик по тестированию На истории.
Переделан пример SampleHistoryTesting, для сравнительного теста на различных маркет-данных.

На текущий момент, это пример уже еще раз переделан. И дока не успевает за обновлениями.[biggrin]
Поэтому то что в доке, и в примере SampleHistoryTesting отличается, но не сильно.
Спасибо:

Den

Фотография
Дата: 03.02.2013
Ответить


Moadip

На текущий момент, это пример уже еще раз переделан. И дока не успевает за обновлениями.[biggrin]
Поэтому то что в доке, и в примере SampleHistoryTesting отличается, но не сильно.


Поясните, пожалуйста, на что влияет установка UseCandlesTimeFrame = emulationInfo.UseCandleTimeFrame
Чем это будет отличаться от тикового тестирования, по которому все равно генерятся 5m свечки?
Спасибо:

Moadip

Фотография
Дата: 03.02.2013
Ответить


Скоростью. Т.к. тестирование идет уже на готовых свечках а не на тиках.
Спасибо:


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy