Каковы условия возникновения этих событий у стратегии по сравнению с аналогичными событиями в Trader?
Они как-то фильтруются по стратегии? Если да, то как?
Каковы условия возникновения этих событий у стратегии по сравнению с аналогичными событиями в Trader?
Они как-то фильтруются по стратегии? Если да, то как?
评论 (82)
登录 或 创建账户, 登录或注册以发表评论
Заявка в стратегии регистрируется через Strategy.RegisterOrder. В этом методе она сохраняется в очередь. Далее, мониторятся события ITrader. Если пришла заявка, которая есть в этой очереди - вызвать событие. Все.
Прикол состоит в том, что Strategy.RegisterOrder protected, а желание было использовать его снаружи стратегии и соответственно intellisense его не показал :-)
М.б. (не утверждаю) ему лучше быть public'ом...
PS. Уведомления с нового форума приходят со ссылкой http://192.168.1.1...
Приведите Ваш сценарий, почему решили управлять стратегией из вне.
Можете мне форварднуть письмо?
Добрый день всем!
Надеюсь, мой вопрос по теме: как узнать о появлении новых сделок внутри стратегии? Насколько я знаю, подписаться на события внутри объекта, их генерирующего, нельзя.
У меня ситаация такая: при каждом входе в позицию я хочу выставлять Квик-заявку типа QuikStopConditionTypes.TakeProfitStopLimit. И мне надо знать, когда сработает одно из заданных условий, и появится новая сделка, чтобы не дать самой стратегии пытаться выйти из уже закрытой позиции.
И еще второй вопрос: как отменить выставленную TakeProfitStopLimit заявку, если я вышел из позиции по условиям стратегии?
Еще было бы любопытно знать, насколько такой подход работает быстрее, чем пакетная стратегия из стратегий на тейк-профит и скользящего стоп-лосса? Возможно, лучше использовать стратегии для моих целей? Тогда и с событиями проблем не будет...
Не понял выражение... Событие Strategy.NewMyTrade.
Выставляете через Strategy.RegisterOrder?
QuikTrader.CancelOrder
Не в скорости дело. То, что пишется через Strategy, Вы можете менять под свои условия. А через брокерские стопы Вы так сделать не можете. Так что если достаточно стандартных стопов - лучше их. Со стоп заявками стратегии работают так же, как и с обычными заявками.
Стоп-заявку выставляю через Strategy.RegisterOrder и не соображу, как лучше перехватить событие ее срабатывания внутри стратегии. Событие Strategy.NewMyTrade я могу использовать только из главной программы, а мне надо по сути то же событие перехватить внутри стратегии, это событие генерирующее. Как быть в данном случае? До версии 2.1 был метод Strategy.OnNewMyTrades, сейчас подобного метода нет...
Только учтите, сделка приходит не по стоп заявке, а по обычной, которую выставил стоп.
public class MyStrategy : Strategy { public MyStrategy() { base.NewMyTrade += OnNewMyTrade; }
private void OnNewMyTrade(MyTrade trade) }
Михаил, можно ли такую заявку снять с помощью Strategy.CancelActiveOrders? У меня почему-то не получилось. Или условные заявки снимаются только через QuikTrader.CancelOrder?
Что-то не возникают события Strategy.NewMyTrades и Strategy.OrderChanged при исполнении заявки. Strategy.NewOrder приходит. Заявка регистрировалась с помощью Strategy.RegisterOrder.
С чем это может быть связано?
А заявка удовлетворяется? Экспорт запущен? Через ITrader события для такой заявки приходят?
Удовлетворяется. Экспорт запущен с помощью метода StartExport. (Он запускает экспорт в т.ч. и сделок? Кстати в мануле не укажите конкретно что именно экспортируется этим методом, а то там "и т.д.") Через ITrader.NewMyTrades пока не проверял.
Проверил, через ITrader.NewMyTrades не приходят.. т.е. при старте экспорта сюда сваливаются имеющиеся на тот момент мои сделки, а новые НЕ приходят....
ProcessDataError молчит? NewOrders OrdersChanged - приходят? Если запустите Sample и сделайте парочку заявок - сделки придут?
Сам Квик матерится на таблицу "Позиция по деривативам", говорит что что-то переполнено и экспорт таблицы остановлен, правда я эту таблицу особенно и не использую. в CustomDataError данные сообщения не попадают.
Все очень странно.
Все обработчики событий в Strategy я оборачиваю в lock для некоторого lockObject стратегии. Реагирую в т.ч. на Strategy.NewTrades. Может поток NewTrades не пущает более редкие события типа NewMyTrades?
Кстати все свойства и методы Strategy и ITrader thread-safe?
В Sample - приходят.
Не пойму что у меня не так.. Ну никак не вижу приход этих событий у себя.. И логгинг и брейкпоинт. Повторюсь - делаю критические секции на обработку всех событий и в т.ч. на весьма плотное событие NewTrades.
Михаил, обращаю Ваше внимание, что проблема решилась отказом от асинхронного режима.. (проблема заключалась в том что не возникали события OrdersChanged, NewMyTrades.. Только NewOrders) Трудно предположить, что я его не так использую, т.к. в предыдущих версиях квикшарпа им успешно пользовался. Если баг, с Вас пиво )))
В асинхронном режиме не возникали события у ITrader или у Strategy? Или у тех и у тех?
У стратегии 100% ни разу не возникали. У трейдера подписывался только на NewMyTrades.. Обработчик вызвался только как-то один раз.
Нет, для обоих... Я проверил сценарий. Все вызывается. Можете как-то локализовать проблему? Потому что, если я создаю стратегию, и регистрирую в ней заявку по рыночной цене, то все события вызыываются на ура. IsAsyncMode = true.
Есть еще подозрения, что может быть где-то обработчик на данные события еще есть и он кидает исключение. А с событиями такая ситуация. Если впереди стоящий в цепочке подписки выбросил исключение, то дальше уже никто событие не получит.
Если не в этом дело, то надо выделать проблемное место путем тестов.
Снова возникла такая ситуация. Но уже в синхронном режиме. Симптом - по заявке не приходят никакие события у стратегии (NewMyTrades, NewOrder, OrderChanged).. У QuikTrader пришло событие NewMyTrades, остальные события у трейдера не обрабатывал. Сейчас добавил обработчики и логирование. Если еще возникнет ситуация скажу вызвались ли..
Но вот у Strategy- глухо.
Михаил, после выставления через Strategy.RegisterOrder условной заявки типа QuikStopConditionTypes.TakeProfitStopLimit, стратегия не получает события о совершении сделки по этой заявки. Как заставить стратегию, PositionManager и другие менеджеры учитывать эти сделки?
Я так понимаю, стратегия отслеживает исполнения только тех заявок, которые она сама выставляет. А так как условная заявка генерирует свои заявки после выполнения заданного условия, то такие сделки стратегия игнорирует. Как вы посоветуете решать такие задачи? Самому подписываться на BaseTrader.NewMyTrades? Тогда как быть с расчетом позиции и профита в стратегии?
Strategy умеет отслеживать появления заявок по стоп-заявкам. Тоесть, если через Strategy.RegisterOrder зарегистрировать стоп заявку, то при ее активации в Strategy.Order появится производная заявка. А вот сделки я не проверял, но, судя по коду, и это должно работать. Лучше начнем с простого. Приходил ли событие Strategy.NewOrder для производной заявки?
В StopOrders она попадет после успешной регистрации, то есть когда будет событие Strategy.NewStopOrder.
Приведите весь код проверки. Такое быть не может. В начале идет добавление в коллекцию Strategy.StopOrders, затем уже вызов события. Хоть что-то, но должно быть. Иначе и вызова не будет.
До этого еще пытался подписываться на Strategy.StopOrderChanged, но это событие так ни разу и не возникло. Условные стоп-заявки в Квике выставляются и исполняются нормально, только вот мой робот об этом ничего не знает 🤨 Что-то делаю не так?
И не нужно было с Strategy.StopOrderChanged уходить, потому что это как раз правильное событие. А как регистрируете заявку?
Сорри за длительные интервалы в ответах. Сейчас занят новой версией...
Да, багу нашел. В текущей фиксить не хочу, так как отнимет время. 2.5 планирую выпустить на этой неделе. Нормально?
Михаил, а бага касается и моей проблемы, проявившейся в асинхронном режиме?
А вот тут нет. Я так и не нашел багу. Сам лично работают только в аинхронном режиме (стопы вообще не использую). Ни не встречал, чтобы не приходили нотификации. У Вас стабильно не приходит событие (если да, то это будет совсем просто)? Может поробуете локализовать проблему? Сделайте небольшую программу с одной стратегией и регистрацией заявки. Если все работает - добавляйте логику из текущего робота.
Да, стабильно, не из разряда гайзенбаг :-) Разгребу дела и попробую.
Смотрю, Дмитрий тоже решил заняться этим вопросом ;)
Стойте, это не Вам ответ. Сорри что убрал цетирование. Это ответ sergun-у. С Вашей ошибкой все понятно, нашел и ее устраняю.
Чуть выше я писал, что на этой неделе. Теперь точнее - пятница.
Снова проявился баг (пока я на 2.4). Выставляю заявку, происходит полное исполнение разом. В квике вижу одну сделку. Трейдер и стратегия подписаны на всевозможные события (свои новые сделки, новые заявки, изменение заявок).
Судя по логу вызывается только следующее: 2010-11-01 11:40:06,581 ITrader.NewOrder 2010-11-01 11:40:06,590 ITrader.OrderChanged 2010-11-01 11:40:06,590 ITrader.OrderChanged 2010-11-01 11:40:06,591 ITrader.OrderChanged 2010-11-01 11:40:06,618 Strategy.NewOrder
Про сделки - НИЧЕГО.
Михаил, может это даст какую-нибудь наводку?
Даст, например то, что Strategy.NewOrder вызывается после Trader.OrderChanged, а такое быть не может. Событие одного типа вызывается непрерывно, тоесть после ITrader.NewOrder должно было идти Strategy.NewOrder.
Все же мне кажется надо идти по пути упрощения кода. Выделить проблемный участок путем убирания и тестирования. Так какая то фантастика получается, в которой уже просто сложно разобраться. Где глючит, что боит - не понятно. Выделите стратегию в отдельный проект и потестируйте ее под нагрузкой на демо счете.
Нашел лог с последних торгов. Strategy.NewOrder от условных стоп-заявок тоже не возникает...
Михаил, проблема с условными стоп-заявками так и не решилась. После выставления чере стратегию заявки типа QuikStopConditionTypes.TakeProfitStopLimit и совершения сделки по этой заявки, у меня не возникают события Strategy.StopOrderChanged и Strategy.NewMyTrades. Соответственно, Strategy.PositionManager тоже не в курсе, что стратегия уже не в позиции.
Как быть? Самому пока дописывать класс Strategy, или вам недолго поправить эту ошибку?
Я проверял на таком примере:
Событие вызывалось. Такой пример у Вас работает?
private class MyStrategy : ActionStrategy { public void CreateOrder() { Order order = base.CreateOrder(OrderDirections.Buy, 1600, 1); order.Type = OrderTypes.Conditional; order.StopCondition = new QuikStopCondition { Type = QuikStopConditionTypes.TakeProfitStopLimit, StopPrice = 1600, StopLimitPrice = 1600, Offset = new Unit(), Spread = new Unit() }; } }
...
_strategy.NewStopOrder += o => Debug.WriteLine("NewStopOrder " + o.Id); _strategy.StopOrderChanged += o => Debug.WriteLine("StopOrderChanged " + o.Id);
_strategy.CrateOrder();
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text;
using Ecng.Collections; using Ecng.Trading.Algo; using Ecng.Trading.Algo.Strategies; using Ecng.Trading.BusinessEntities; using Ecng.Trading.Quik;
namespace VolumeStrategy { class StopOrderStrategy : Strategy { public double StopLoss = 20; public double TakeProfit = 40; public double Offset = 5; public double Spread = 5; public int Slippage = 5;
}
Да, по сути делаю все то же самое. Написал даже отдельную тестовую стратегию, которая после котирования выставляет такую условную заявку. В Квике заявка появляется и срабатывает, но в стратегии ни одно событие на нее не реагирует. Ума не приложу, что не так. Привожу полный код стратегии на всякий случай:
Нашел ситуацию, когда NewOrder + NewMyTrades у Strategy не вызывалось (бывает иногда так, что заявки приходят быстрее чем обновляет стоп). Если это Ваша ошибка, то хорошо. В остальном код рабочий. У меня стабильно вызывалось событие Strategy.StopOrderChanged. Если оно у Вас не вызывается, то я бы порекомендовал посмотреть на QuikTrader.ProcessDataError.
К понедельнику выложу обновление.
Михаил, я обновился до последней версии S#, но у меня события Strategy.NewStopOrder и Strategy.StopOrderChanged так и не возникают. QuikTrader.ProcessDataError выводит только это:
Подписался еще на Strategy.Log. В нем тоже нет событий о выставлении стоп-заявки и ее исполнении. Хотя эта заявка успешно в Квик выставляется и исполняется. Уже не знаю, в какую сторону копать. Мистика какая-то. У вас работает, у меня - нет. Еще есть идеи?
На Вашем примере тестил. Так что видимо ошибка где-то в другом месте.
QuikTrader.ProcessDataError - это сигнал к тому, что что-то не то в программе. Тут не может быть только.
Говорит о том, что по ДДЕ пришла два раза информация об одной и той же заявки (мало вероятно) или у вас в колонке TransId имеются дублирующиеся значения (более вероятно).
Как насчет того, чтобы добавить инструмент в таблицу Инструментов?
Все исчезли? Первая была связана вовсе не с позицией, а как раз с заявками.
Дмитрий,
приношу свои извинения за качества моего тестирования. Я сейчас написал отдельное приложение, где все сделал "с нуля" для Вашей стратегии. Действительно, она StopOrderChanged не вызывался. Причина оказалось в QuikTrader.AsyncMode = false. В своих тестах я использую только асинхронный режим. Переключился на него, события стали работать. Прикладываю свой пример с исходниками. Проверьте, чтобы точно убедиться, что Ваша причина в том же самом.
А Вы можете написать причину, почему не принимались?
А Вы можете посмотреть? Там достаточно лишь вывести само тело ошибки в MessageBox. Если это проигнорировать сейчас потом может оказаться новой ошибкой.😀
но выходит такая ошибка при подключении: http://screencast.com/t/i4ksJFg96Z. Хотя тот же код нормально работает в моей программе. Так и не понял, в чем прикол.
Потому что возвращался первый попавшийся портфель. Видимо для Вашего случая он был не форцовый.
trader.NewPortfolios += portfolios => { _pf = portfolios.First(p => p.Name.Contains("SPBFUTХХХХХ")); };
Попробовал подписать на события NewStopOrders, StopOrdersChanged, StopOrdersFailed у QuikTrader. Возникает только событие StopOrdersChanged. NewStopOrders возникло всего один раз, и туда пришла старая стоп-заяка. Новых не было. Почему у стратегии не возникает хотя бы StopOrdersChanged, не понятно...
У меня та же ситуация. Тему прочитал... При исполнении QuikStopConditionTypes.TakeProfitStopLimit сделки не приходят ни в Strategy.NewMyTrades, ни в baseTrader.NewMyTrades Стоит IsAsyncMode = true
ITrader.NewStopOrders + ITrader.StopOrdersChanged вызываются?
Как регистрируете заявку.
RegisterOrder который у Trader или у Strategy?
А Strategy.NewStopOrder + StopOrderChanged вызывается? Приходит ли заявка, сгеренированная стопом через Strategy.NewOrder?
Из-за чего это может быть ?
Попробуйте выставить стоп-заявку вне стратегии, через ITrader. И посмотрите, приходит ли производная заявка через NewOrders и сделка по ней.
Не приходит ни то, ни то
Ага, уже понятнее. А ProcessDataError что выводит?
Молчит 😒
Уже теряюсь в догадках... А стоп заявка вообще срабатывает? Заявка появляется в таблице Заявки?
Ну конечно. Может что-то с выгрузкой ? Сейчас ``` _trader.Terminal.StartDde(_trader.SecuritiesTable, _trader.DerivativePositionsTable, _trader.MyTradesTable, _trader.TradesTable, _trader.StopOrdersTable, _trader.EquityPortfoliosTable, _trader.EquityPositionsTable);
Хотел минимизировать кол-во выгружаемых таблиц :) StartExport() - это выгрузка всех таблиц, как я понимаю ?
То же самое всё...
Запустите пример Sample и из него зарегистрируйте стоп заявку. Посмотрите, какие таблицы не совпадают с Квик.
Я просил код ваш проверить то не на стратегии.