Как получить позу по бумаге при инициализации стратегии? Пример на базе 2-го урока. В таком случае суммируются все позиции по всему содержимому портфеля: Position = ConnectionInterFace.SelectedPortfolio.GetPosition(),
Этот замороченный, да и не работает: Position = ConnectionInterFace.SelectedSecurity.Trader.GetPosition(ConnectionInterFace.SelectedPortfolio, ConnectionInterFace.SelectedSecurity)
Комментарии (18)
Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий
Вот такая запись возвращает ноль, хотя открытые позиции на момент инициализации стратегии есть:
Position = ConnectionInterFace.SafeConnection.Trader.GetPosition(ConnectionInterFace.SelectedPortfolio, ConnectionInterFace.SelectedSecurity).CurrentValue,
На брейкпоинте 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;
У меня тоже не работает Trader.GetPosition(Portfolio, Security)🤬 Достаю позу с помощью Trader.Positions.FirstOrDefault(s => s.Security == Security).CurrentValue
Первый способ что возвращает в вашей ситуации? И что возвращает второй?
Первый возвращает 0, второй "Текущий остаток" из таблицы "Позиции по бумагам" в Квике. В 4.2.2.2 ничего не поменялось :(
В 4.2.2.6 метод ITrader.GetPosition()(Получить позицию по портфелю и инструменту) как и прежде не работает :(
Выбрасывает исключение? Приведите текст.
Исключения не выбрасывает, выводит 0, хотя позиция есть. Приходится по прежнему использовать Connector.Positions.FirstOrDefault(p => p.Security == s).CurrentValue
Так может там портфели разные? В GetPosition вы передаете портфель. А в LINQ запросы вы портфель не используете.
Похоже я разобрался, при вызове метода GetPosition() нужно ОБЯЗАТЕЛЬНО указывать счёт depoName, иначе выводится 0. Наверное надо метод или документацию подправить.
К сожалению только сейчас нашёл http://stocksharp.com/forum/3143/Trader-GetPosition-nie-rabotaiet/
Документация все верно отражает. Вы видимо не понимаете смысл депозитария и что это такое.
Возможно я хуже вас понимаю смысл депозитария, но позвольте возразить. В документации написано к методу ITrader.GetPosition написано: "depoName (Optional) Тип: В сетиSystem.String Название депозитария, где находится физически ценная бумага. По-умолчанию передается пустая строка, что означает суммарную позицию по всем депозитариям." Тогда почему при передаче пустой строки или "", метод не возвращает суммарную позицию по всем депозитариям? Брокер Церих.
Вставлю свои 5 копеек по теме. Как раз сегодня разбирался с данной штукой. Выводы сделал следующие. <u>Есть два способа грузануть открытые позиции Квика в бота: </u>
По второму способу скажу следующее: никогда не пользуйтесь им ))). Никогда не пользуйтесь методом 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 подгрузятся следующие объекты:
Всё ещё актуально