← 返回

Условия возникновения событий Strategy.OrderChange, Strategy.NewOrder, Strategy.NewMyTrades

Каковы условия возникновения этих событий у стратегии по сравнению с аналогичными событиями в Trader?

Они как-то фильтруются по стратегии? Если да, то как?

本主题对您有帮助吗?

分享主题

评论 (82)

登录创建账户, 登录或注册以发表评论

Mikhail Sukhov
Mikhail Sukhov

sergun: Каковы условия возникновения этих событий у стратегии по сравнению с аналогичными событиями в Trader?

Они как-то фильтруются по стратегии? Если да, то как?

Заявка в стратегии регистрируется через Strategy.RegisterOrder. В этом методе она сохраняется в очередь. Далее, мониторятся события ITrader. Если пришла заявка, которая есть в этой очереди - вызвать событие. Все.

sergun
sergun 作者

Mikhail Sukhov:

sergun: Каковы условия возникновения этих событий у стратегии по сравнению с аналогичными событиями в Trader?

Они как-то фильтруются по стратегии? Если да, то как?

Заявка в стратегии регистрируется через Strategy.RegisterOrder. В этом методе она сохраняется в очередь. Далее, мониторятся события ITrader. Если пришла заявка, которая есть в этой очереди - вызвать событие. Все.

Прикол состоит в том, что Strategy.RegisterOrder protected, а желание было использовать его снаружи стратегии и соответственно intellisense его не показал :-)

М.б. (не утверждаю) ему лучше быть public'ом...

PS. Уведомления с нового форума приходят со ссылкой http://192.168.1.1...

Mikhail Sukhov
Mikhail Sukhov

sergun: Прикол состоит в том, что Strategy.RegisterOrder protected, а желание было использовать его снаружи стратегии и соответственно intellisense его не показал :-)

М.б. (не утверждаю) ему лучше быть public'ом...

Приведите Ваш сценарий, почему решили управлять стратегией из вне.

sergun: PS. Уведомления с нового форума приходят со ссылкой http://192.168.1.1...

Можете мне форварднуть письмо?

sergun
sergun 作者

Mikhail Sukhov:

sergun: Прикол состоит в том, что Strategy.RegisterOrder protected, а желание было использовать его снаружи стратегии и соответственно intellisense его не показал :-)

М.б. (не утверждаю) ему лучше быть public'ом...

Приведите Ваш сценарий, почему решили управлять стратегией из вне.

В целом иногда функциональность своей стратегии разбить на куски для обеспечения повторной используемости кусков, борьбы со сложностью. Соответственно образуется новый класс, в конструктор передается стратегия.

sergun: PS. Уведомления с нового форума приходят со ссылкой http://192.168.1.1...

Можете мне форварднуть письмо?

Форварднул.

Dmitriy Klimov
Dmitriy Klimov

Добрый день всем!

Надеюсь, мой вопрос по теме: как узнать о появлении новых сделок внутри стратегии? Насколько я знаю, подписаться на события внутри объекта, их генерирующего, нельзя.

У меня ситаация такая: при каждом входе в позицию я хочу выставлять Квик-заявку типа QuikStopConditionTypes.TakeProfitStopLimit. И мне надо знать, когда сработает одно из заданных условий, и появится новая сделка, чтобы не дать самой стратегии пытаться выйти из уже закрытой позиции.

И еще второй вопрос: как отменить выставленную TakeProfitStopLimit заявку, если я вышел из позиции по условиям стратегии?

Еще было бы любопытно знать, насколько такой подход работает быстрее, чем пакетная стратегия из стратегий на тейк-профит и скользящего стоп-лосса? Возможно, лучше использовать стратегии для моих целей? Тогда и с событиями проблем не будет...

Mikhail Sukhov
Mikhail Sukhov

Dmitriy Klimov: как узнать о появлении новых сделок внутри стратегии? Насколько я знаю, подписаться на события внутри объекта, их генерирующего, нельзя.

Не понял выражение... Событие Strategy.NewMyTrade.

Dmitriy Klimov: при каждом входе в позицию я хочу выставлять Квик-заявку типа QuikStopConditionTypes.TakeProfitStopLimit.

Выставляете через Strategy.RegisterOrder?

Dmitriy Klimov: И еще второй вопрос: как отменить выставленную TakeProfitStopLimit заявку, если я вышел из позиции по условиям стратегии?

QuikTrader.CancelOrder

Dmitriy Klimov: Еще было бы любопытно знать, насколько такой подход работает быстрее, чем пакетная стратегия из стратегий на тейк-профит и скользящего стоп-лосса?

Не в скорости дело. То, что пишется через Strategy, Вы можете менять под свои условия. А через брокерские стопы Вы так сделать не можете. Так что если достаточно стандартных стопов - лучше их. Со стоп заявками стратегии работают так же, как и с обычными заявками.

Dmitriy Klimov
Dmitriy Klimov

Mikhail Sukhov:

Dmitriy Klimov: как узнать о появлении новых сделок внутри стратегии? Насколько я знаю, подписаться на события внутри объекта, их генерирующего, нельзя.

Не понял выражение... Событие Strategy.NewMyTrade.

Dmitriy Klimov: при каждом входе в позицию я хочу выставлять Квик-заявку типа QuikStopConditionTypes.TakeProfitStopLimit.

Выставляете через Strategy.RegisterOrder?

Стоп-заявку выставляю через Strategy.RegisterOrder и не соображу, как лучше перехватить событие ее срабатывания внутри стратегии. Событие Strategy.NewMyTrade я могу использовать только из главной программы, а мне надо по сути то же событие перехватить внутри стратегии, это событие генерирующее. Как быть в данном случае? До версии 2.1 был метод Strategy.OnNewMyTrades, сейчас подобного метода нет...

Mikhail Sukhov
Mikhail Sukhov

Dmitriy Klimov: Стоп-заявку выставляю через Strategy.RegisterOrder и не соображу, как лучше перехватить событие ее срабатывания внутри стратегии. Событие Strategy.NewMyTrade я могу использовать только из главной программы, а мне надо по сути то же событие перехватить внутри стратегии, это событие генерирующее. Как быть в данном случае? До версии 2.1 был метод Strategy.OnNewMyTrades, сейчас подобного метода нет...

public class MyStrategy : Strategy
{
  public MyStrategy()
  {
    base.NewMyTrade += OnNewMyTrade;
  }
  
  private void OnNewMyTrade(MyTrade trade)
  {
  }
}

Только учтите, сделка приходит не по стоп заявке, а по обычной, которую выставил стоп.

Dmitriy Klimov
Dmitriy Klimov

Mikhail Sukhov:

Dmitriy Klimov: Стоп-заявку выставляю через Strategy.RegisterOrder и не соображу, как лучше перехватить событие ее срабатывания внутри стратегии. Событие Strategy.NewMyTrade я могу использовать только из главной программы, а мне надо по сути то же событие перехватить внутри стратегии, это событие генерирующее. Как быть в данном случае? До версии 2.1 был метод Strategy.OnNewMyTrades, сейчас подобного метода нет...

public class MyStrategy : Strategy { public MyStrategy() { base.NewMyTrade += OnNewMyTrade; }

private void OnNewMyTrade(MyTrade trade) }

> 
> Только учтите, сделка приходит не по стоп заявке, а по обычной, которую выставил стоп.
Понял. Спасибо! Не знал, что так можно...
Dmitriy Klimov
Dmitriy Klimov

Mikhail Sukhov:

Dmitriy Klimov: И еще второй вопрос: как отменить выставленную TakeProfitStopLimit заявку, если я вышел из позиции по условиям стратегии?

QuikTrader.CancelOrder

Михаил, можно ли такую заявку снять с помощью Strategy.CancelActiveOrders? У меня почему-то не получилось. Или условные заявки снимаются только через QuikTrader.CancelOrder?

sergun
sergun 作者

Что-то не возникают события Strategy.NewMyTrades и Strategy.OrderChanged при исполнении заявки. Strategy.NewOrder приходит. Заявка регистрировалась с помощью Strategy.RegisterOrder.

С чем это может быть связано?

Mikhail Sukhov
Mikhail Sukhov

sergun: Что-то не возникают события Strategy.NewMyTrades и Strategy.OrderChanged при исполнении заявки. Strategy.NewOrder приходит. Заявка регистрировалась с помощью Strategy.RegisterOrder.

С чем это может быть связано?

А заявка удовлетворяется? Экспорт запущен? Через ITrader события для такой заявки приходят?

sergun
sergun 作者

Mikhail Sukhov:

sergun: Что-то не возникают события Strategy.NewMyTrades и Strategy.OrderChanged при исполнении заявки. Strategy.NewOrder приходит. Заявка регистрировалась с помощью Strategy.RegisterOrder.

С чем это может быть связано?

А заявка удовлетворяется? Экспорт запущен? Через ITrader события для такой заявки приходят?

Удовлетворяется. Экспорт запущен с помощью метода StartExport. (Он запускает экспорт в т.ч. и сделок? Кстати в мануле не укажите конкретно что именно экспортируется этим методом, а то там "и т.д.") Через ITrader.NewMyTrades пока не проверял.

sergun
sergun 作者

sergun:

Mikhail Sukhov:

sergun: Что-то не возникают события Strategy.NewMyTrades и Strategy.OrderChanged при исполнении заявки. Strategy.NewOrder приходит. Заявка регистрировалась с помощью Strategy.RegisterOrder.

С чем это может быть связано?

А заявка удовлетворяется? Экспорт запущен? Через ITrader события для такой заявки приходят?

Удовлетворяется. Экспорт запущен с помощью метода StartExport. (Он запускает экспорт в т.ч. и сделок? Кстати в мануле не укажите конкретно что именно экспортируется этим методом, а то там "и т.д.") Через ITrader.NewMyTrades пока не проверял.

Проверил, через ITrader.NewMyTrades не приходят.. т.е. при старте экспорта сюда сваливаются имеющиеся на тот момент мои сделки, а новые НЕ приходят....

Mikhail Sukhov
Mikhail Sukhov

sergun: Проверил, через ITrader.NewMyTrades не приходят.. т.е. при старте экспорта сюда сваливаются имеющиеся на тот момент мои сделки, а новые НЕ приходят....

ProcessDataError молчит? NewOrders OrdersChanged - приходят? Если запустите Sample и сделайте парочку заявок - сделки придут?

sergun
sergun 作者

Mikhail Sukhov:

sergun: Проверил, через ITrader.NewMyTrades не приходят.. т.е. при старте экспорта сюда сваливаются имеющиеся на тот момент мои сделки, а новые НЕ приходят....

ProcessDataError молчит? NewOrders OrdersChanged - приходят? Если запустите Sample и сделайте парочку заявок - сделки придут?

Сам Квик матерится на таблицу "Позиция по деривативам", говорит что что-то переполнено и экспорт таблицы остановлен, правда я эту таблицу особенно и не использую. в CustomDataError данные сообщения не попадают.

Все очень странно.

Все обработчики событий в Strategy я оборачиваю в lock для некоторого lockObject стратегии. Реагирую в т.ч. на Strategy.NewTrades. Может поток NewTrades не пущает более редкие события типа NewMyTrades?

Кстати все свойства и методы Strategy и ITrader thread-safe?

sergun
sergun 作者

Mikhail Sukhov:

sergun: Проверил, через ITrader.NewMyTrades не приходят.. т.е. при старте экспорта сюда сваливаются имеющиеся на тот момент мои сделки, а новые НЕ приходят....

ProcessDataError молчит? NewOrders OrdersChanged - приходят? Если запустите Sample и сделайте парочку заявок - сделки придут?

В Sample - приходят.

Не пойму что у меня не так.. Ну никак не вижу приход этих событий у себя.. И логгинг и брейкпоинт. Повторюсь - делаю критические секции на обработку всех событий и в т.ч. на весьма плотное событие NewTrades.

sergun
sergun 作者

sergun:

Mikhail Sukhov:

sergun: Проверил, через ITrader.NewMyTrades не приходят.. т.е. при старте экспорта сюда сваливаются имеющиеся на тот момент мои сделки, а новые НЕ приходят....

ProcessDataError молчит? NewOrders OrdersChanged - приходят? Если запустите Sample и сделайте парочку заявок - сделки придут?

В Sample - приходят.

Не пойму что у меня не так.. Ну никак не вижу приход этих событий у себя.. И логгинг и брейкпоинт. Повторюсь - делаю критические секции на обработку всех событий и в т.ч. на весьма плотное событие NewTrades.

Михаил, обращаю Ваше внимание, что проблема решилась отказом от асинхронного режима.. (проблема заключалась в том что не возникали события OrdersChanged, NewMyTrades.. Только NewOrders) Трудно предположить, что я его не так использую, т.к. в предыдущих версиях квикшарпа им успешно пользовался. Если баг, с Вас пиво )))

Mikhail Sukhov
Mikhail Sukhov

sergun: Михаил, обращаю Ваше внимание, что проблема решилась отказом от асинхронного режима.. (проблема заключалась в том что не возникали события OrdersChanged, NewMyTrades.. Только NewOrders) Трудно предположить, что я его не так использую, т.к. в предыдущих версиях квикшарпа им успешно пользовался. Если баг, с Вас пиво )))

В асинхронном режиме не возникали события у ITrader или у Strategy? Или у тех и у тех?

sergun
sergun 作者

Mikhail Sukhov:

sergun: Михаил, обращаю Ваше внимание, что проблема решилась отказом от асинхронного режима.. (проблема заключалась в том что не возникали события OrdersChanged, NewMyTrades.. Только NewOrders) Трудно предположить, что я его не так использую, т.к. в предыдущих версиях квикшарпа им успешно пользовался. Если баг, с Вас пиво )))

В асинхронном режиме не возникали события у ITrader или у Strategy? Или у тех и у тех?

У стратегии 100% ни разу не возникали. У трейдера подписывался только на NewMyTrades.. Обработчик вызвался только как-то один раз.

sergun
sergun 作者

sergun:

Mikhail Sukhov:

sergun: Михаил, обращаю Ваше внимание, что проблема решилась отказом от асинхронного режима.. (проблема заключалась в том что не возникали события OrdersChanged, NewMyTrades.. Только NewOrders) Трудно предположить, что я его не так использую, т.к. в предыдущих версиях квикшарпа им успешно пользовался. Если баг, с Вас пиво )))

В асинхронном режиме не возникали события у ITrader или у Strategy? Или у тех и у тех?

У стратегии 100% ни разу не возникали. У трейдера подписывался только на NewMyTrades.. Обработчик вызвался только как-то один раз. Кстати по задумке NewOrders вызывается и нужен только для асинхронного режима?

Mikhail Sukhov
Mikhail Sukhov

sergun: Кстати по задумке NewOrders вызывается и нужен только для асинхронного режима?

Нет, для обоих... Я проверил сценарий. Все вызывается. Можете как-то локализовать проблему? Потому что, если я создаю стратегию, и регистрирую в ней заявку по рыночной цене, то все события вызыываются на ура. IsAsyncMode = true.

Есть еще подозрения, что может быть где-то обработчик на данные события еще есть и он кидает исключение. А с событиями такая ситуация. Если впереди стоящий в цепочке подписки выбросил исключение, то дальше уже никто событие не получит.

Если не в этом дело, то надо выделать проблемное место путем тестов.

sergun
sergun 作者

Mikhail Sukhov:

sergun: Кстати по задумке NewOrders вызывается и нужен только для асинхронного режима?

Нет, для обоих... Я проверил сценарий. Все вызывается. Можете как-то локализовать проблему? Потому что, если я создаю стратегию, и регистрирую в ней заявку по рыночной цене, то все события вызыываются на ура. IsAsyncMode = true.

Есть еще подозрения, что может быть где-то обработчик на данные события еще есть и он кидает исключение. А с событиями такая ситуация. Если впереди стоящий в цепочке подписки выбросил исключение, то дальше уже никто событие не получит.

Если не в этом дело, то надо выделать проблемное место путем тестов.

Снова возникла такая ситуация. Но уже в синхронном режиме. Симптом - по заявке не приходят никакие события у стратегии (NewMyTrades, NewOrder, OrderChanged).. У QuikTrader пришло событие NewMyTrades, остальные события у трейдера не обрабатывал. Сейчас добавил обработчики и логирование. Если еще возникнет ситуация скажу вызвались ли..

Но вот у Strategy- глухо.

Dmitriy Klimov
Dmitriy Klimov

Михаил, после выставления через Strategy.RegisterOrder условной заявки типа QuikStopConditionTypes.TakeProfitStopLimit, стратегия не получает события о совершении сделки по этой заявки. Как заставить стратегию, PositionManager и другие менеджеры учитывать эти сделки?

Я так понимаю, стратегия отслеживает исполнения только тех заявок, которые она сама выставляет. А так как условная заявка генерирует свои заявки после выполнения заданного условия, то такие сделки стратегия игнорирует. Как вы посоветуете решать такие задачи? Самому подписываться на BaseTrader.NewMyTrades? Тогда как быть с расчетом позиции и профита в стратегии?

Mikhail Sukhov
Mikhail Sukhov

Strategy умеет отслеживать появления заявок по стоп-заявкам. Тоесть, если через Strategy.RegisterOrder зарегистрировать стоп заявку, то при ее активации в Strategy.Order появится производная заявка. А вот сделки я не проверял, но, судя по коду, и это должно работать. Лучше начнем с простого. Приходил ли событие Strategy.NewOrder для производной заявки?

Dmitriy Klimov
Dmitriy Klimov

Mikhail Sukhov: Strategy умеет отслеживать появления заявок по стоп-заявкам. Тоесть, если через Strategy.RegisterOrder зарегистрировать стоп заявку, то при ее активации в Strategy.Order появится производная заявка. А вот сделки я не проверял, но, судя по коду, и это должно работать. Лучше начнем с простого. Приходил ли событие Strategy.NewOrder для производной заявки? Регистрирую через Strategy.RegisterOrder. При этом такая заявка не попадает в Strategy.StopOrders и при осуществлении сделок по этим заявкам событие Strategy.NewMyTrades не возникает. Strategy.NewOrder не проверял, завтра проверю...

Mikhail Sukhov
Mikhail Sukhov

Dmitriy Klimov: Регистрирую через Strategy.RegisterOrder. При этом такая заявка не попадает в Strategy.StopOrders

В StopOrders она попадет после успешной регистрации, то есть когда будет событие Strategy.NewStopOrder.

Dmitriy Klimov
Dmitriy Klimov

Mikhail Sukhov: В StopOrders она попадет после успешной регистрации, то есть когда будет событие Strategy.NewStopOrder. Проверял при возникновении события BaseTrader.StopOrdersChanged. По идее, раз это событие возникает, то в Strategy.StopOrders что-то должно быть. Но массив был всегда пустой....

Mikhail Sukhov
Mikhail Sukhov

Dmitriy Klimov:

Mikhail Sukhov: В StopOrders она попадет после успешной регистрации, то есть когда будет событие Strategy.NewStopOrder. Проверял при возникновении события BaseTrader.StopOrdersChanged. По идее, раз это событие возникает, то в Strategy.StopOrders что-то должно быть. Но массив был всегда пустой....

Приведите весь код проверки. Такое быть не может. В начале идет добавление в коллекцию Strategy.StopOrders, затем уже вызов события. Хоть что-то, но должно быть. Иначе и вызова не будет.

Dmitriy Klimov
Dmitriy Klimov

Mikhail Sukhov: Приведите весь код проверки. Такое быть не может. В начале идет добавление в коллекцию Strategy.StopOrders, затем уже вызов события. Хоть что-то, но должно быть. Иначе и вызова не будет. Делаю так:


class MyStrategy : Strategy
{
        protected override void OnRunning()
        {
            Trader.StopOrdersChanged += OnStopOrderChanged;

            base.OnRunning();
        }

        private void OnStopOrderChanged(IEnumerable<Order> orders)
        {
            File.AppendAllText("StopOrders.txt", "Stop orders: " + base.StopOrders.Count.ToString() + Environment.NewLine);
        }
}

До этого еще пытался подписываться на Strategy.StopOrderChanged, но это событие так ни разу и не возникло. Условные стоп-заявки в Квике выставляются и исполняются нормально, только вот мой робот об этом ничего не знает 🤨 Что-то делаю не так?

Mikhail Sukhov
Mikhail Sukhov

Dmitriy Klimov: До этого еще пытался подписываться на Strategy.StopOrderChanged, но это событие так ни разу и не возникло. Условные стоп-заявки в Квике выставляются и исполняются нормально, только вот мой робот об этом ничего не знает 🤨 Что-то делаю не так?

И не нужно было с Strategy.StopOrderChanged уходить, потому что это как раз правильное событие. А как регистрируете заявку?

Dmitriy Klimov
Dmitriy Klimov

Mikhail Sukhov: И не нужно было с Strategy.StopOrderChanged уходить, потому что это как раз правильное событие. А как регистрируете заявку? В стратегии регистрирую так:


            Order order = base.CreateOrder(direction, stopLossPrice, trade.Volume);
            order.Type = OrderTypes.Conditional;
            order.StopCondition = new QuikStopCondition
            {
                Type = QuikStopConditionTypes.TakeProfitStopLimit,
                StopPrice = takeProfitPrice,
                StopLimitPrice = stopLossLimitPrice,
                Offset = offsetUnit,
                Spread = spreadtUnit
            };

            base.RegisterOrder(order);

Mikhail Sukhov
Mikhail Sukhov

Сорри за длительные интервалы в ответах. Сейчас занят новой версией...

Да, багу нашел. В текущей фиксить не хочу, так как отнимет время. 2.5 планирую выпустить на этой неделе. Нормально?

sergun
sergun 作者

Mikhail Sukhov: Сорри за длительные интервалы в ответах. Сейчас занят новой версией...

Да, багу нашел. В текущей фиксить не хочу, так как отнимет время. 2.5 планирую выпустить на этой неделе. Нормально?

Михаил, а бага касается и моей проблемы, проявившейся в асинхронном режиме?

Mikhail Sukhov
Mikhail Sukhov

А вот тут нет. Я так и не нашел багу. Сам лично работают только в аинхронном режиме (стопы вообще не использую). Ни не встречал, чтобы не приходили нотификации. У Вас стабильно не приходит событие (если да, то это будет совсем просто)? Может поробуете локализовать проблему? Сделайте небольшую программу с одной стратегией и регистрацией заявки. Если все работает - добавляйте логику из текущего робота.

Dmitriy Klimov
Dmitriy Klimov

Mikhail Sukhov: А вот тут нет. Я так и не нашел багу. Сам лично работают только в аинхронном режиме (стопы вообще не использую). Ни не встречал, чтобы не приходили нотификации. У Вас стабильно не приходит событие (если да, то это будет совсем просто)? Может поробуете локализовать проблему? Сделайте небольшую программу с одной стратегией и регистрацией заявки. Если все работает - добавляйте логику из текущего робота. Да, так и поступлю. Сделаю простейший робот для теста.

sergun
sergun 作者

Mikhail Sukhov: А вот тут нет. Я так и не нашел багу. Сам лично работают только в аинхронном режиме (стопы вообще не использую). Ни не встречал, чтобы не приходили нотификации. У Вас стабильно не приходит событие (если да, то это будет совсем просто)? Может поробуете локализовать проблему? Сделайте небольшую программу с одной стратегией и регистрацией заявки. Если все работает - добавляйте логику из текущего робота.

Да, стабильно, не из разряда гайзенбаг :-) Разгребу дела и попробую.

Смотрю, Дмитрий тоже решил заняться этим вопросом ;)

Mikhail Sukhov
Mikhail Sukhov

Dmitriy Klimov:

Mikhail Sukhov: А вот тут нет. Я так и не нашел багу. Сам лично работают только в аинхронном режиме (стопы вообще не использую). Ни не встречал, чтобы не приходили нотификации. У Вас стабильно не приходит событие (если да, то это будет совсем просто)? Может поробуете локализовать проблему? Сделайте небольшую программу с одной стратегией и регистрацией заявки. Если все работает - добавляйте логику из текущего робота. Да, так и поступлю. Сделаю простейший робот для теста.

Стойте, это не Вам ответ. Сорри что убрал цетирование. Это ответ sergun-у. С Вашей ошибкой все понятно, нашел и ее устраняю.

Dmitriy Klimov
Dmitriy Klimov

Mikhail Sukhov: Стойте, это не Вам ответ. Сорри что убрал цетирование. Это ответ sergun-у. С Вашей ошибкой все понятно, нашел и ее устраняю. Михаил, простите что беспокою понапрасну. Но когда можно ожидать исправление ошибки?

Mikhail Sukhov
Mikhail Sukhov

Dmitriy Klimov:

Mikhail Sukhov: Стойте, это не Вам ответ. Сорри что убрал цетирование. Это ответ sergun-у. С Вашей ошибкой все понятно, нашел и ее устраняю. Михаил, простите что беспокою понапрасну. Но когда можно ожидать исправление ошибки?

Чуть выше я писал, что на этой неделе. Теперь точнее - пятница.

sergun
sergun 作者

Mikhail Sukhov:

Dmitriy Klimov:

Mikhail Sukhov: Стойте, это не Вам ответ. Сорри что убрал цетирование. Это ответ 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

Про сделки - НИЧЕГО.

Михаил, может это даст какую-нибудь наводку?

Mikhail Sukhov
Mikhail Sukhov

sergun: Судя по логу вызывается только следующее: 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.

Все же мне кажется надо идти по пути упрощения кода. Выделить проблемный участок путем убирания и тестирования. Так какая то фантастика получается, в которой уже просто сложно разобраться. Где глючит, что боит - не понятно. Выделите стратегию в отдельный проект и потестируйте ее под нагрузкой на демо счете.

Dmitriy Klimov
Dmitriy Klimov

Нашел лог с последних торгов. Strategy.NewOrder от условных стоп-заявок тоже не возникает...

Dmitriy Klimov
Dmitriy Klimov

Михаил, проблема с условными стоп-заявками так и не решилась. После выставления чере стратегию заявки типа QuikStopConditionTypes.TakeProfitStopLimit и совершения сделки по этой заявки, у меня не возникают события Strategy.StopOrderChanged и Strategy.NewMyTrades. Соответственно, Strategy.PositionManager тоже не в курсе, что стратегия уже не в позиции.

Как быть? Самому пока дописывать класс Strategy, или вам недолго поправить эту ошибку?

Mikhail Sukhov
Mikhail Sukhov

Dmitriy Klimov: Михаил, проблема с условными стоп-заявками так и не решилась. После выставления чере стратегию заявки типа 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();

Событие вызывалось. Такой пример у Вас работает?

Dmitriy Klimov
Dmitriy Klimov

Mikhail Sukhov: Я проверял на таком примере:

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;

    public StopOrderStrategy() 
        : base()
    {
        base.Volume = 1;
    }

    protected override void OnRunning()
    {
        base.NewMyTrades += OnNewMyTrades;
        base.StopOrderChanged += OnStopOrderChanged;

        base.OnRunning();
    }

    protected override void OnStopping()
    {
        base.NewMyTrades -= OnNewMyTrades;
        base.StopOrderChanged -= OnStopOrderChanged;

        base.OnStopping();
    }

    protected override bool OnProcess()
    {
        if (base.ProcessState == StrategyProcessStates.Stopping)
        {
            base.CancelActiveOrders();

            return false;
        }

        return true;
    }

    public void MakeTrade(OrderDirections direction)
    {
        double price = base.Security.GetMarketPrice(direction, MarketPriceTypes.Following);

        Order order = base.CreateOrder(direction, price, this.Volume);

        var strategy = new MarketQuotingStrategy(order, new Unit(), new Unit());
        strategy.IsForts = true;
        strategy.Start();
        base.ChildStrategies.Add(strategy);
    }

    private void OnNewMyTrades(IEnumerable<MyTrade> trades)
    {
        foreach (var trade in trades)
        {
            File.AppendAllText("Trades.txt", trade.Trade.Time.ToString() + " " + trade.Order.Direction.ToString() + " " + trade.Trade.Price.ToString() + Environment.NewLine);
        }

        if (base.PositionManager.Position != 0)
        {
            // protect current position with stop order
            CreateTakeProfitAndStopLimit();
        }
    }

    private void OnStopOrderChanged(Order order)
    {
        File.AppendAllText("StopOrders.txt", "Stop Order: " + base.StopOrders.Count.ToString() + ": " + Environment.NewLine);
        File.AppendAllText("StopOrders.txt", order.Time.ToString() + " " + order.Direction.ToString() + " " + order.Price.ToString() + Environment.NewLine);
    }

    private void CreateTakeProfitAndStopLimit()
    {
        MyTrade myTrade = base.MyTrades.Last<MyTrade>();
        Trade trade = myTrade.Trade;
        OrderDirections tradeDirection = myTrade.Order.Direction;

        Unit offsetUnit = new Unit(this.Offset);
        Unit spreadtUnit = new Unit(this.Spread);

        OrderDirections direction = (tradeDirection == OrderDirections.Buy ? OrderDirections.Sell : OrderDirections.Buy);
        double takeProfitPrice = trade.Price;
        double stopLossLimitPrice = trade.Price;
        double stopLossPrice = trade.Price;

        if (tradeDirection == OrderDirections.Buy)
        {
            takeProfitPrice += this.TakeProfit;
            stopLossLimitPrice -= this.StopLoss;
            stopLossPrice = stopLossLimitPrice - this.Spread;
        }
        else
        {
            takeProfitPrice -= this.TakeProfit;
            stopLossLimitPrice += this.StopLoss;
            stopLossPrice = stopLossLimitPrice + this.Spread;
        }

        Order order = base.CreateOrder(direction, stopLossPrice, trade.Volume);
        order.Type = OrderTypes.Conditional;
        order.StopCondition = new QuikStopCondition
        {
            Type = QuikStopConditionTypes.TakeProfitStopLimit,
            StopPrice = takeProfitPrice,
            StopLimitPrice = stopLossLimitPrice,
            Offset = offsetUnit,
            Spread = spreadtUnit
        };

        base.RegisterOrder(order);
    }
}

}


Котирование инициализирую после запуска стратегии методом MakeTrade из главного окна.
Mikhail Sukhov
Mikhail Sukhov

Да, по сути делаю все то же самое. Написал даже отдельную тестовую стратегию, которая после котирования выставляет такую условную заявку. В Квике заявка появляется и срабатывает, но в стратегии ни одно событие на нее не реагирует. Ума не приложу, что не так. Привожу полный код стратегии на всякий случай:

Нашел ситуацию, когда NewOrder + NewMyTrades у Strategy не вызывалось (бывает иногда так, что заявки приходят быстрее чем обновляет стоп). Если это Ваша ошибка, то хорошо. В остальном код рабочий. У меня стабильно вызывалось событие Strategy.StopOrderChanged. Если оно у Вас не вызывается, то я бы порекомендовал посмотреть на QuikTrader.ProcessDataError.

К понедельнику выложу обновление.

Dmitriy Klimov
Dmitriy Klimov

Mikhail Sukhov: Нашел ситуацию, когда NewOrder + NewMyTrades у Strategy не вызывалось (бывает иногда так, что заявки приходят быстрее чем обновляет стоп). Если это Ваша ошибка, то хорошо. В остальном код рабочий. У меня стабильно вызывалось событие Strategy.StopOrderChanged. Если оно у Вас не вызывается, то я бы порекомендовал посмотреть на QuikTrader.ProcessDataError.

К понедельнику выложу обновление.

Михаил, я обновился до последней версии S#, но у меня события Strategy.NewStopOrder и Strategy.StopOrderChanged так и не возникают. QuikTrader.ProcessDataError выводит только это:

System.ArgumentException: Элемент с тем же ключом уже был добавлен.
   в System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)
   в System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
   в Ecng.Trading.Quik.QuikTrader.#=qXtQgb_1Ivhr4cZlEBJS4ADM1O1bKVoCg9CtJr5uqcrk=.#=qwlIQWfo3qufLtkzLgdg_0w==(IList`1 #=qxm4X8NPgjxU5efFmY7R3Lw==, Func`2 #=qVtb7jPsPoFV1EKgfGAxHlw==)
   в Ecng.Trading.Quik.DdeTable.#=qy8NUWUI7mXZMNnXZFsWcYg==(IList`1 #=qkc1RQGHvGXkONrB1lfHMpw==, Action`2 #=qe7FTlw34xv_zxSllAk2THw==, Action`1 #=qyr$xSlYGt0D7OlEnBcjGtw==)
System.InvalidOperationException: Инструмент с кодом MRKHG для бумажной позиции не найден.
   в Ecng.Trading.Quik.QuikTrader.#=qXtQgb_1Ivhr4cZlEBJS4ADM1O1bKVoCg9CtJr5uqcrk=.#=qXkUJcA3Ro6L4MDrPNg5BmA==(IList`1 #=qHmE5DnVpWK_g0VXdi3KT9A==, Func`2 #=qNjk1r8Yt4irfrN9i3uAhYw==)
   в Ecng.Trading.Quik.DdeTable.#=qy8NUWUI7mXZMNnXZFsWcYg==(IList`1 #=qkc1RQGHvGXkONrB1lfHMpw==, Action`2 #=qe7FTlw34xv_zxSllAk2THw==, Action`1 #=qyr$xSlYGt0D7OlEnBcjGtw==)

Подписался еще на Strategy.Log. В нем тоже нет событий о выставлении стоп-заявки и ее исполнении. Хотя эта заявка успешно в Квик выставляется и исполняется. Уже не знаю, в какую сторону копать. Мистика какая-то. У вас работает, у меня - нет. Еще есть идеи?

Mikhail Sukhov
Mikhail Sukhov

Dmitriy Klimov: Михаил, я обновился до последней версии S#, но у меня события Strategy.NewStopOrder и Strategy.StopOrderChanged так и не возникают.

На Вашем примере тестил. Так что видимо ошибка где-то в другом месте.

Dmitriy Klimov: QuikTrader.ProcessDataError выводит только это:

QuikTrader.ProcessDataError - это сигнал к тому, что что-то не то в программе. Тут не может быть только.

Dmitriy Klimov: ...

Говорит о том, что по ДДЕ пришла два раза информация об одной и той же заявки (мало вероятно) или у вас в колонке TransId имеются дублирующиеся значения (более вероятно).

Dmitriy Klimov: ...

Как насчет того, чтобы добавить инструмент в таблицу Инструментов?

Dmitriy Klimov
Dmitriy Klimov

Mikhail Sukhov: QuikTrader.ProcessDataError - это сигнал к тому, что что-то не то в программе. Тут не может быть только. Отфильтровал таблицу "Позиции по бумагам" по счетам депо, ошибки исчезли. Но события от стоп-заявок так и не возникают. Что еще можно попробовать?

Mikhail Sukhov
Mikhail Sukhov

Dmitriy Klimov:

Mikhail Sukhov: QuikTrader.ProcessDataError - это сигнал к тому, что что-то не то в программе. Тут не может быть только. Отфильтровал таблицу "Позиции по бумагам" по счетам депо, ошибки исчезли. Но события от стоп-заявок так и не возникают. Что еще можно попробовать?

Все исчезли? Первая была связана вовсе не с позицией, а как раз с заявками.

Dmitriy Klimov
Dmitriy Klimov

Mikhail Sukhov:

Dmitriy Klimov:

Mikhail Sukhov: QuikTrader.ProcessDataError - это сигнал к тому, что что-то не то в программе. Тут не может быть только. Отфильтровал таблицу "Позиции по бумагам" по счетам депо, ошибки исчезли. Но события от стоп-заявок так и не возникают. Что еще можно попробовать?

Все исчезли? Первая была связана вовсе не с позицией, а как раз с заявками. Да, все исчезли. В таблице Заявки были заявки, сделанные через привод Quot Pro. Похоже, заявки, выставленные через него, имели одинаковое значение поля "ID транзакции".

Mikhail Sukhov
Mikhail Sukhov

Дмитрий,

приношу свои извинения за качества моего тестирования. Я сейчас написал отдельное приложение, где все сделал "с нуля" для Вашей стратегии. Действительно, она StopOrderChanged не вызывался. Причина оказалось в QuikTrader.AsyncMode = false. В своих тестах я использую только асинхронный режим. Переключился на него, события стали работать. Прикладываю свой пример с исходниками. Проверьте, чтобы точно убедиться, что Ваша причина в том же самом.

Dmitriy Klimov
Dmitriy Klimov

Mikhail Sukhov: Дмитрий,

приношу свои извинения за качества моего тестирования. Я сейчас написал отдельное приложение, где все сделал "с нуля" для Вашей стратегии. Действительно, она StopOrderChanged не вызывался. Причина оказалось в QuikTrader.AsyncMode = false. В своих тестах я использую только асинхронный режим. Переключился на него, события стали работать. Прикладываю свой пример с исходниками. Проверьте, чтобы точно убедиться, что Ваша причина в том же самом. Михаил, ваш пример у меня не заработал. Заявки почему-то не принимались биржей. Но тем не менее, проблема решилась, когда я выставил QuikTrader.AsyncMode = true. Буду тестировать дальше в асинхронном режиме. Спасибо за то, что смогли разобраться.

Mikhail Sukhov
Mikhail Sukhov

Dmitriy Klimov:

Mikhail Sukhov: Дмитрий,

приношу свои извинения за качества моего тестирования. Я сейчас написал отдельное приложение, где все сделал "с нуля" для Вашей стратегии. Действительно, она StopOrderChanged не вызывался. Причина оказалось в QuikTrader.AsyncMode = false. В своих тестах я использую только асинхронный режим. Переключился на него, события стали работать. Прикладываю свой пример с исходниками. Проверьте, чтобы точно убедиться, что Ваша причина в том же самом. Михаил, ваш пример у меня не заработал. Заявки почему-то не принимались биржей. Но тем не менее, проблема решилась, когда я выставил QuikTrader.AsyncMode = true. Буду тестировать дальше в асинхронном режиме. Спасибо за то, что смогли разобраться.

А Вы можете написать причину, почему не принимались?

Dmitriy Klimov
Dmitriy Klimov

Mikhail Sukhov:

Dmitriy Klimov:

Mikhail Sukhov: Дмитрий,

приношу свои извинения за качества моего тестирования. Я сейчас написал отдельное приложение, где все сделал "с нуля" для Вашей стратегии. Действительно, она StopOrderChanged не вызывался. Причина оказалось в QuikTrader.AsyncMode = false. В своих тестах я использую только асинхронный режим. Переключился на него, события стали работать. Прикладываю свой пример с исходниками. Проверьте, чтобы точно убедиться, что Ваша причина в том же самом. Михаил, ваш пример у меня не заработал. Заявки почему-то не принимались биржей. Но тем не менее, проблема решилась, когда я выставил QuikTrader.AsyncMode = true. Буду тестировать дальше в асинхронном режиме. Спасибо за то, что смогли разобраться.

А Вы можете написать причину, почему не принимались? Если честно, сам не понял. Поменял в вашем коде только инструмент и значения StopLoss и TakeProfit.

Mikhail Sukhov
Mikhail Sukhov

Dmitriy Klimov: Если честно, сам не понял. Поменял в вашем коде только инструмент и значения StopLoss и TakeProfit.

А Вы можете посмотреть? Там достаточно лишь вывести само тело ошибки в MessageBox. Если это проигнорировать сейчас потом может оказаться новой ошибкой.😀

Dmitriy Klimov
Dmitriy Klimov

Mikhail Sukhov:

Dmitriy Klimov: Если честно, сам не понял. Поменял в вашем коде только инструмент и значения StopLoss и TakeProfit.

А Вы можете посмотреть? Там достаточно лишь вывести само тело ошибки в MessageBox. Если это проигнорировать сейчас потом может оказаться новой ошибкой.😀 Говорит, что я не могу торговать на выбранном счете. Попробовал счет сам указывать так:

trader.NewPortfolios += portfolios =>
            {
                _pf = portfolios.First(p => p.Name.Contains("SPBFUTХХХХХ"));
            };

но выходит такая ошибка при подключении: http://screencast.com/t/i4ksJFg96Z. Хотя тот же код нормально работает в моей программе. Так и не понял, в чем прикол.

Mikhail Sukhov
Mikhail Sukhov

Dmitriy Klimov:

Mikhail Sukhov:

Dmitriy Klimov: Если честно, сам не понял. Поменял в вашем коде только инструмент и значения StopLoss и TakeProfit.

А Вы можете посмотреть? Там достаточно лишь вывести само тело ошибки в MessageBox. Если это проигнорировать сейчас потом может оказаться новой ошибкой.😀 Говорит, что я не могу торговать на выбранном счете.

Потому что возвращался первый попавшийся портфель. Видимо для Вашего случая он был не форцовый.

Dmitriy Klimov: Попробовал счет сам указывать так:

trader.NewPortfolios += portfolios => { _pf = portfolios.First(p => p.Name.Contains("SPBFUTХХХХХ")); };

> но выходит такая ошибка при подключении: http://screencast.com/t/i4ksJFg96Z. Хотя тот же код нормально работает в моей программе. Так и не понял, в чем прикол.

Так писать вообще не верно. Вы полагаетесь на то, что в событие придут сразу все портфели. А это событие появление **новых** портфелей.
Dmitriy Klimov
Dmitriy Klimov

Попробовал подписать на события NewStopOrders, StopOrdersChanged, StopOrdersFailed у QuikTrader. Возникает только событие StopOrdersChanged. NewStopOrders возникло всего один раз, и туда пришла старая стоп-заяка. Новых не было. Почему у стратегии не возникает хотя бы StopOrdersChanged, не понятно...

freelancer
freelancer

У меня та же ситуация. Тему прочитал... При исполнении QuikStopConditionTypes.TakeProfitStopLimit сделки не приходят ни в Strategy.NewMyTrades, ни в baseTrader.NewMyTrades Стоит IsAsyncMode = true

Mikhail Sukhov
Mikhail Sukhov

freelancer: У меня та же ситуация. Тему прочитал... При исполнении QuikStopConditionTypes.TakeProfitStopLimit сделки не приходят ни в Strategy.NewMyTrades, ни в baseTrader.NewMyTrades Стоит IsAsyncMode = true

ITrader.NewStopOrders + ITrader.StopOrdersChanged вызываются?

freelancer
freelancer

Mikhail Sukhov: ITrader.NewStopOrders + ITrader.StopOrdersChanged вызываются? Да. Сначала NewStopOrders, потом StopOrdersChanged

Mikhail Sukhov
Mikhail Sukhov

freelancer:

Mikhail Sukhov: ITrader.NewStopOrders + ITrader.StopOrdersChanged вызываются? Да. Сначала NewStopOrders, потом StopOrdersChanged

Как регистрируете заявку.

freelancer
freelancer

Mikhail Sukhov: Как регистрируете заявку.

private Order CreateTakeProfitAndStopLimit(decimal price, bool IsBuy, decimal? stopPrice, decimal? profit, Unit spread, int volume)
{
    return new Order
    {
        Type = OrderTypes.Conditional,
        Volume = volume,
        Price = price,
        Security = this.Security,
        Portfolio = this.Portfolio,
        Direction = IsBuy ? OrderDirections.Buy : OrderDirections.Sell,
        StopCondition = new QuikStopCondition
        {
            Type = QuikStopConditionTypes.TakeProfitStopLimit,
            ExpiryDate = null,
            StopPrice = profit,
            StopLimitPrice = stopPrice,
            Offset = new Unit(decimal.Zero),
            Spread = spread,
            ActiveTime = null,
        },
    };
}
var TP_SL = CreateTakeProfitAndStopLimit(candle.OpenPrice - stopLoss - slippage, false, candle.OpenPrice - stopLoss, candle.OpenPrice + takeProfit, new Unit(slippage), Volume);
RegisterOrder(TP_SL);
Mikhail Sukhov
Mikhail Sukhov

RegisterOrder который у Trader или у Strategy?

freelancer
freelancer

Mikhail Sukhov: RegisterOrder который у Trader или у Strategy? Strategy

Mikhail Sukhov
Mikhail Sukhov

freelancer:

Mikhail Sukhov: RegisterOrder который у Trader или у Strategy? Strategy

А Strategy.NewStopOrder + StopOrderChanged вызывается? Приходит ли заявка, сгеренированная стопом через Strategy.NewOrder?

freelancer
freelancer

Mikhail Sukhov: А Strategy.NewStopOrder + StopOrderChanged вызывается? Приходит ли заявка, сгеренированная стопом через Strategy.NewOrder? Вызываются. Нет, не приходит

freelancer
freelancer

Из-за чего это может быть ?

Mikhail Sukhov
Mikhail Sukhov

freelancer: Из-за чего это может быть ?

Попробуйте выставить стоп-заявку вне стратегии, через ITrader. И посмотрите, приходит ли производная заявка через NewOrders и сделка по ней.

freelancer
freelancer

Не приходит ни то, ни то

Mikhail Sukhov
Mikhail Sukhov

freelancer: Не приходит ни то, ни то

Ага, уже понятнее. А ProcessDataError что выводит?

freelancer
freelancer

Молчит 😒

Mikhail Sukhov
Mikhail Sukhov

freelancer: Молчит 😒

Уже теряюсь в догадках... А стоп заявка вообще срабатывает? Заявка появляется в таблице Заявки?

freelancer
freelancer

Ну конечно. Может что-то с выгрузкой ? Сейчас ``` _trader.Terminal.StartDde(_trader.SecuritiesTable, _trader.DerivativePositionsTable, _trader.MyTradesTable, _trader.TradesTable, _trader.StopOrdersTable, _trader.EquityPortfoliosTable, _trader.EquityPositionsTable);

Mikhail Sukhov
Mikhail Sukhov

freelancer: Ну конечно. Может что-то с выгрузкой ? Сейчас ``` _trader.Terminal.StartDde(_trader.SecuritiesTable, _trader.DerivativePositionsTable, _trader.MyTradesTable, _trader.TradesTable, _trader.StopOrdersTable, _trader.EquityPortfoliosTable, _trader.EquityPositionsTable);


🙂 А где экспорт заявок?

И зачем писать такой длинный код, если можно проще - _trader.StartExport()
freelancer
freelancer

Хотел минимизировать кол-во выгружаемых таблиц :) StartExport() - это выгрузка всех таблиц, как я понимаю ?

freelancer
freelancer

То же самое всё...

Mikhail Sukhov
Mikhail Sukhov

freelancer: То же самое всё...

Запустите пример Sample и из него зарегистрируйте стоп заявку. Посмотрите, какие таблицы не совпадают с Квик.

freelancer
freelancer

Mikhail Sukhov: Запустите пример Sample и из него зарегистрируйте стоп заявку. Посмотрите, какие таблицы не совпадают с Квик. В примере всё отлично. Буду копать пример (но там не стратегия)

Mikhail Sukhov
Mikhail Sukhov

freelancer:

Mikhail Sukhov: Запустите пример Sample и из него зарегистрируйте стоп заявку. Посмотрите, какие таблицы не совпадают с Квик. В примере всё отлично. Буду копать пример (но там не стратегия)

Я просил код ваш проверить то не на стратегии.