Получение размера позиции
Atom Ответить
25.08.2013


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

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

Теги:


Спасибо:




18 Ответов
Buratino

Фотография
Курсы
Дата: 25.08.2013
Ответить


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

Position = ConnectionInterFace.SafeConnection.Trader.GetPosition(ConnectionInterFace.SelectedPortfolio, ConnectionInterFace.SelectedSecurity).CurrentValue,
Автор топика
Спасибо:

IvanB

Фотография
Дата: 25.08.2013
Ответить


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

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

Попробуйте просмотреть все значения в коллекции свойства Positions объекта ConnectionInterFace.SelectedSecurity.Trader, разумеется, после подключения к терминалу/платформе.
Спасибо:

Buratino

Фотография
Курсы
Дата: 26.08.2013
Ответить


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

Фотография
Дата: 27.08.2013
Ответить


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

Фотография
Курсы
Дата: 27.08.2013
Ответить


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

Фотография
Дата: 29.08.2013
Ответить


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

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

Axell

Фотография
Курсы
Дата: 29.08.2013
Ответить


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

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 29.08.2013
Ответить


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


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

Axell

Фотография
Курсы
Дата: 17.01.2014
Ответить


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

Axell

Фотография
Курсы
Дата: 21.02.2014
Ответить


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

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 21.02.2014
Ответить


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


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

Axell

Фотография
Курсы
Дата: 21.02.2014
Ответить


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

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 21.02.2014
Ответить


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


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

Axell

Фотография
Курсы
Дата: 21.02.2014
Ответить


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

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

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 21.02.2014
Ответить


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


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

Axell

Фотография
Курсы
Дата: 21.02.2014
Ответить


Михаил Сухов Перейти

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


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

Slepoy

Фотография
Дата: 25.01.2017
Ответить


Вставлю свои 5 копеек по теме. Как раз сегодня разбирался с данной штукой. Выводы сделал следующие.
Есть два способа грузануть открытые позиции Квика в бота:
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 лотов. То есть, произошла путаница инструментов! Кстати, у обоих инструментов один и тот же код. Я не знаю счем это связано, возможно Квик так присылает инфу, а может так инфу заполняем коннектор СтокШарпа. Ведь объекты-позиции он создаёт сам, и возможно путает инструменты именно по коду. Короче, я не знаю на чьей стороне баг. С другими акциями, где встречается несколько одинаковых кодов, такая же хрень, с лукойлом например. А вот с фьючами - всё нормально, т.к. нет одноимённых названий, там нечего перепутать ))). В общем, я акциями не торгую т.е. мне данный баг по барабану ))) А фьючи работают нормально и так. Будут ли разработчики править данный баг - я не знаю, просто сегодня я на него случайно напоролся и решил что лучше сообщить о сей находке. Ниже скрин с демонстрацией проблемы.
https://stocksharp.ru/file/104117
Спасибо:

ljob

Фотография
Дата: 21.06.2019
Ответить


Всё ещё актуально
Спасибо:


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy