← Zurück

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

Все наши стратегии будем наследовать от класса 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;

			...
		}
	}

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

War dieses Thema hilfreich?

Thema teilen

Kommentare (9)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

VassilSanych
VassilSanych

Ндааа... API уже совсем не тот.

beemo
beemo

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

Moadip
Moadip
beemo
beemo

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

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

http://www.stocksharp.com/doc/html/9d3b0442-0633-4ba5-97e1-22829adcd025.htm

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

Moadip
Moadip

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

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

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

Den
Den

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

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

Moadip
Moadip

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

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

Den
Den

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

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

Moadip
Moadip

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