Помогите разобраться с TakeProfitStrategy...

Помогите разобраться с TakeProfitStrategy...
Atom
23.11.2011
profts


Сделал как в примерах...

private void OnNewMyTrades(IEnumerable<MyTrade> trades) { // фильтруем сделки, чтобы найти те, которые произошли для заявки MyOrder trades = trades.Where(t => t.Order == MyOrder); // если не найдена ни одна сделка для заявки MyOrder if (trades.Count() == 0) return; // сама пакетная стратегия так же является параллельной, чтобы она не блокирована основной код робота var Basket = new BasketStrategy(BasketStrategyFinishModes.All); // для каждой сделки добавляем для защиты по пакетной стратегии Basket.ChildStrategies.AddRange(trades.Select(CreateBasket).Cast<Strategy>()); base.ChildStrategies.Add(Basket); }

 BasketStrategy CreateBasket(MyTrade t)
    {
        var s = new BasketStrategy(BasketStrategyFinishModes.First);
        // выставляет тейк-профит в 45 пунктов
        var takeProfit = new TakeProfitStrategy(t, 45);
        s.ChildStrategies.Add(takeProfit);
        return s;
    }

Лог такой:

16:33:51.023 | | OS | Стратегия запущена. 16:34:41.639 | | OS | Новая Buy сделка 458108237 по цене 140960 на 1 заявки 59619294. 16:34:41.665 | | BS | Стратегия запущена. 16:34:41.666 | | BS | Стратегия запущена. 16:34:41.666 | | TPS | Стратегия запущена. 16:35:48.452 | | TPS | Регистрация новой заявки на Sell с ценой 141005 и объемом 1. 16:35:48.455 | | TPS | Заявка 59619295 на Sell отправлена с ценой 141005 объемом 1. 16:35:48.489 | Warning | TPS | Заявка 59619295 не имеет состояния. 16:35:51.464 | | OS | Новая Sell сделка 458109666 по цене 141005 на 1 заявки 59619295. 16:35:51.465 | | TPS | Позиция изменилась на -1. 16:35:51.465 | | TPS | Заканчиваем котирование с неисполненным объемом равный 0. 16:35:51.465 | | BS | Новая Sell сделка 458109666 по цене 141005 на 1 заявки 59619295. 16:35:51.465 | | BS | Новая Sell сделка 458109666 по цене 141005 на 1 заявки 59619295. 16:35:51.465 | | TPS | Новая Sell сделка 458109666 по цене 141005 на 1 заявки 59619295. 16:35:51.466 | | BS | Стратегия останавливается. 16:35:51.467 | | TPS | Заканчиваем котирование с неисполненным объемом равный 0. 16:35:51.467 | | TPS | Заканчиваем котирование с неисполненным объемом равный 0. 16:35:51.469 | | BS | Стратегия останавливается. 16:35:51.470 | | TPS | Стратегия останавливается. 16:35:51.470 | | TPS | Заканчиваем котирование с неисполненным объемом равный 0. 16:35:51.473 | | BS | Стратегия остановлена.

Никак не разберусь, что делает TPS целую минуту от момента запуска до регистрации заявки. Сколько пробовал запускать - наименьший интервал был 6 секунд.


Теги:


Спасибо:


< 1 2 3 4  >
frontman

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


Ну могу вам сказать что это правило я сам лично использую и оно 100% верно. Ищите ошибку в логике программы самой.

Спасибо:

profts

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


Ну собственно вот вся логика:

protected override void OnStarting() { this .When(base.Security.Changed()) .Do(raschet); base.OnStarting(); }

private void raschet() { ... //расчет условия на сделку ... if (position == 0) { if (условие на сделку) { position = 1; order_buy1 = this.CreateOrder(OrderDirections.Buy, base.Security.GetMarketPrice(OrderDirections.Buy), 1); this.RegisterOrder(order_buy1); }; };

    if (position == 1)
          {
            this
                 .When(order_buy1.NewTrades())
                 .Do(Takeprofit1);
          }
}

private void Takeprofit1() { order_takeprofit1 = this.CreateOrder(OrderDirections.Sell, order_buy1.Price + 45, 1); this.RegisterOrder(order_takeprofit1); position = 2; }

Спасибо:

frontman

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


Давай те вы так сделаете : В методе OnStarting() Оставите только this.AddInfoLog("Создаю"); order_buy1 = this.CreateOrder(OrderDirections.Buy, base.Security.GetMarketPrice(OrderDirections.Buy), 1); this .When(order_buy1.NewTrades()) .Do(() => this.AddInfoLog("Новая сделка")); this.AddInfoLog("Регистрирую"); this.RegisterOrder(order_buy1);

И выложите здесь полученные в результате логи.

Спасибо:

profts

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


Сделал...

15:27:53.484 | | OS | Стратегия запущена. 15:27:53.493 | | OS | Создаю 15:27:53.501 | | OS | Регистрирую 15:27:54.061 | | OS | Новая Buy сделка 459004723 по цене 140345 на 1 заявки 55665883. 15:27:54.074 | | OS | Новая сделка

Спасибо:

profts

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


А вообще может быть, что событие .When(base.Security.Changed()) .Do(raschet);

возникает очень часто и вызывается одновременно в нескольких потоках и из разных потоков выставляется тэйк?

Спасибо:

profts

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


и еще добавил логи след. образом:

if (position == 0) { if (условие на сделку) { position = 1; order_buy1 = this.CreateOrder(OrderDirections.Buy, base.Security.GetMarketPrice(OrderDirections.Buy), 1); this.RegisterOrder(order_buy1); }; };

if (position == 1) { this.AddInfoLog("pos = 1"); this .When(order_buy1.NewTrades()) .Do(Takeprofit1); } }

private void Takeprofit1() { this.AddInfoLog("создается тэйк"); order_takeprofit1 = this.CreateOrder(OrderDirections.Sell, order_buy1.Price + 45, 1); this.RegisterOrder(order_takeprofit1); position = 2; this.AddInfoLog("pos=2"); }

В итоге получаю следующий лог:

15:36:36.917 | | OS | Стратегия запущена. 15:37:05.590 | | OS | pos = 1 15:37:05.917 | | OS | pos = 1 15:37:06.686 | | OS | pos = 1 15:37:06.794 | | OS | pos = 1 15:37:07.224 | | OS | pos = 1 15:37:08.215 | | OS | pos = 1 15:37:08.242 | | OS | Новая Buy сделка 459012183 по цене 140190 на 1 заявки 56189139. 15:37:08.254 | | OS | pos = 1 15:37:08.255 | | OS | создается тэйк 15:37:08.255 | | OS | pos=2 15:37:08.255 | | OS | создается тэйк 15:37:08.255 | | OS | pos=2 15:37:08.255 | | OS | создается тэйк 15:37:08.256 | | OS | pos=2 15:37:08.256 | | OS | создается тэйк 15:37:08.256 | | OS | pos=2 15:37:08.256 | | OS | создается тэйк 15:37:08.256 | | OS | pos=2 15:37:08.256 | | OS | создается тэйк 15:37:08.256 | | OS | pos=2 15:37:10.644 | | OS | Новая Sell сделка 459012259 по цене 140235 на 1 заявки 56189140. 15:37:10.645 | | OS | Новая Sell сделка 459012260 по цене 140235 на 1 заявки 56189141. 15:37:10.645 | | OS | Новая Sell сделка 459012261 по цене 140235 на 1 заявки 56189142. 15:37:10.645 | | OS | Новая Sell сделка 459012262 по цене 140235 на 1 заявки 56189143. 15:37:10.878 | | OS | Новая Sell сделка 459012268 по цене 140235 на 1 заявки 56189144. 15:37:10.878 | | OS | Новая Sell сделка 459012269 по цене 140235 на 1 заявки 56189145.

Спасибо:

kenota

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


profts: Ваш метод raschet() откуда вызывается? :)

Спасибо:

profts

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


Ваш метод raschet() откуда вызывается? :)

protected override void OnStarting() { this .When(base.Security.Changed()) .Do(raschet); base.OnStarting(); }

Спасибо:

kenota

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


Может быть в этом проблема, два потока могут одновременно зайти и оба прочитать что position = 0 и поставить ордер.

Что же касается вызовов метода NewTrades несколько раз, попробуйте вместо него использовать событие ордера Matched. Т.е. this.When(order_buy1.Matched()).Do(TakeProfit1);

Спасибо:

frontman

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


Сделал...

15:27:53.484 | | OS | Стратегия запущена. 15:27:53.493 | | OS | Создаю 15:27:53.501 | | OS | Регистрирую 15:27:54.061 | | OS | Новая Buy сделка 459004723 по цене 140345 на 1 заявки 55665883. 15:27:54.074 | | OS | Новая сделка Это говорит о том что событие не генерируются несколько раз...

Спасибо:
< 1 2 3 4  >

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

loading
clippy