Protect в событийной модели
Atom Ответить
28.03.2011


vvt

Фотография
Взял пример кода из хелпа (событийная модель):
Код
                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, Func`3 operation, Func`3 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

Фотография
Автор статей Программист Трейдер
Дата: 28.03.2011
Ответить


Security.MinStepPrice чему равен?
Спасибо:

vvt

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


Mikhail Sukhov Перейти
Security.MinStepPrice чему равен?

Security это RIM1
значит Security.MinStepPrice равен 5
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 28.03.2011
Ответить


vvt Перейти
Mikhail Sukhov Перейти
Security.MinStepPrice чему равен?

Security это RIM1
значит Security.MinStepPrice равен 5


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

vvt

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


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

vvt

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


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



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

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 29.03.2011
Ответить


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


Без логов не понять.
Спасибо:

vvt

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


В код добавил { IsForts = true, IsParallel = true } и по тейку и по лоссу.

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



Лог залил сюда
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 30.03.2011
Ответить


vvt Перейти
Лог залил сюда


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

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 30.03.2011
Ответить


Mikhail Sukhov Перейти
vvt Перейти
Лог залил сюда


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


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

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 30.03.2011
Ответить


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

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


в обоих случаях уже стоит 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

Фотография
Автор статей Программист Трейдер
Дата: 30.03.2011
Ответить


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

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


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

Да, просьба объяснить.
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 31.03.2011
Ответить


vvt Перейти
Цитата:
Дальше объяснять где бага?

Да, просьба объяснить.


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

vvt

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


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

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

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 02.04.2011
Ответить


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

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


1. Это минимум.
2. Через изменение свойства ProtectiveDelta.
Спасибо:

vvt

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


попробовал перейти на [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

Фотография
Автор статей Программист Трейдер
Дата: 15.04.2011
Ответить


vvt Перейти

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


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

vvt

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


в [3.1.2] баг исправлен
Автор топика
Спасибо:


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

loading
clippy