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

Protect в событийной модели
Atom
3/28/2011


vvt

Avatar
Взял пример кода из хелпа (событийная модель):
Code
                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 выдает следующее:
Quote:
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==()

Tags:


Thanks:


< 1 2 
vvt

Avatar
Date: 3/30/2011
Reply


в обоих случаях уже стоит new Unit(50) и тейке и в лоссе, до этого я тоже додумался, так что дело не в этом
вот код
Code
                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(() =>
                                      {
                                          /* сработало стоп условие */
                                      });
                         });
                }


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



лог здесь
Thanks:

Mikhail Sukhov

Avatar
Date: 3/31/2011
Reply


vvt
лог здесь


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

Quote:
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:
Quote:
Зарегистрировать условие. Условие будет не активно до тех пор, пока к нему не будет добавлено действие через метод Do(Action).


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

vvt

Avatar
Date: 3/31/2011
Reply


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

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

Mikhail Sukhov

Avatar
Date: 3/31/2011
Reply


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

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


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

vvt

Avatar
Date: 4/1/2011
Reply


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

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

Mikhail Sukhov

Avatar
Date: 4/2/2011
Reply


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

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


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

vvt

Avatar
Date: 4/14/2011
Reply


попробовал перейти на [3.1], изменил код в соответствии с новым синтаксисом (на [3.0.19] работало как нужно)
Code
                            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, но вместо одной заявки выставляет кучу, похоже на баг

вот лог
Quote:
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 Стратегия остановлена.
Thanks:

Mikhail Sukhov

Avatar
Date: 4/15/2011
Reply


vvt

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


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

vvt

Avatar
Date: 4/19/2011
Reply


в [3.1.2] баг исправлен
Thanks:
< 1 2 

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

loading
clippy