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


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

Цитата:

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 секунд.

Теги:


Спасибо:




37 Ответов
< 1 2 
profts

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


Цитата:

В смысле одновременно в разных потоках?
Оно генерируется столько раз сколько вы на него подписались.


Немного не так меня поняли...
появились две сделки по ризу, в двух разных потоках вызывается метод raschet, в каждом из которых генерируется .When(order_buy1.NewTrades())
.Do(Takeprofit1);


Автор топика
Спасибо:

frontman

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


Нет я вас так понял.
order_buy1 - у вас в разных потоках все равно разный. Это разные заявки. Поэтому и сделка на них приходят разные.
Спасибо:

frontman

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


Тьфу ты... Или у вас order_buy1 - глобальный параметр?
Спасибо:

frontman

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


Без пол литра в этом коде точно не разобраться))
f (position == 1)
{
this
.When(order_buy1.NewTrades())
.Do(Takeprofit1);
}
Это зачем? Ну вешайте вы сразу тейк профит без проверки позиций и все хорошо тогда будет.
Т.е как то так
if (position == 0)
{
if (условие на сделку)
{
position = 1;
order_buy1 = this.CreateOrder(OrderDirections.Buy, base.Security.GetMarketPrice(OrderDirections.Buy), 1);
this.RegisterOrder(order_buy1);
this
.When(order_buy1.NewTrades())
.Do(Takeprofit1);
};
};
Спасибо: profts

profts

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


Дело в том, что position = 2 присваивается только после отправки тэйка:

Цитата:

private void Takeprofit1()
{

order_takeprofit1 = this.CreateOrder(OrderDirections.Sell, order_buy1.Price + 45, 1);
this.RegisterOrder(order_takeprofit1);
position = 2;

}



Видимо пока position =1 из разных потоков вызывается метод отправки тэйка:

Цитата:

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



Если меняю на :

Цитата:

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


Тэйкпрофит выставляется один раз:

Цитата:

16:34:56.403 | | OS | Стратегия запущена.
16:35:28.929 | | OS | pos = 1
16:35:28.950 | | OS | pos = 2
16:36:02.496 | | OS | Новая Buy сделка 459071315 по цене 140285 на 1 заявки 59689492.
16:36:03.776 | | OS | Новая Sell сделка 459071339 по цене 140330 на 1 заявки 59689493.


Вообще конечно странно...


Автор топика
Спасибо:

profts

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


Цитата:

Это зачем? Ну вешайте вы сразу тейк профит без проверки позиций и все хорошо тогда будет.


Если честно сам сейчас задумался для чего я сделал еще одно условие и так и не понял )))

Исправил - все заработало :)))

Цитата:

16:48:16.783 | | OS | Стратегия запущена.
16:48:50.342 | | OS | pos = 1
16:48:51.771 | | OS | Новая Buy сделка 459079937 по цене 140245 на 1 заявки 60489183.
16:48:51.784 | | OS | создается тэйк
16:48:51.784 | | OS | pos=2


За такую помощь и поллитра не жалко )))
Спасибо!
Автор топика
Спасибо:

profts

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


Выставляю заявку с помощью MarketQuotingStrategy. Объем 1 лот.
В итоге проходит покупка 2-х лотов.
лог:

Цитата:

18:22:42.323 | | OS | Стратегия запущена.
18:23:23.043 | | OS | лонг
18:23:23.050 | | MQS | Стратегия запущена.
18:23:23.475 | | MQS | Регистрация новой заявки на Buy с ценой 138660 и объемом 1.
18:23:23.493 | | MQS | Заявка 66144576 на Buy отправлена с ценой 138660 объемом 1.
18:23:23.545 | Warning | MQS | Заявка 66144576 не имеет состояния.
18:23:23.668 | | MQS | Цена текущей 138660 и лучшей 138670.
18:23:23.668 | | MQS | Лучший бид 138665 и лучший аск 138670.
18:23:23.668 | | MQS | Котирование заявки 66144576 на Buy с ценой 138660 объемом 1.
18:23:23.673 | | MQS | Перекотирование зарегистрировано для заявки 66144577 на Buy с ценой 138670 объемом 1.
18:23:23.740 | Error | MQS | Заявка 66144577 не была принята по причине System.InvalidOperationException: Сервер для транзакции 'ACTION=MOVE_ORDERS; TRANS_ID=66144577; CLASSCODE=SPBFUT; SECCODE=RIZ1; MODE=0; FIRST_ORDER_NUMBER=6019530259; FIRST_ORDER_NEW_PRICE=138670; FIRST_ORDER_NEW_QUANTITY=1;' вернул неправильное сообщение 'Ошибка перестановки заявок. [FORTS] "Не найдена заявка для перестановки.".' по передвинутым заявкам..
18:23:23.780 | Error | MQS | Котируемая заявка 66144577 не принята биржей по причине 'Сервер для транзакции 'ACTION=MOVE_ORDERS; TRANS_ID=66144577; CLASSCODE=SPBFUT; SECCODE=RIZ1; MODE=0; FIRST_ORDER_NUMBER=6019530259; FIRST_ORDER_NEW_PRICE=138670; FIRST_ORDER_NEW_QUANTITY=1;' вернул неправильное сообщение 'Ошибка перестановки заявок. [FORTS] "Не найдена заявка для перестановки.".' по передвинутым заявкам.'.
18:23:23.780 | | MQS | Регистрация новой заявки на Buy с ценой 138670 и объемом 1.
18:23:23.783 | | MQS | Заявка 66144578 на Buy отправлена с ценой 138670 объемом 1.
18:23:23.868 | | OS | Новая Buy сделка 460128443 по цене 138660 на 1 заявки 66144576.
18:23:23.883 | Warning | MQS | Заявка 66144578 не имеет состояния.
18:23:23.968 | | MQS | Позиция изменилась на 1.
18:23:23.968 | | MQS | Заканчиваем котирование с неисполненным объемом равный 0.
18:23:23.968 | | MQS | Отмена заявки 66144578.
18:23:23.968 | | OS | Новая Buy сделка 460128451 по цене 138670 на 1 заявки 66144578.
18:23:23.970 | | OS | создается тэйк
18:23:23.970 | | OS | тэйк1
18:23:23.973 | | MQS | Стратегия останавливается.
18:23:23.973 | | MQS | Заканчиваем котирование с неисполненным объемом равный 0.
18:23:23.973 | | MQS | Заканчиваем котирование с неисполненным объемом равный 0.
18:23:23.975 | | MQS | Стратегия остановлена.



Подобная ошибка появилась впервые. По какой причине стратегия не смогла найти заявку для перестановки? и не совсем понятно по какой причине исполнилось две заявки на покупку.
Автор топика
Спасибо:

Alexander

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


Попробуйте Security.Exchange.Rts выставить IsSupportAtomicReRegister в false
на move посмотрим
Спасибо:

profts

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


Правильно понял? Сделал следующим образом:

Цитата:

_secRIZ1.Exchange.IsSupportAtomicReRegister = false;
order_buy1 = this.CreateOrder(OrderDirections.Buy, _secRIZ1.BestAsk.Price, 1);
order_buy1.Security = _secRIZ1;

var strategy1 = new MarketQuotingStrategy(order_buy1, 1, 5);
strategy1.Security = _secRIZ1;

base.ChildStrategies.Add(strategy1);

this
.When(strategy1.StrategyNewMyTrades())

.Do(Takeprofit1);


В итоге след лог:
Цитата:

12:35:54.283 | | OS | Стратегия запущена.
12:36:05.438 | | OS | лонг
12:36:05.446 | | MQS | Стратегия запущена.
12:36:06.276 | | MQS | Регистрация новой заявки на Buy с ценой 145005 и объемом 1.
12:36:06.293 | | MQS | Заявка 45347685 на Buy отправлена с ценой 145005 объемом 1.
12:36:07.134 | | OS | Новая Buy сделка 460581557 по цене 145005 на 1 заявки 45347685.
12:36:07.138 | | MQS | Котируемая заявка 45347685 исполнилась.
12:36:07.138 | | MQS | Регистрация новой заявки на Buy с ценой 145005 и объемом 1.
12:36:07.141 | | MQS | Заявка 45347686 на Buy отправлена с ценой 145005 объемом 1.
12:36:07.145 | | MQS | Позиция изменилась на 1.
12:36:07.145 | | MQS | Заканчиваем котирование с неисполненным объемом равный 0.
12:36:07.147 | | MQS | Стратегия останавливается.
12:36:07.149 | | MQS | Заканчиваем котирование с неисполненным объемом равный 0.
12:36:07.149 | | MQS | Заканчиваем котирование с неисполненным объемом равный 0.
12:36:07.151 | | MQS | Стратегия остановлена.


Сделка продит два раза - первый из основной стратегии, второй раз из котирования. Плюс не срабатывает событие новых сделок по стратегии.
Автор топика
Спасибо:

profts

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


Обновился до 4.0.6.
Котирование вообще перестало работать.
Цитата:

order_buy1 = this.CreateOrder(OrderDirections.Buy, base.Security.BestAsk.Price, 1);
var strategy1 = new MarketQuotingStrategy(order_buy1, new Unit(5), new Unit(5));
base.ChildStrategies.Add(strategy1);


Лог:
Цитата:

17:28:14.692 | | OS | Стратегия запущена.
17:28:35.209 | | MQS | Стратегия запущена.

Автор топика
Спасибо:

Alexander

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


Обновитесь до 4.0.7 с codeplex
Спасибо:

Alexander

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


profts Перейти
Правильно понял? Сделал следующим образом:

Цитата:

_secRIZ1.Exchange.IsSupportAtomicReRegister = false;
order_buy1 = this.CreateOrder(OrderDirections.Buy, _secRIZ1.BestAsk.Price, 1);
order_buy1.Security = _secRIZ1;

var strategy1 = new MarketQuotingStrategy(order_buy1, 1, 5);
strategy1.Security = _secRIZ1;

base.ChildStrategies.Add(strategy1);

this
.When(strategy1.StrategyNewMyTrades())

.Do(Takeprofit1);


В итоге след лог:
Цитата:

12:35:54.283 | | OS | Стратегия запущена.
12:36:05.438 | | OS | лонг
12:36:05.446 | | MQS | Стратегия запущена.
12:36:06.276 | | MQS | Регистрация новой заявки на Buy с ценой 145005 и объемом 1.
12:36:06.293 | | MQS | Заявка 45347685 на Buy отправлена с ценой 145005 объемом 1.
12:36:07.134 | | OS | Новая Buy сделка 460581557 по цене 145005 на 1 заявки 45347685.
12:36:07.138 | | MQS | Котируемая заявка 45347685 исполнилась.
12:36:07.138 | | MQS | Регистрация новой заявки на Buy с ценой 145005 и объемом 1.
12:36:07.141 | | MQS | Заявка 45347686 на Buy отправлена с ценой 145005 объемом 1.
12:36:07.145 | | MQS | Позиция изменилась на 1.
12:36:07.145 | | MQS | Заканчиваем котирование с неисполненным объемом равный 0.
12:36:07.147 | | MQS | Стратегия останавливается.
12:36:07.149 | | MQS | Заканчиваем котирование с неисполненным объемом равный 0.
12:36:07.149 | | MQS | Заканчиваем котирование с неисполненным объемом равный 0.
12:36:07.151 | | MQS | Стратегия остановлена.


Сделка продит два раза - первый из основной стратегии, второй раз из котирования. Плюс не срабатывает событие новых сделок по стратегии.


Будет фикс для защитных стратегий.
Спасибо:
< 1 2 

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

loading
clippy