← 返回

order.State

Почему то всегда возвращает None..хотя состояние меняется..в чём может быть дело?

本主题对您有帮助吗?

分享主题

评论 (41)

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

Mikhail Sukhov
Mikhail Sukhov

Не работает экспорт по таблице Заявки?

Tauler
Tauler

Тоже вопрос по заявкам

у меня нличествует запоздание обновления заявки в ITrader.Order

заявка в квике уже выполнена, а Order.State показывает что она Active. процесс проверки сигналов успевает 3-4 раза проверить сигналы, прежде чем увидит что заявка выполнена, а за это время цены успевают далеко уйти, и реакция на выполение заявки запаздывает. Можно как то процесс обновления состояния заявки ускорить? параметром там какием в квике или еще как?

Tauler
Tauler

Может как то принудитльно запросить стаутс заявки можно?

Mikhail Sukhov
Mikhail Sukhov

В самом Квике как быстро изменяется статус заявки? Мгновенно или тоже с задержкой?

Tauler
Tauler

Да вот черт его знает. Вроде быстро. но ведь исключение при поытке снять выполенную заявку квик ytans2quik генерит?

у меня когд такой

if (order.State == OrderStates.Active) trader.CancelOrder(order)

и тут генерится эксепшн (нет заявки для снятия), хотя у переменной order.State = Active, но в квике она выполнена. а время выполнения с точностью до милисикунд я в квике посмореть не могу

Mikhail Sukhov
Mikhail Sukhov

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

Tauler
Tauler

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

Tauler
Tauler

Где, где, где почитать7 :)))

кстати, опыты показали что на мамбе заявка выполняется за ~100 мс, а на фортс за ~500-600. вот такие пироги.

Mikhail Sukhov
Mikhail Sukhov

http://stockmarketdotnet.blogspot.com/2010/02/s-17.htmlПункт 4. Там и ссылка на Квик форум. Можете поднять тему. Был слух, что они это ограничение хотят снять. Может уже брокеры такое умеют делать в настройках Квик сервера.

Tauler
Tauler

а вы статус заявки чеерз ДДЕ обновляете?

Mikhail Sukhov
Mikhail Sukhov

Конечно... Пройдите по ссылке на Квик форум. Там проблема не в статусе заявки.

Tauler
Tauler

Я уже ходил. ничего не понял :) понял тока что это квик тормозит.

Mikhail Sukhov
Mikhail Sukhov

Там проблема в том, что заявка принята биржей, но реально еще не зарегистрирована в Квик сервере. Поэтому, цена уже изменилась на рынке, ее снимать надо, а он ней информация на сервере отсутствует.

Tauler
Tauler

Ну вот именно это я и понял.

Alexander
Alexander

у меня похожая ситуация возникла - заявка зарегистрировалась, в таблице сделок её состояние уже исполнена, а stock# пишет, что active. 5 минут прошло - и всё active. Или надо на какие-то события дополнительно подписываться, чтобы робот узнал, что сделка исполнилась? Я подписываюсь только на события orderfailed... Соответственно у меня и в PositionManager свойство Position равно 0...

Mikhail Sukhov
Mikhail Sukhov

В таблице сделок или заявок? Нужно запустить экспорт на таблицу заявок.

Alexander
Alexander

Все экспорты запущены (QuikTrader.StartExport()), Order newOrder = CreateOrder(OrderDirections.Sell, openPrice, Volume); Trader.RegisterOrder(newOrder); base.AddOrder(newOrder);

Сделки на рынок выходят, но PositionManager.Position для стратегии (наследуемой от TimeFrameStrategy) не меняется. И при попытке через 5 минут Trader.CancelOrders(null, Account, null, null, Security); выскакивает эксепшен с тем, что нельзя снять заявку. Смотрю по дебагеру - у неё состояние Active, тогда как на бирже - уже исполнена давно (прошло 5 минут). (' не была зарегистрирована. Причина 'Вы не можете снять данную заявку'. Parameter name: transactionTxt)

Mikhail Sukhov
Mikhail Sukhov

ProcessDataError ничего плохого не пишет? Судя по симптомам, экспорт по заявкам не идет.

Alexander
Alexander

Нет, молчит, никаких сообщений не было. Из событий подписан только на Сonnected, ConnectionError, OrdersFailed, ProcessDataError, StopOrdersFailed, NewSecurities.

В какую сторону можно копать? Вечером попробую раз в 5 минут роботом выставлять заявку и следить за статусом. Просто хочется понять в какой стороне искать проблему.

P.S. Verifier показывает что всё нормально настроено.

Mikhail Sukhov
Mikhail Sukhov

А NewMyTrades по заявке приходят? OrdersChanged передает зависшую заявку?

Alexander
Alexander

Спс за наводку, подпишусь на эти события и потестирую вечером. Отпишусь по результатам

Alexander
Alexander

Подписался на эти события - всё стало работать нормально. Только почему-то если шортить 1 контракт и регистрировать эту заявку в стратегии:

               Order newProfitOrder =

CreateOrder(OrderDirections.Sell,

Security.MinPrice, 1);

               Trader.RegisterOrder(newProfitOrder);
                base.AddOrder(newProfitOrder);

PositionManager.Position становится равным -2. Или так и должно быть?

Mikhail Sukhov
Mikhail Sukhov
  1. Думаю, события тут не причем.
  2. Позиция расчитывается по случившимся сделкам, не заявкам.
Alexander
Alexander
  1. Была лишь 1 заявка на 1 лот, т.е. была 1 сделка. Вот распечатка Order при каждом срабатывании события OrdersChanged: Balance (0), CancelTime (), ID (1846739022), InitializationTime (01.07.2010 10:51:36), Price (127615), State (Matched), Status (Done), Time (01.07.2010 10:51:38), TransactionId (39096772), Volume (1), Direction(Sell) Balance (0), CancelTime (), ID (1846739022), InitializationTime (01.07.2010 10:51:36), Price (127615), State (Matched), Status (Done), Time (01.07.2010 10:51:38), TransactionId (39096772), Volume (1), Direction(Sell) Balance (0), CancelTime (), ID (1846739022), InitializationTime (01.07.2010 10:51:36), Price (127615), State (Matched), Status (Done), Time (01.07.2010 10:51:38), TransactionId (39096772), Volume (1), Direction(Sell) Balance (0), CancelTime (), ID (1846739022), InitializationTime (01.07.2010 10:51:36), Price (127615), State (Matched), Status (Done), Time (01.07.2010 10:51:38), TransactionId (39096772), Volume (1), Direction(Sell) Balance (0), CancelTime (), ID (1846739022), InitializationTime (01.07.2010 10:51:36), Price (127615), State (Matched), Status (Done), Time (01.07.2010 10:51:38), TransactionId (39096772), Volume (1), Direction(Sell) Balance (0), CancelTime (), ID (1846739022), InitializationTime (01.07.2010 10:51:36), Price (127615), State (Matched), Status (Done), Time (01.07.2010 10:51:38), TransactionId (39096772), Volume (1), Direction(Sell) Balance (0), CancelTime (), ID (1846743309), InitializationTime (01.07.2010 10:52:00), Price (138585), State (Matched), Status (Done), Time (01.07.2010 10:52:01), TransactionId (39120212), Volume (1), Direction(Buy) Balance (0), CancelTime (), ID (1846743309), InitializationTime (01.07.2010 10:52:00), Price (138585), State (Matched), Status (Done), Time (01.07.2010 10:52:01), TransactionId (39120212), Volume (1), Direction(Buy) Balance (0), CancelTime (), ID (1846743309), InitializationTime (01.07.2010 10:52:00), Price (138585), State (Matched), Status (Done), Time (01.07.2010 10:52:01), TransactionId (39120212), Volume (1), Direction(Buy) Balance (0), CancelTime (), ID (1846743309), InitializationTime (01.07.2010 10:52:00), Price (138585), State (Matched), Status (Done), Time (01.07.2010 10:52:01), TransactionId (39120212), Volume (1), Direction(Buy) Balance (0), CancelTime (), ID (1846743309), InitializationTime (01.07.2010 10:52:00), Price (138585), State (Matched), Status (Done), Time (01.07.2010 10:52:01), TransactionId (39120212), Volume (1), Direction(Buy) Balance (0), CancelTime (), ID (1846743309), InitializationTime (01.07.2010 10:52:00), Price (138585), State (Matched), Status (Done), Time (01.07.2010 10:52:01), TransactionId (39120212), Volume (1), Direction(Buy)

Вначале открыли, потом, на новой минуте - закрыли. Между открытием и закрытием позиции печатал PositionManager.Position, он был равен -2. И ещё, почему событие OrdersChanged вызывается 6 раз для 1 заявки? Вроде был уже такой вопрос в группе, но не смог найти.

Alexander
Alexander

Вот сейчас тоже по стратегии был открыт шорт на 20 лотов и выставлен стоп для шорта на теже 20 лотов. PositionManager.Position равен -40. Чего-то не понимаю видимо я =) Как-то можно получить конкретно эти открытые -20 лотов для стратегии?

On 1 июл, 12:53, Mikhail Sukhov <msou...@gmail.com> wrote:

Alexander
Alexander

Пошёл дальше в исследовании - у меня создаётся MultiTrader, который я и передаю в стратегию и именно его использую для регистрации заявок. Может как раз стоит использовать не его, а добавленный в него QuikTrader. Потому что, возвращаясь к этим 20 лотам шорта - в MyTrades у PositionManager аж 6 сделок отображено. И стоп-сделки, которая сработала, почему-то нет. Хотя и она была туда добавлена:

                               var stopOrder = new Order
                                {
                                    Account = Account,
                                    Type = OrderTypes.Conditional,
                                    Volume = Volume,
                                    Security = Security,
                                    Direction =

OrderDirections.Buy, Price = Security.MaxPrice, StopCondition = new QuikStopCondition { Type =

QuikStopConditionTypes. StopLimit, StopPrice = stopPrice, } }; Trader.RegisterOrder(stopOrder); base.AddOrder(stopOrder);

On 1 июл, 12:53, Mikhail Sukhov <msou...@gmail.com> wrote:

Mikhail Sukhov
Mikhail Sukhov

А сколько реально должно быть сделок? И плюс, ты Вы в курсе, что сделки по стоп заявки быть не должно, только по производной?

On 1 июл, 13:57, Alexander <amukhanch...@gmail.com> wrote:

Mikhail Sukhov
Mikhail Sukhov

Ок, а стоп был с каким направлением? Тоже на шорт или на защиту шорта (тоесть лонг)?

On 1 июл, 13:29, Alexander <amukhanch...@gmail.com> wrote:

Alexander
Alexander

По поводу производной не понял. Я поставил стоп на покупку как видно из текста, т.е. на защиту шорта. Он выставился в систему и уже сработал.

Реально не знаю сколько должно сделок, я хочу, регистрируя в стратегии сделку и получая состояние что она исполнена - получить в PositionManager.Position для данной стратегии столько лотов, сколько у меня было открыто в сделке. Или логика другая?

On 1 июл, 14:09, Mikhail Sukhov <msou...@gmail.com> wrote:

Alexander
Alexander

Идей пока нет, куда можно дальше копать?

Попутно наткнулся на такой эксепшен при попытке вызвать Trader.Disconnect(), где Trader - MultiTrader, куда добавлены 2 AggregatedTraders с одинаковыми QuikTrader (пути совпадают) и разными счетами:

Ecng.Trading.Quik.ApiException was caught Message=Код ошибки DllNotConnected Сообщение DLL is not connected to QUIK. Source=Ecng.Trading.Quik StackTrace: at . (Int32 , StringBuilder ) at . () at Ecng.Trading.Quik.QuikTrader.Disconnect() at Ecng.Trading.Algo.MultiTrader. (IEnumerable1 ) at Ecng.Trading.Algo.MultiTrader. . ( ) at Ecng.Collections.CollectionHelper.SyncDo[TCollection] (TCollection collection, Action1 action) at Ecng.Trading.Algo.MultiTrader. (Action`1 ) at Ecng.Trading.Algo.MultiTrader.Disconnect() at Robots.MainWindow.ConnectBtn_Click(Object sender, RoutedEventArgs e) in C:\Users\Alexander\Documents\Visual Studio 2010\Projects\Robots\Robots\MainWindow.xaml.cs:line 224 InnerException:

Mikhail Sukhov
Mikhail Sukhov

А стоп заявку потом как-нибудь передавали в стратегию? Могли бы Вы еще посмотреть на все свои сделки в системе (ITrader.GetMyTrades(sec)). По ним какая позиция возвращается?

On 1 июл, 14:13, Alexander <amukhanch...@gmail.com> wrote:

Alexander
Alexander

Стоп заявку обязательно передавал в стратегию с помощью base.AddOrder. Вот прям кусок кода:

                                       var stopOrder = new Order
                                                            {

Account = Account,

Type = OrderTypes.Conditional,

Volume = Volume,

Security = Security,

Direction = OrderDirections.Buy,

Price = Security.MaxPrice,

StopCondition = new QuikStopCondition

{

Type =

QuikStopConditionTypes.

StopLimit,

StopPrice = stopPrice, } };

Trader.RegisterOrder(stopOrder); base.AddOrder(stopOrder);

AddLog(StrategyErrorStates.None, "Регистрируем стопзаявку по цене {0}", new object[] );

On 2 июл, 02:38, Mikhail Sukhov <msou...@gmail.com> wrote:

Mikhail Sukhov
Mikhail Sukhov

Готов сразу огорчить - Strategy не умеет работать со стоп заявками. Не делал я в них поддержку - как то все собствеными эмуляциями обходился. Пока не уверен, есть ли время для фикса, так что давайте будем искать пути обхода. Как вариант, расчитывать позицию самостоятельно, через событие ITrader.NewMyTrades. Стоп заявки ессесно где-то сохранять нужно, и смотреть появление производной заявки. Кстати, Вы написали, что не поняли, что это такое. Это

http://stocksharp.com/doc/help/html/P_Ecng_Trading_BusinessEntities_O...

On 2 июл, 02:47, Alexander <amukhanch...@gmail.com> wrote:

Alexander
Alexander

Жаль, буду тогда руками считать, да. неправильный подсчёт позиции через PositionManager ушёл, когда изменил логику, как отписался в соседнем топике, спасибо.

On 2 июл, 12:34, Mikhail Sukhov <msou...@gmail.com> wrote:

Alexander
Alexander

Михаил, хорошая кстати задачка получилась - посчитать активную позицию для стратегии. =) Я пока пришёл к такому варинту, если не прав в рассуждениях - исправьте, пожалуйста.

PositionManager для стратегии может работать только с заявками, стопзаявки не учитываются. Поэтому активная позиция в стратегии равна PositionManager.Position + <число контрактов, сработавших по стопу>. Для этого при выставлении стоп заявки мы не регистрируем её в стратегии (base.AddOrder) (обычные заявки регистрируются в стратегии как раньше), а сохраняем её, для отслеживания что она сработала (условие что DerivedOrder != null). Если сработала - прибавляем число контрактов которое сработало по DerivedOrder. У меня вышло вот что:

ActivePosition = PositionManager.Position + GetStopPosition();

(где GetStopPosition (stopOrders - ThreadSafeObservableCollection<Order> из заявок, зарегистрированных в стратегии):)

   private int GetStopPosition()
    {
        return (from stopOrder in stopOrders
                where stopOrder.DerivedOrder != null
                where stopOrder.DerivedOrder.State ==

OrderStates.Active || stopOrder.DerivedOrder.State == OrderStates.Matched let stopVolume = stopOrder.DerivedOrder.Volume - stopOrder.DerivedOrder.Balance let mult = stopOrder.DerivedOrder.Direction == OrderDirections.Buy ? 1 : -1 select stopVolume*mult).Sum(); }

(или не в LINQ варианте: private int GetStopPosition() { int resultStopPosition = 0;

       foreach (Order stopOrder in stopOrders)
        {
            if (stopOrder.DerivedOrder != null)
            {
                if (stopOrder.DerivedOrder.State ==

OrderStates.Active || stopOrder.DerivedOrder.State == OrderStates.Matched) { int stopVolume = stopOrder.DerivedOrder.Volume

  • stopOrder.DerivedOrder.Balance; int mult = stopOrder.DerivedOrder.Direction == OrderDirections.Buy ? 1 : -1; resultStopPosition += stopVolume*mult; } } }

         return resultStopPosition;
      }
    

)

Всё верно? Таким образом, никаких MyNewTrades отслеживать не придётся (там ведь ещё надо понимать, какие заявки сгенерированы стратегией, а какие - нет. Всё это, конечно, обходится, но весь вопрос в затратах).

On 2 июл, 12:34, Mikhail Sukhov <msou...@gmail.com> wrote:

Alexander
Alexander

Или просто все, не равные null, DerivedOrder от стопов добавлять в стратегию методом base.AddOrder. Они, кстати, проверяются при добавлении на совпадение, т.е. что будет, если добавить одну и туже DerivedOrder заявку через base.AddOrder? Если не проверяются - надо просто хранить список уже добавленных DerivedOrder и проверять при добавлении, что уже не добавили.

On 3 июл, 15:35, Alexander <amukhanch...@gmail.com> wrote:

Mikhail Sukhov
Mikhail Sukhov
  1. Открыл для себя let конструкцию. Или это не C#?
  2. Думаю, стоит проверять лишь на stopOrder.DerivedOrder != null.
  3. Я бы подписался еще и на StopOrdersChanged. Вот там бы дожидался stopOrder.DerivedOrder != null после чего подсчитывал бы позицию уже по обычной заявке.

On 3 июл, 15:35, Alexander <amukhanch...@gmail.com> wrote:

Mikhail Sukhov
Mikhail Sukhov

Нет, не проверяются. Недочет, конечно же. Но попробовать с AddOrder стоит.

On 3 июл, 16:04, Alexander <amukhanch...@gmail.com> wrote:

Alexander
Alexander
  1. Это LINQ запрос был =) Порой на нём проще что-то написать. "let a = b" == "пусть далее в запросе a равно b"
  2. Т.е. дополнительно проверять State не стоит? Это пока я посылаю стоп заявки по маркету на фортсе (по цене верхнего или нижнего лимита), потом может измениться на лимитные цены, потому вроде стоит проверять в любом случае.
  3. Попробую для начала сделать как расписал - внутри стратегии отслеживать, а не через событие. Т.к. у меня к каждому счёту приписана своя отдельная стратегия (т.е. одна стратегия может быть приписана нескольким счетам) - так будет пока проще.

Или через AddOrder, сохраняя все DerivedOrder, которые не равны null. Так даже более интересное решение вышло. =)

Большое спасибо за такую всестороннюю поддержку! С нетерпением жду новой версии. =)

On 5 июл, 13:54, Mikhail Sukhov <msou...@gmail.com> wrote:

Dmitriy Klimov
Dmitriy Klimov

Alexander, к какому конечному решению вы пришли при подсчете активной позиции для стратегии? И что за метод AddOrder? Не нашел такого...

Mikhail Sukhov
Mikhail Sukhov

Dmitriy Klimov: Alexander, к какому конечному решению вы пришли при подсчете активной позиции для стратегии? И что за метод AddOrder? Не нашел такого...

AddOrder благополучно исчез в одной из версий. http://stocksharp.com/doc/help/html/a8159c99-256b-46e4-80fe-7cf92944b4c9.htm Теперь используется Strategy.RegisterOrder