Сделал как в примерах...
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)
Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий
Ждет, пока выполнится условие, что цена вырастет/упадет на заданное значение
Невнимательно документацию прочитал ) для HFT стратегии такое явно не подходит )
тогда возникает вопрос - как из события NewMyTrades определить какая именно сделка прошла? допустим есть условие, по которому выставляются несколько заявок на покупку и по мере их исполнения для каждой покупки выставляется тэйк.
как по событию NewMyTrades определить чем является данная сделка - исполненной покупкой или тэйком? можно ли в комментарии к заявке добавлять buy или Take, к примеру...
У MyTrade есть поле Order, это заявка по которой пришли сделки, при создании заявко можно где-то запоминать их, а потом проверять
Что-то вроде этого?:
По-моему можно как-то более красиво сделать )))
Ну например у каждой заявки есть правило order.NewTrades() и if тогда нафик не нужен. И странное какое то у вас условие... А что если например MyBuy сделка была на 2 лота и они прошли в разных сделках? Тогда у вас условие не выполниться явно...
Сделал подобным образом:
получаю следующий лог:
Почему событие .When(order_buy1.NewTrades()) возникает несколько раз? Изменил на .When(order_buy1.Matched()) - то же самое... просто начинают выставляться тейкпрофиты без остановок.
Ну судя по логам у вас события срабатывают для разных заявок 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.
Сколько контрактов у вас в первоначальной заявке?
Да объем везде 1 контракт... Да и на покупку выставляется только одна заявка order_buy1...
Может причина в том, что условия if внутри метода raschet, который вызывается по событию:
Ну могу вам сказать что это правило я сам лично использую и оно 100% верно. Ищите ошибку в логике программы самой.
Ну собственно вот вся логика:
Давай те вы так сделаете : В методе 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);
И выложите здесь полученные в результате логи.
Сделал...
Сделал...
А вообще может быть, что событие .When(base.Security.Changed()) .Do(raschet);
возникает очень часто и вызывается одновременно в нескольких потоках и из разных потоков выставляется тэйк?
и еще добавил логи след. образом:
В итоге получаю следующий лог:
profts: Ваш метод raschet() откуда вызывается? :)
protected override void OnStarting() { this .When(base.Security.Changed()) .Do(raschet); base.OnStarting(); }
Может быть в этом проблема, два потока могут одновременно зайти и оба прочитать что position = 0 и поставить ордер.
Что же касается вызовов метода NewTrades несколько раз, попробуйте вместо него использовать событие ордера Matched. Т.е. this.When(order_buy1.Matched()).Do(TakeProfit1);
Видимо так и есть... NewTrades генерируется один раз, но одновременно в разных потоках. )
Странно только то, что заявка на покупку выставляется только один раз, хотя следуя этой логике она также должна выставляться несколько раз из разных потоков.
Тогда встает вопрос как это можно обойти, если расчет у меня происходит с частотой появления новых сделок и на основе него появляется условие на совершение сделки. Мне казалось, что .When(base.Security.Changed()) .Do(raschet); выполняется следующий раз только после того, как заканчивается предыдущий расчет, а не одновременно в нескольких потоках.
В смысле одновременно в разных потоках? Оно генерируется столько раз сколько вы на него подписались. Если я напишу вот так
his .When(order_buy1.NewTrades()) .Do(Takeprofit1); his .When(order_buy1.NewTrades()) .Do(Takeprofit1);
То конечно оно несколько раз вызовется. То же будет и в случае с потоками.
Внутри метода raschet делайте все в блоке блокировки, например lock(this)
base.Security.Changed() - вообще какое то странное правило. Вам что нужно ловить новые сделки по инструменту?Тогда исп Security.SecurityNewTrades()
Немного не так меня поняли... появились две сделки по ризу, в двух разных потоках вызывается метод raschet, в каждом из которых генерируется .When(order_buy1.NewTrades()) .Do(Takeprofit1);
Нет я вас так понял. order_buy1 - у вас в разных потоках все равно разный. Это разные заявки. Поэтому и сделка на них приходят разные.
Тьфу ты... Или у вас order_buy1 - глобальный параметр?
Без пол литра в этом коде точно не разобраться)) 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); }; };
Дело в том, что position = 2 присваивается только после отправки тэйка:
Видимо пока position =1 из разных потоков вызывается метод отправки тэйка:
Если меняю на :
Тэйкпрофит выставляется один раз:
Вообще конечно странно...
Если честно сам сейчас задумался для чего я сделал еще одно условие и так и не понял )))
Исправил - все заработало :)))
За такую помощь и поллитра не жалко ))) Спасибо!
Выставляю заявку с помощью MarketQuotingStrategy. Объем 1 лот. В итоге проходит покупка 2-х лотов. лог:
Подобная ошибка появилась впервые. По какой причине стратегия не смогла найти заявку для перестановки? и не совсем понятно по какой причине исполнилось две заявки на покупку.
Попробуйте Security.Exchange.Rts выставить IsSupportAtomicReRegister в false на move посмотрим
Правильно понял? Сделал следующим образом:
В итоге след лог:
Сделка продит два раза - первый из основной стратегии, второй раз из котирования. Плюс не срабатывает событие новых сделок по стратегии.
Правильно понял? Сделал следующим образом:
В итоге след лог:
Сделка продит два раза - первый из основной стратегии, второй раз из котирования. Плюс не срабатывает событие новых сделок по стратегии.
Будет фикс для защитных стратегий.
Обновился до 4.0.6. Котирование вообще перестало работать.
Лог:
Обновитесь до 4.0.7 с codeplex