← Voltar

Получение размера позиции

Как получить позу по бумаге при инициализации стратегии? Пример на базе 2-го урока. В таком случае суммируются все позиции по всему содержимому портфеля: Position = ConnectionInterFace.SelectedPortfolio.GetPosition(),

Этот замороченный, да и не работает: Position = ConnectionInterFace.SelectedSecurity.Trader.GetPosition(ConnectionInterFace.SelectedPortfolio, ConnectionInterFace.SelectedSecurity)

Este tópico foi útil?

Compartilhar tópico

Comentários (18)

Entrar ou Criar conta, Faça login ou cadastre-se para deixar um comentário

Buratino
Buratino Autor

Вот такая запись возвращает ноль, хотя открытые позиции на момент инициализации стратегии есть:

Position = ConnectionInterFace.SafeConnection.Trader.GetPosition(ConnectionInterFace.SelectedPortfolio, ConnectionInterFace.SelectedSecurity).CurrentValue,

IvanB
IvanB

Buratino: Как получить позу по бумаге при инициализации стратегии? Пример на базе 2-го урока. В таком случае суммируются все позиции по всему содержимому портфеля: Position = ConnectionInterFace.SelectedPortfolio.GetPosition(),

Этот замороченный, да и не работает: Position = ConnectionInterFace.SelectedSecurity.Trader.GetPosition(ConnectionInterFace.SelectedPortfolio, ConnectionInterFace.SelectedSecurity) Попробуйте просмотреть все значения в коллекции свойства Positions объекта ConnectionInterFace.SelectedSecurity.Trader, разумеется, после подключения к терминалу/платформе.

Buratino
Buratino Autor

IvanB:

Buratino: Как получить позу по бумаге при инициализации стратегии? Пример на базе 2-го урока. В таком случае суммируются все позиции по всему содержимому портфеля: Position = ConnectionInterFace.SelectedPortfolio.GetPosition(),

Этот замороченный, да и не работает: Position = ConnectionInterFace.SelectedSecurity.Trader.GetPosition(ConnectionInterFace.SelectedPortfolio, ConnectionInterFace.SelectedSecurity) Попробуйте просмотреть все значения в коллекции свойства Positions объекта ConnectionInterFace.SelectedSecurity.Trader, разумеется, после подключения к терминалу/платформе.

На брейкпоинте Trader показывает корректные позиции, но в стратегию они не передаются. Следуя структуре Трейдера, передаю позицию следующим образом:

Position = ConnectionInterFace.SafeConnection.Trader.Positions.FirstOrDefault(p => p.Security == ConnectionInterFace.SelectedSecurity).CurrentValue;

Однако Position всё разно инициализируется нулём.

IvanB
IvanB

Buratino: На брейкпоинте Trader показывает корректные позиции, но в стратегию они не передаются. Следуя структуре Трейдера, передаю позицию следующим образом:

Position = ConnectionInterFace.SafeConnection.Trader.Positions.FirstOrDefault(p => p.Security == ConnectionInterFace.SelectedSecurity).CurrentValue;

Однако Position всё разно инициализируется нулём. Может быть код:


Position = ConnectionInterFace.SafeConnection.Trader.Positions.FirstOrDefault(p => p.Security == ConnectionInterFace.SelectedSecurity).CurrentValue;

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

Buratino
Buratino Autor

IvanB:

Buratino: На брейкпоинте Trader показывает корректные позиции, но в стратегию они не передаются. Следуя структуре Трейдера, передаю позицию следующим образом:

Position = ConnectionInterFace.SafeConnection.Trader.Positions.FirstOrDefault(p => p.Security == ConnectionInterFace.SelectedSecurity).CurrentValue;

Однако Position всё разно инициализируется нулём. Может быть код:

Position = ConnectionInterFace.SafeConnection.Trader.Positions.FirstOrDefault(p => p.Security == ConnectionInterFace.SelectedSecurity).CurrentValue;

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

Я этот код поставил непосредственно перед созданием стратегии. Точка остановки показывает верную позицию в переменной. Может эту конструкцию резоннее переносить во внутрь, в метод OnStarted?
IvanB
IvanB

Buratino: Я этот код поставил непосредственно перед созданием стратегии. Точка остановки показывает верную позицию в переменной. Может эту конструкцию резоннее переносить во внутрь, в метод OnStarted? Можно, конечно, но тем не менее, позиции из трейдера должны адекватно приниматься и внутри стратегии. Один и тот-же трейдер, к которому обращаетесь в стратегии (позиции не верны) и вне стратегии (позиции верны)? Можно проверить простым сравнением.

Axell
Axell

У меня тоже не работает Trader.GetPosition(Portfolio, Security)🤬 Достаю позу с помощью Trader.Positions.FirstOrDefault(s => s.Security == Security).CurrentValue

Mikhail Sukhov
Mikhail Sukhov

Axell: У меня тоже не работает Trader.GetPosition(Portfolio, Security)🤬 Достаю позу с помощью Trader.Positions.FirstOrDefault(s => s.Security == Security).CurrentValue

Первый способ что возвращает в вашей ситуации? И что возвращает второй?

Axell
Axell

Первый возвращает 0, второй "Текущий остаток" из таблицы "Позиции по бумагам" в Квике. В 4.2.2.2 ничего не поменялось :(

Axell
Axell

В 4.2.2.6 метод ITrader.GetPosition()(Получить позицию по портфелю и инструменту) как и прежде не работает :(

Mikhail Sukhov
Mikhail Sukhov

Axell: В 4.2.2.6 метод ITrader.GetPosition()(Получить позицию по портфелю и инструменту) как и прежде не работает :(

Выбрасывает исключение? Приведите текст.

Axell
Axell

Исключения не выбрасывает, выводит 0, хотя позиция есть. Приходится по прежнему использовать Connector.Positions.FirstOrDefault(p => p.Security == s).CurrentValue

Mikhail Sukhov
Mikhail Sukhov

Axell: Исключения не выбрасывает, выводит 0, хотя позиция есть. Приходится по прежнему использовать Connector.Positions.FirstOrDefault(p => p.Security == s).CurrentValue

Так может там портфели разные? В GetPosition вы передаете портфель. А в LINQ запросы вы портфель не используете.

Axell
Axell

Похоже я разобрался, при вызове метода GetPosition() нужно ОБЯЗАТЕЛЬНО указывать счёт depoName, иначе выводится 0. Наверное надо метод или документацию подправить.

К сожалению только сейчас нашёл http://stocksharp.com/forum/3143/Trader-GetPosition-nie-rabotaiet/

Mikhail Sukhov
Mikhail Sukhov

Axell: Похоже я разобрался, при вызове метода GetPosition() нужно ОБЯЗАТЕЛЬНО указывать счёт depoName, иначе выводится 0. Наверное надо метод или документацию подправить.

Документация все верно отражает. Вы видимо не понимаете смысл депозитария и что это такое.

Axell
Axell

Михаил Сухов: Документация все верно отражает. Вы видимо не понимаете смысл депозитария и что это такое.

Возможно я хуже вас понимаю смысл депозитария, но позвольте возразить. В документации написано к методу ITrader.GetPosition написано: "depoName (Optional) Тип: В сетиSystem.String Название депозитария, где находится физически ценная бумага. По-умолчанию передается пустая строка, что означает суммарную позицию по всем депозитариям." Тогда почему при передаче пустой строки или "", метод не возвращает суммарную позицию по всем депозитариям? Брокер Церих.

Slepoy
Slepoy

Вставлю свои 5 копеек по теме. Как раз сегодня разбирался с данной штукой. Выводы сделал следующие. <u>Есть два способа грузануть открытые позиции Квика в бота: </u>

  1. Перебрать коллекцию Connector.Positions
  2. Использовать метод Connector.GetPosition()

По второму способу скажу следующее: никогда не пользуйтесь им ))). Никогда не пользуйтесь методом GetPosition(), вообще забудьте про него, т.к. метод очень хитрый. Если по каким-либо причинам, он не найдёт вам нужную позицию, то он тупо сам создаст новую! То есть, он на основе переданной ему инфы: портфель, инструмент и т.д. - создаст новый полупустой объект-позицию, и засунет его в коллекцию Connector.Positions. Итого у вас в коллекции появится левая полупустая позиция ))). И если у вас такой метод используется в нескольких стратегиях, то он вам везде создаст кучу таких полупустых объектов. Он захламит коллекцию Connector.Positions. Вы полностью запутайтесь, и запросто ваш код может из коллекции вынуть такой полупустой объект, в котором позиция нулевая, и на её основе принять неверное фатальное решение. Это реальная опасность! Так что забудьте про этот метод, лучше его не применять. Если хотите создать объект-позицию сами? Без проблем - воспользуйтесь обычным конструктором класса Позишен. Кстати, на акциях данный метод в демо-Квике не пашет, возвращет новый созданный полупустой объект ))). Почему не пашет? Ну скорей всего из-за того, что коннектор Квика путает названия у инструментов при создании объектов-позиций, об этом чуть ниже пойдёт речь.

В общем, лучше использовать способ номер 1, т.е. перебирать коллецию коннектора Connector.Positions: this.Position = Connector.Positions.FirstOrDefault(p => p.Security == Security) == null ? 0 : (Connector.Positions.FirstOrDefault(p => p.Security == Security).CurrentValue ?? 0);

Для фьючей - работает замечательно! А вот с акциями - беда! Коннектор Квика - путает инструменты. Например, возьмём сбер. Если запросить вручную инструмент сбер, код SBER, то в бота в коллекцию Connector.Securities подгрузятся следующие объекты:

  1. {SBER@MICEX}
  2. {SBER@QJSIM}
  3. {SBER-ME@EQRP_INFO}
  4. {SBER@EQRP_INFO}
  5. {SBERP@EQRP_INFO}
  6. {SBERP@QJSIM} Из 6 объектов-инструментов, мы к примеру торгуем по {SBER@QJSIM}. К примеру, мы по данному инструменту откроем в демо-квике 19 лотов лонга. Далее, запустим бота и попытаемся их подгрузить в нашу стратегию. Поставим точку остановки после строки "this.Position = Connector.Positions.FirstOrDefault(p => p.Security == Security) == null ? 0 : (Connector.Positions.FirstOrDefault(p => p.Security == Security).CurrentValue ?? 0);" и поглядим чего у нас находится в переменных и коллекциях. А будет следующее: метод FirstOrDefault() не найдёт совпадений в коллекции Connector.Positions и выдаст нам нулл. Если мы глянем коллекцию Connector.Positions, то в ней мы не найдём объект-позицию с инструментом {SBER@QJSIM}. Мы там найдём другой объект-позицию, с инструментом {SBER@MICEX} по которому как раз и будут висеть наши открытые 19 лотов. То есть, произошла путаница инструментов! Кстати, у обоих инструментов один и тот же код. Я не знаю счем это связано, возможно Квик так присылает инфу, а может так инфу заполняем коннектор СтокШарпа. Ведь объекты-позиции он создаёт сам, и возможно путает инструменты именно по коду. Короче, я не знаю на чьей стороне баг. С другими акциями, где встречается несколько одинаковых кодов, такая же хрень, с лукойлом например. А вот с фьючами - всё нормально, т.к. нет одноимённых названий, там нечего перепутать ))). В общем, я акциями не торгую т.е. мне данный баг по барабану ))) А фьючи работают нормально и так. Будут ли разработчики править данный баг - я не знаю, просто сегодня я на него случайно напоролся и решил что лучше сообщить о сей находке. Ниже скрин с демонстрацией проблемы. http://stocksharp.ru/file/104117
ljob
ljob

Всё ещё актуально