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

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


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

Quote:

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

Лог такой:

Quote:

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


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


Quote:

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


Quote:

А что если например MyBuy сделка была на 2 лота и они прошли в разных сделках?

Можно изменить на: if (trades.Count() > 0) , но в любом случае order.NewTrades() более удобно использовать.
Спасибо!
Thanks:

profts

Avatar
Date: 11/24/2011
Reply


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

Quote:

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


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

Quote:

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, который вызывается по событию:

Quote:

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