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

Помогите разобраться с TakeProfitStrategy...
Atom
11/23/2011
profts


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

private void OnNewMyTrades(IEnumerable 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()); 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 секунд.


Tags:


Thanks:


1 2 3  > >>
esper

Avatar
Date: 11/23/2011
Reply


Ждет, пока выполнится условие, что цена вырастет/упадет на заданное значение

Thanks: profts

profts

Avatar
Date: 11/23/2011
Reply


Невнимательно документацию прочитал ) для HFT стратегии такое явно не подходит )

тогда возникает вопрос - как из события NewMyTrades определить какая именно сделка прошла? допустим есть условие, по которому выставляются несколько заявок на покупку и по мере их исполнения для каждой покупки выставляется тэйк.

как по событию NewMyTrades определить чем является данная сделка - исполненной покупкой или тэйком? можно ли в комментарии к заявке добавлять buy или Take, к примеру...

Thanks:

esper

Avatar
Date: 11/23/2011
Reply


У MyTrade есть поле Order, это заявка по которой пришли сделки, при создании заявко можно где-то запоминать их, а потом проверять

Thanks:

profts

Avatar
Date: 11/23/2011
Reply


Что-то вроде этого?:

MyBuy = this.CreateOrder(); this.RegisterOrder(MyBuy); MyTake = this.CreateOrder(); this.RegisterOrder(MyTake); ...

 private void OnNewMyTrades(IEnumerable<MyTrade> trades)
    {
       trades = trades.Where(t => t.Order == MyBuy);
         if (trades.Count() == 1)
            {
            //прошла покупка
            }
           else
            {
              trades = trades.Where(t => t.Order == MyTake);
              if (trades.Count() == 1)
                {
                 // исполнился тэйк
                }
            }
    }

По-моему можно как-то более красиво сделать )))

Thanks:

frontman

Avatar
Date: 11/24/2011
Reply


Ну например у каждой заявки есть правило order.NewTrades() и if тогда нафик не нужен. И странное какое то у вас условие... А что если например MyBuy сделка была на 2 лота и они прошли в разных сделках? Тогда у вас условие не выполниться явно...

Thanks:

profts

Avatar
Date: 11/24/2011
Reply


А что если например MyBuy сделка была на 2 лота и они прошли в разных сделках? Можно изменить на: if (trades.Count() > 0) , но в любом случае order.NewTrades() более удобно использовать. Спасибо!

Thanks:

profts

Avatar
Date: 11/24/2011
Reply


Сделал подобным образом:

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

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

13:09:44.264 | | OS | Новая Buy сделка 458811146 по цене 140605 на 1 заявки 47354464. 13:09:44.592 | Error | OS | Заявка 47354476 не была принята по причине StockSharp.Quik.ApiException: Код ошибки Failed Сообщение Ошибка создания заявки. [FORTS] "Нехватка средств по лимитам клиента.".. 13:09:44.592 | Error | OS | Заявка 47354475 не была принята по причине StockSharp.Quik.ApiException: Код ошибки Failed Сообщение Ошибка создания заявки. [FORTS] "Нехватка средств по лимитам клиента.".. 13:09:44.592 | Error | OS | Заявка 47354477 не была принята по причине StockSharp.Quik.ApiException: Код ошибки Failed Сообщение Ошибка создания заявки. [FORTS] "Нехватка средств по лимитам клиента.".. 13:09:44.592 | Error | OS | Заявка 47354478 не была принята по причине StockSharp.Quik.ApiException: Код ошибки Failed Сообщение Ошибка создания заявки. [FORTS] "Нехватка средств по лимитам клиента.".. 13:09:44.593 | Error | OS | Заявка 47354479 не была принята по причине StockSharp.Quik.ApiException: Код ошибки Failed Сообщение Ошибка создания заявки. [FORTS] "Нехватка средств по лимитам клиента.".. 13:09:44.593 | Error | OS | Заявка 47354480 не была принята по причине StockSharp.Quik.ApiException: Код ошибки Failed Сообщение Ошибка создания заявки. [FORTS] "Нехватка средств по лимитам клиента.".. 13:09:44.643 | Error | OS | Заявка 47354481 не была принята по причине StockSharp.Quik.ApiException: Код ошибки Failed Сообщение Ошибка создания заявки. [FORTS] "Нехватка средств по лимитам клиента.".. 13:09:44.643 | Error | OS | Заявка 47354483 не была принята по причине StockSharp.Quik.ApiException: Код ошибки Failed Сообщение Ошибка создания заявки. [FORTS] "Нехватка средств по лимитам клиента.".. 13:09:44.805 | Error | OS | Заявка 47354482 не была принята по причине StockSharp.Quik.ApiException: Код ошибки Failed Сообщение Ошибка создания заявки. [FORTS] "Нехватка средств по лимитам клиента.".. 13:09:44.805 | Error | OS | Заявка 47354484 не была принята по причине StockSharp.Quik.ApiException: Код ошибки Failed Сообщение Ошибка создания заявки. [FORTS] "Нехватка средств по лимитам клиента.".. 13:09:44.805 | Error | OS | Заявка 47354485 не была принята по причине StockSharp.Quik.ApiException: Код ошибки Failed Сообщение Ошибка создания заявки. [FORTS] "Нехватка средств по лимитам клиента.".. 13:09:44.805 | Error | OS | Заявка 47354486 не была принята по причине StockSharp.Quik.ApiException: Код ошибки Failed Сообщение Ошибка создания заявки. [FORTS] "Нехватка средств по лимитам клиента.".. 13:09:47.748 | | OS | Стратегия останавливается. 13:09:47.753 | | OS | Стратегия остановлена. 13:09:52.752 | | OS | Новая Sell сделка 458811274 по цене 140650 на 1 заявки 47354465. 13:09:52.754 | | OS | Новая Sell сделка 458811275 по цене 140650 на 1 заявки 47354466. 13:09:52.755 | | OS | Новая Sell сделка 458811276 по цене 140650 на 1 заявки 47354467. 13:09:52.755 | | OS | Новая Sell сделка 458811277 по цене 140650 на 1 заявки 47354468. 13:09:52.755 | | OS | Новая Sell сделка 458811278 по цене 140650 на 1 заявки 47354470. 13:09:52.756 | | OS | Новая Sell сделка 458811279 по цене 140650 на 1 заявки 47354471. 13:09:52.756 | | OS | Новая Sell сделка 458811280 по цене 140650 на 1 заявки 47354473. 13:09:52.756 | | OS | Новая Sell сделка 458811281 по цене 140650 на 1 заявки 47354474.

Почему событие .When(order_buy1.NewTrades()) возникает несколько раз? Изменил на .When(order_buy1.Matched()) - то же самое... просто начинают выставляться тейкпрофиты без остановок.

Thanks:

frontman

Avatar
Date: 11/24/2011
Reply


Ну судя по логам у вас события срабатывают для разных заявок 13:09:52.752 | | OS | Новая Sell сделка 458811274 по цене 140650 на 1 заявки 47354465. 13:09:52.754 | | OS | Новая Sell сделка 458811275 по цене 140650 на 1 заявки 47354466. 13:09:52.755 | | OS | Новая Sell сделка 458811276 по цене 140650 на 1 заявки 47354467. 13:09:52.755 | | OS | Новая Sell сделка 458811277 по цене 140650 на 1 заявки 47354468. 13:09:52.755 | | OS | Новая Sell сделка 458811278 по цене 140650 на 1 заявки 47354470. 13:09:52.756 | | OS | Новая Sell сделка 458811279 по цене 140650 на 1 заявки 47354471. 13:09:52.756 | | OS | Новая Sell сделка 458811280 по цене 140650 на 1 заявки 47354473. 13:09:52.756 | | OS | Новая Sell сделка 458811281 по цене 140650 на 1 заявки 47354474.

Thanks:

frontman

Avatar
Date: 11/24/2011
Reply


Сколько контрактов у вас в первоначальной заявке?

Thanks:

profts

Avatar
Date: 11/24/2011
Reply


Да объем везде 1 контракт... Да и на покупку выставляется только одна заявка order_buy1...

Может причина в том, что условия if внутри метода raschet, который вызывается по событию:

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

Thanks:
1 2 3  > >>

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

loading
clippy