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

Событийная модель 2
Atom
6/7/2012


Добрый день

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

У меня реализована стратегия в виде отдельного класса, для неё требуются данные из исторической таблицы (qpile).
Например это реализовано так:
Quote:
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);
}
}
};


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


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


Tags:


Thanks:


Alexander

Avatar
Date: 6/8/2012
Reply


Добрый.

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

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

Code
		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);
		}



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

Code
larryTrader.WhenNewTodayCandles().Do(CalculatePosition).Apply(this);



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

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

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

Avatar
Date: 6/20/2012
Reply


Добрый день

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

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

Alexander

Avatar
Date: 6/20/2012
Reply


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

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

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

Avatar
Date: 6/21/2012
Reply


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

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

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

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

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

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

Alexander

Avatar
Date: 6/21/2012
Reply


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

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.
Code
			_series
				.WhenCandlesFinished()
				.Do(ProcessCandle)
				.Apply(this);

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

Code
				_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 можно писать
Code
Trader.WhenNewTodayCandles().Do(CalculatePosition).Apply(this);
Thanks:


Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy