Событийная модель 2
Atom Ответить
07.06.2012


Добрый день

Наткнулся на форуме на информацию, что примеры уже устарели и лучше использовать событийную модель со ссылкой на документацию (Стратегии - Создание стратегии).
Существуют ли примеры помимо SampleSMA?

У меня реализована стратегия в виде отдельного класса, для неё требуются данные из исторической таблицы (qpile).
Например это реализовано так:
Цитата:
larryTrader.NewCustomTables += (type, objects) =>
{
Console.WriteLine("larryTrader.NewCustomTables");
...

//Releasing wait after open position prices have been calculated
waitHistory.Set();
}
};
larryTrader.CustomTablesChanged += (type, objects) =>
{
if (type == typeof(TodayCandle))
{
var candles = objects.Cast<TodayCandle>();
if (candles.ElementAt<TodayCandle>(1).DateTime.Time != lastCloseTime)
{
lastClosePrice = candles.ElementAt<TodayCandle>(1).ClosePrice;
lastCloseTime = candles.ElementAt<TodayCandle>(1).DateTime.Time;
Console.WriteLine("{0} New 15 min candle. Open time: {1}. Close price: {2}", DateTime.Now, lastCloseTime, lastClosePrice);
}
}
};


Сделать так:
Цитата:
larryTrader
.NewCustomTables
.Do(CalculatePosition)
.Apply(this);


вроде нельзя. whenNewCustomTables тоже нет. Как правильно делать? По старому? (хоть на RTFM отправьте)))


Теги:


Спасибо:




5 Ответов
Alexander

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


Добрый.

Сейчас все примеры уже переписаны на событийную модель.

Для того чтобы использовать When необходимы правила.
К примеру - так.

Код
		private sealed class NewTodayCandlesRule : StrategyRule<IEnumerable<object>>
		{
			private readonly ITrader _trader;

			public NewCustomTablesRule (ITrader trader)
			{
				if (trader == null)
					throw new ArgumentNullException("trader");

				_trader = trader;

				Name = "Новые данные";

				_trader.CustomTablesChanged += OnNewOrChangedCustomTables;
				_trader.NewCustomTables += OnNewOrChangedCustomTables;
			}

			private void OnNewOrChangedCustomTables(Type type, IEnumerable<object> objects)
			{
				if (type == typeof(TodayCandle))
				{
					Activate(objects);
				}
			}

			protected override void DisposeManaged()
			{
				_trader.CustomTablesChanged -= OnNewOrChangedCustomTables;
				_trader.NewCustomTables -= OnNewOrChangedCustomTables;
				base.DisposeManaged();
			}
		}


		public static StrategyRule<IEnumerable<object>> WhenNewTodayCandles(this ITrader trader)
		{
			return new NewTodayCandlesRule(trader);
		}



и теперь можно использовать

Код
larryTrader.WhenNewTodayCandles().Do(CalculatePosition).Apply(this);



Тогда в CalculatePosition придёт как раз IEnumerable<object> - список из объектов типа TodayCandle.

Это всё можно модифицировать как душе угодно. Надеюсь, принцип теперь более чем ясен :)
Спасибо: Дмитрий Егоров aspirant

Дмитрий Егоров

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


Добрый день

Пока никак не выходит переписать на событийную модель.
Существует ли пример, в котором реализована стратегия с нестандартным правилом?
В доках приведены отрывки кода DeltaHedge strategy, а где можно увидеть полный код стратегии?

С уважением,
Егоров Дмитрий
Автор топика
Спасибо:

Alexander

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


Добрый.
Что именно не выходит? Все SmaStrategy в примерах - на событийной модели.

DeltaHedge - это уже закрытая стратегия в S#, код не открываем.
Спасибо:

Дмитрий Егоров

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


Хорошо, попробую сформулировать вопросы.

1. Как правильно использовать объект Strategy? Правильно ли я понимаю, что он инициализируется/конструируется, затем нужно вызвать .Start(), и тогда исполнится код OnStarting(). В OnStarting() нужно запихнуть подписку на все необходимые события (все правила). При вызове Stop() будет сделан dispose всего.

2. Насколько я понял изначально класс и метод уникального правила должны находиться внутри класса стратегии. Верно ли это?

3. В ответе на мой вопрос Вы вызываете правило как метод larryTrader (QuikTrader). Но это ведь указатель на объект, который дала стратегии основная программа. Откуда он знает про новое правило? (При попытке сделать подобным образом Studio сразу подчёркивает ошибку) Может быть здесь должна быть стратегия? (Видимо ответ тесно связан со 2 вопросом)

Слегка запутался)))

С уважением,
Егоров Дмитрий
Автор топика
Спасибо:

Alexander

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


Дмитрий Егоров Перейти
Хорошо, попробую сформулировать вопросы.

1. Как правильно использовать объект Strategy? Правильно ли я понимаю, что он инициализируется/конструируется, затем нужно вызвать .Start(), и тогда исполнится код OnStarting(). В OnStarting() нужно запихнуть подписку на все необходимые события (все правила). При вызове Stop() будет сделан dispose всего.

2. Насколько я понял изначально класс и метод уникального правила должны находиться внутри класса стратегии. Верно ли это?

3. В ответе на мой вопрос Вы вызываете правило как метод larryTrader (QuikTrader). Но это ведь указатель на объект, который дала стратегии основная программа. Откуда он знает про новое правило? (При попытке сделать подобным образом Studio сразу подчёркивает ошибку) Может быть здесь должна быть стратегия? (Видимо ответ тесно связан со 2 вопросом)

Слегка запутался)))

С уважением,
Егоров Дмитрий


1) Совершенно верно. В SampleSma (trunk\Samples\Quik\SampleSma\MainWindow.xaml.cs) это делается в методе StartClick
2) Да. К примеру - как вы сказали в 1) вопросе - в OnStarting.
Код
			_series
				.WhenCandlesFinished()
				.Do(ProcessCandle)
				.Apply(this);

Вот пример, опять же, из SmaStrategy.cs
3) quikTrader - это объект, который вы передали в стратегию. Он доступен через свойство стратегии Trader.
Ведь при инициализации стратегии вы инициализируете свойство Trader:

Код
				_strategy = new SmaStrategy(series, new SimpleMovingAverage { Length = 80 }, new SimpleMovingAverage { Length = 10 })
				{
					Volume = 1,
					Security = _lkoh,
					Portfolio = Portfolios.SelectedPortfolio,
					Trader = _trader,
				};

(из MainWindow.xaml.cs).

поэтому теперь в стратегии в OnStarting можно писать
Код
Trader.WhenNewTodayCandles().Do(CalculatePosition).Apply(this);
Спасибо:


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

loading
clippy