← Назад

Protect в событийной модели

Взял пример кода из хелпа (событийная модель):

				When(_order.NewTrades()).
					Do(this.Protect(_order,
					                t => new TakeProfitStrategy(t, 150.Points(Security)), // тейк на 150 пунктов
					                t => new StopLossStrategy(t, 100.Points(Security)))). // стоп на 100 пунктов
					Activated<Strategy>(s =>
					                    	{
					                    		When(s.Stopped()).
					                    			Do(() =>
					                    			   	{
					                    			   		/* сработало стоп условие */
					                    			   	});
					                    	});

при наступлении события NewTrades выдает следующее:

System.InvalidOperationException: Значение стоимости шага цены не инициализировано. в Ecng.Trading.BusinessEntities.UnitHelper.GetStepPrice(Unit unit) в Ecng.Trading.BusinessEntities.Unit.op_Explicit(Unit unit) в Ecng.Trading.BusinessEntities.Unit.CreateResult(Unit u1, Unit u2, Func3 operation, Func3 percentOperation) в Ecng.Trading.BusinessEntities.Unit.op_Subtraction(Unit u1, Unit u2) в Ecng.Trading.Algo.Strategies.StopLossStrategy.GetNewPrice() в Ecng.Trading.Algo.Strategies.QuotingStrategy.OnProcess() в Ecng.Trading.Algo.Strategies.Strategy. #=qnMN_PMdUfHysEK$_tfQ8grn_QTjzOIMGPiv$tYCH2Bw=.#=q3rD2zIrUx4ViUbhRH66B2w==()

Комментарии (19)

Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий

Mikhail Sukhov
Mikhail Sukhov

Security.MinStepPrice чему равен?

vvt
vvt Автор

Mikhail Sukhov: Security.MinStepPrice чему равен? Security это RIM1 значит Security.MinStepPrice равен 5

Mikhail Sukhov
Mikhail Sukhov

vvt:

Mikhail Sukhov: Security.MinStepPrice чему равен? Security это RIM1 значит Security.MinStepPrice равен 5

А в программе? Вы делали, как показано здесь?

vvt
vvt Автор

Спасибо, включил экспорт дополнительных колонок.

vvt
vvt Автор

Код в первом сообщении работает, но при срабатывании он гернерирует огромное количество заявок вместо одной по тейку или по лоссу, с одинаковым временем, хотя защищается покупка всего 1-го лота.

Как видно после покупки сработал тейк на 50 пунков в 16:41:19, но вместо 1 заявки на 1 лот выставилась куча заявок по 1 лоту на все депо. Что я делаю не так?

Mikhail Sukhov
Mikhail Sukhov

vvt: Как видно после покупки сработал тейк на 50 пунков в 16:41:19, но вместо 1 заявки на 1 лот выставилась куча заявок по 1 лоту на все депо. Что я делаю не так?

Без логов не понять.

vvt
vvt Автор

В код добавил и по тейку и по лоссу.

Запустил сейчас, результат

Лог залил сюда

Mikhail Sukhov
Mikhail Sukhov

vvt: Лог залил сюда

Выглядит как баг. Проверю.

Mikhail Sukhov
Mikhail Sukhov

Mikhail Sukhov:

vvt: Лог залил сюда

Выглядит как баг. Проверю.

Перед When первой строчкой выведите что-нибудь в лог.

Mikhail Sukhov
Mikhail Sukhov

vvt: Взял пример кода из хелпа (событийная модель):

			When(_order.NewTrades()).
				Do(this.Protect(_order,
				                t => new TakeProfitStrategy(t, 150.Points(Security)), // тейк на 150 пунктов
				                t => new StopLossStrategy(t, 100.Points(Security)))). // стоп на 100 пунктов
				

Багу в примере заметил - тут нужно использовать просто new Unit(150) и new Unit(100). Потому что защиту мы выставляем в абсолютном значении. По фьючам абсолютное значение и есть пункты. А вот если мы хотим перевести пункты в реальную стоимость (в доллары), то нужно создавать Unit в пунктах, и переводить их в double (через cast).
vvt
vvt Автор

в обоих случаях уже стоит new Unit(50) и тейке и в лоссе, до этого я тоже додумался, так что дело не в этом вот код

				if (_order != null)
				{
					AddLog(StrategyErrorStates.None ,"Перед предпоследним When");
					When(_order.NewTrades()).
					Do(this.Protect(_order, 
					t => new TakeProfitStrategy(t, new Unit(50)) { IsForts = true, IsParallel = true }, // тейк на 50 пунктов
					t => new StopLossStrategy(t, new Unit(50)) { IsForts = true, IsParallel = true })). // стоп на 50 пунктов
					Activated<Strategy>(s =>
					                    	{
												AddLog(StrategyErrorStates.None ,"Перед последним When");
					                    		When(s.Stopped()).
					                    			Do(() =>
					                    			   	{
					                    			   		/* сработало стоп условие */
					                    			   	});
					                    	});
				}

еще раз запустил с логированием

лог здесь

Mikhail Sukhov
Mikhail Sukhov

vvt: лог здесь

Цитата из вашего лога:

CPS 23:07:28.9470510 Перед предпоследним When CPS 23:07:29.9601089 Перед предпоследним When CPS 23:07:30.9611662 Перед предпоследним When CPS 23:07:31.9612234 Перед предпоследним When CPS 23:07:32.9612806 Перед предпоследним When CPS 23:07:33.9613378 Перед предпоследним When CPS 23:07:34.9613950 Перед предпоследним When CPS 23:07:35.9644523 Перед предпоследним When CPS 23:07:36.9645095 Перед предпоследним When CPS 23:07:37.9645667 Перед предпоследним When CPS 23:07:38.9646239 Перед предпоследним When CPS 23:07:39.9646811 Перед предпоследним When CPS 23:07:40.9647383 Перед предпоследним When CPS 23:07:41.9647955 Перед предпоследним When CPS 23:07:42.9648527 Перед предпоследним When CPS 23:07:43.9649099 Перед предпоследним When CPS 23:07:44.9659672 Перед предпоследним When CPS 23:07:45.9660244 Перед предпоследним When CPS 23:07:46.9660816 Перед предпоследним When CPS 23:07:47.9661388 Перед предпоследним When CPS 23:07:48.9661960 Перед предпоследним When CPS 23:07:49.9662532 Перед предпоследним When CPS 23:07:50.9663104 Перед предпоследним When CPS 23:07:51.9663676 Перед предпоследним When CPS 23:07:52.9674248 Перед предпоследним When CPS 23:07:53.9674820 Перед предпоследним When CPS 23:07:54.9685393 Перед предпоследним When CPS 23:07:55.9695966 Перед предпоследним When CPS 23:07:56.9836546 Перед предпоследним When CPS 23:07:57.9857119 Перед предпоследним When CPS 23:07:58.9877692 Перед предпоследним When CPS 23:07:59.9888264 Перед предпоследним When CPS 23:08:00.9888836 Перед предпоследним When CPS 23:08:02.0049418 Перед предпоследним When CPS 23:08:03.0179997 Перед предпоследним When CPS 23:08:04.0250573 Перед предпоследним When CPS 23:08:05.0271146 Перед предпоследним When CPS 23:08:06.0271718 Перед предпоследним When CPS 23:08:07.0272290 Перед предпоследним When CPS 23:08:08.0272862 Перед предпоследним When CPS 23:08:09.0283435 Перед предпоследним When

Документация по методу When:

Зарегистрировать условие. Условие будет не активно до тех пор, пока к нему не будет добавлено действие через метод Do(Action).

Дальше объяснять где бага?

vvt
vvt Автор

Дальше объяснять где бага? Да, просьба объяснить.

Mikhail Sukhov
Mikhail Sukhov

Дальше объяснять где бага? Да, просьба объяснить.

Вы регистрируете условие несколько десятков раз. Поэтому когда наступает событие о новых сделках, то и регистрация срабатывает ровно столько раз (и ровно столько будет сделок), сколько вы зарегистрировали условие.

vvt
vvt Автор

Все, принцип понял, спасибо.

Еще есть пара вопросов:

  1. метод MakePeriodical() выполняется с частотой Strategy.Interval ?
  2. можно ли в коде приведенном выше динамически изменять размер стопа в TakeProfitStrategy и StopLossStrategy во время работы стратегии? Если да, то как (желательно пример кода).
Mikhail Sukhov
Mikhail Sukhov

vvt: Все, принцип понял, спасибо.

Еще есть пара вопросов:

  1. метод MakePeriodical() выполняется с частотой Strategy.Interval ?
  2. можно ли в коде приведенном выше динамически изменять размер стопа в TakeProfitStrategy и StopLossStrategy во время работы стратегии? Если да, то как (желательно пример кода).
  1. Это минимум.
  2. Через изменение свойства ProtectiveDelta.
vvt
vvt Автор

попробовал перейти на [3.1], изменил код в соответствии с новым синтаксисом (на [3.0.19] работало как нужно)

							if (_isPosition != true)
							{
									AddLog(StrategyErrorStates.None, "Перед предпоследним When");
									When(_order.NewTrades()). //() =>
										Protect(_order,
													 t =>
													 new TakeProfitStrategy(t, new Unit(150)) { IsParallel = true, IsMarket = true },
													 t =>
													 Sls1 = new StopLossStrategy(t, new Unit(_stopPrice)) { IsParallel = true, IsMarket = true, IsTrailing = true }).Activated<Strategy>(
															s =>
															{
																AddLog(StrategyErrorStates.None, "Перед последним When");
																When(s.Stopped()).
																	Do(() =>
																		{
																			// сработало стоп условие
																			_isPosition = false;
																			AddLog(StrategyErrorStates.None, string.Format("Сработало стоп-условие _stopPrice={0}", Sls1.ProtectiveDelta));
																		});
															});

								}

видно, что сработал TakeProfit, но вместо одной заявки выставляет кучу, похоже на баг

вот лог

CPS 16:32:40.9762649 Стратегия запущена. CPS 16:35:03.7004282 Правило активировано. CPS 16:35:03.7074286 Правило удалено. CPS 16:40:03.4545732 Правило активировано. CPS 16:40:03.4605735 Перед предпоследним When CPS 16:40:03.5345778 Правило удалено. CPS 16:40:04.5366351 Правило активировано. CPS 16:40:04.5416354 Стратегия запущена. CPS 16:40:04.5426354 Перед последним When CPS 16:40:04.5426354 Правило удалено. CPS 16:40:05.5436927 Правило активировано. CPS 16:40:05.5546933 Стратегия запущена. CPS 16:40:05.5546933 Стратегия запущена. CPS 16:40:05.5546933 Стратегия запущена. CPS 16:40:05.5546933 Стратегия запущена. CPS 16:40:05.5546933 Правило удалено. CPS 16:40:58.8447413 Регистрация защитной заявки с ценой 196185 и объемом 1. CPS 16:40:58.8447413 Регистрация новой заявки на Sell с ценой 196185 и объемом 1. CPS 16:40:58.8457414 Заявка 58461521 на Sell отправлена с ценой 196185 объемом 1. CPS 16:40:59.8467987 Котируемая заявка 58461521 исполнилась. CPS 16:40:59.8467987 Осталось 2 контрактов. CPS 16:41:00.8478559 Регистрация новой заявки на Sell с ценой 196185 и объемом 1. CPS 16:41:00.8478559 Заявка 58461522 на Sell отправлена с ценой 196185 объемом 1. CPS 16:41:01.8909156 Котируемая заявка 58461522 исполнилась. CPS 16:41:01.8909156 Осталось 3 контрактов. CPS 16:41:02.8929729 Регистрация новой заявки на Sell с ценой 196185 и объемом 1. CPS 16:41:02.8929729 Заявка 58461523 на Sell отправлена с ценой 196185 объемом 1. CPS 16:41:03.9060308 Котируемая заявка 58461523 исполнилась. CPS 16:41:03.9060308 Осталось 4 контрактов. CPS 16:41:04.9080881 Регистрация новой заявки на Sell с ценой 196185 и объемом 1. CPS 16:41:04.9080881 Заявка 58461524 на Sell отправлена с ценой 196185 объемом 1. CPS 16:41:05.9191460 Котируемая заявка 58461524 исполнилась. CPS 16:41:05.9191460 Осталось 5 контрактов. CPS 16:41:06.9202032 Регистрация новой заявки на Sell с ценой 196185 и объемом 1. CPS 16:41:06.9202032 Заявка 58461525 на Sell отправлена с ценой 196185 объемом 1. CPS 16:41:16.9537771 Котируемая заявка 58461525 исполнилась. CPS 16:41:16.9537771 Осталось 6 контрактов. CPS 16:41:17.9548344 Котируемая заявка 0 снята. CPS 16:41:17.9548344 Осталось 6 контрактов. CPS 16:41:18.9588918 Котируемая заявка 0 снята. CPS 16:41:18.9588918 Осталось 6 контрактов. CPS 16:41:19.9619492 Котируемая заявка 0 снята. CPS 16:41:19.9619492 Осталось 6 контрактов. CPS 16:41:20.9650065 Котируемая заявка 0 снята. CPS 16:41:20.9650065 Осталось 6 контрактов. CPS 16:41:21.9710641 Котируемая заявка 0 снята. CPS 16:41:21.9710641 Осталось 6 контрактов. CPS 16:41:22.9721213 Регистрация новой заявки на Sell с ценой 196185 и объемом 1. CPS 16:41:22.9721213 Заявка 58461526 на Sell отправлена с ценой 196185 объемом 1. CPS 16:41:28.6174442 Стратегия останавливается. CPS 16:41:28.6174442 Стратегия останавливается. CPS 16:41:28.6174442 Стратегия останавливается. CPS 16:41:28.6174442 Стратегия останавливается. CPS 16:41:28.6174442 Стратегия останавливается. CPS 16:41:28.6174442 Стратегия останавливается. CPS 16:41:28.9854653 Котирование отменяет заявку 58461526. CPS 16:41:28.9864653 Стратегия остановлена. CPS 16:41:28.9864653 Котирование закончилось. CPS 16:41:28.9864653 Стратегия остановлена. CPS 16:41:28.9934657 Стратегия остановлена. CPS 16:41:29.0404684 Стратегия остановлена. CPS 16:41:29.0414685 Стратегия остановлена. CPS 16:41:29.0424685 Стратегия остановлена.

Mikhail Sukhov
Mikhail Sukhov

vvt: видно, что сработал TakeProfit, но вместо одной заявки выставляет кучу, похоже на баг

Да, баг, причем судя по логу не один. Буду разбираться. Спасибо за фидбек.

vvt
vvt Автор

в [3.1.2] баг исправлен