← Zurück

Trader.GetPosition не работает.

Вечер добрый.

Метод Trader.GetPosition возвращает 0.

Протестировал на вложенном примере Sample.

Скриншот прилагаю.

Если нажать кнопку Портфель, то в новом окне позиции появляются. На скриншоте этому факту соответствует переменная _positionsWindow.

А если вызвать в программе метод Trader.GetPosition, то он выдает результат ноль. На скриншоте этому факту соответствует метод Trader.GetPosition(Trader.Portfolios.ElementAtFromEnd(0), Trader.Securities.ElementAtFromEnd(10))

В чем может быть ошибка?

скриншот

Версия стокшарпа 4.1.4 Квик тестовый.

War dieses Thema hilfreich?

Thema teilen

Kommentare (9)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

Геннадий Ванин (Gennady Vanin)

Maxim: Квик тестовый Терминал QUIK - тестовый? его представляют практически все брокеры

А сервер/соединение чей? от какого брокера (который Email высылал ключи) - БКС (bcs.ru)?

На тестовом сервере КВИК, для инструмента с кодом бумаги LKOH код класса QJSIM, а у Вас (судя по скриншоту) код класса EQBR (сдаётся мне это у БКС такой)

Кстати, я вообще не могу соединиться к учебному доступу БКС на выходных и ночью. Вы смогли?

Кроме того, у БКС такая фишка, что на одном из счетов учебного доступа обычно нет денег и выставлять заявки нельзя или на спотовом рынке (акции, со сёта L01-00000F00), или на срочном (фьючерсы (со счета SPBFUT) и перебросить деньги из одного счёта на другой нельзя.

Кстати, получить тестовый доступ КВИК (который, в отличие от БКС, практически круглосуточный)- минутное дело, там Email с ключами высылает бот и не надо днями ждать, как от БКС

Maxim: Метод Trader.GetPosition возвращает 0 Вообще-то, судя по Вашему скриншоту, он возвращает не ноль а позицию 6014-LKOH@EQBR

А на скриншоте Вы обводите красной линией свойства разных позиций.

Насколько я понимаю, даже, когда соединение устанавливается, то заявки могут не приниматься по одному из типов (площадок) и данные по ним не поступать с сервера. Вот, например, ситуация на тестовом сервере от QUIK на выходных - по акциям заявки принимаются и приходят данные, а по фьючерсам - нет

При этом, я недавно получил доступ, никогда ещё не получал данну по RIZ2, иначе у меня данные по RIZ2 в таблице Инструменты были бы закэшированы (доступны) с предыдущей сессии

Т.е., данные по одним инструментам, по которым получались данные ранее могут быть заполнены (закэшированы из предыдущей, работавшей, сессии ) , а по другим - добавленным, по которым данные не приходили - нет

Экспорт ведь в S# идёт по DDE, т.е. из терминала, а не из сервера

Данные с сервера приходят по акциям, но не по фьючерсам

Maxim: На скриншоте этому факту соответствует метод Trader.GetPosition(Trader.Portfolios.ElementAtFromEnd(0), Trader.Securities.ElementAtFromEnd(10)) Я в Sample (4.1.5) вообще не нахожу ElementAtFromEnd

А в документацции он не описан

Что значит ElementAtFromEnd(10) - взять 10й элемент, начиная отсчёт с конца?

Maxim
Maxim Autor

Геннадий Ванин (Gennady Vanin): А сервер/соединение чей?

Сервер Цериха

Геннадий Ванин (Gennady Vanin): На тестовом сервере КВИК, для инструмента с кодом бумаги LKOH код класса QJSIM, а у Вас (судя по скриншоту) код класса EQBR (сдаётся мне это у БКС такой)

С кодами в терминале все нормально.

Геннадий Ванин (Gennady Vanin): Кстати, я вообще не могу соединиться к учебному доступу БКС на выходных и ночью. Вы смогли?

В Церихе можно и на выходных торговать в тестовом. Кроме срочного рынка.

Геннадий Ванин (Gennady Vanin): Кроме того, у БКС такая фишка, что на одном из счетов учебного доступа обычно нет денег и выставлять заявки нельзя или на спотовом рынке (акции, со сёта L01-00000F00), или на срочном (фьючерсы (со счета SPBFUT) и перебросить деньги из одного счёта на другой нельзя.

Кстати, получить тестовый доступ КВИК (который, в отличие от БКС, практически круглосуточный)- минутное дело, там Email с ключами высылает бот и не надо днями ждать, как от БКС

Это к вопросу не относится. В примере рассматривал только ММВБ.

Геннадий Ванин (Gennady Vanin):

Maxim: Метод Trader.GetPosition возвращает 0 Вообще-то, судя по Вашему скриншоту, он возвращает не ноль а позицию 6014-LKOH@EQBR

А на скриншоте Вы обводите красной линией свойства разных позиций.

Да. Все верно. Не совсем точно сформулировал проблему. Trader.GetPosition возвращает не 0, а возвращает объект Position, в котором все позиции нулевые. Тогда как в Квике они не нулевые.

Геннадий Ванин (Gennady Vanin): Насколько я понимаю, даже, когда соединение устанавливается, то заявки могут не приниматься по одному из типов (площадок) и данные по ним не поступать с сервера. Вот, например, ситуация на тестовом сервере от QUIK на выходных - по акциям заявки принимаются и приходят данные, а по фьючерсам - нет

При этом, я недавно получил доступ, никогда ещё не получал данну по RIZ2, иначе у меня данные по RIZ2 в таблице Инструменты были бы закэшированы (доступны) с предыдущей сессии

Т.е., данные по одним инструментам, по которым получались данные ранее могут быть заполнены (закэшированы из предыдущей, работавшей, сессии ) , а по другим - добавленным, по которым данные не приходили - нет

Экспорт ведь в S# идёт по DDE, т.е. из терминала, а не из сервера

С данными в Квике все нормально. В момент создания скриншота я покупал и продавал LKOH без проблем и данные в таблице поз корректно менялись.

Геннадий Ванин (Gennady Vanin):

Maxim: На скриншоте этому факту соответствует метод Trader.GetPosition(Trader.Portfolios.ElementAtFromEnd(0), Trader.Securities.ElementAtFromEnd(10)) Я в Sample (4.1.5) вообще не нахожу ElementAtFromEnd

А в документацции он не описан

Что значит ElementAtFromEnd(10) - взять 10й элемент, начиная отсчёт с конца?

ElementAtFromEnd — это метод класса Ecng.Collections.CollectionHelper Его описания я не знаю, но из названия можно догадаться, что он делает.

Геннадий, большое спасибо за внимание к моему вопросу. Но, к сожалению, к решению мы не приблизились.

По какой-то причине событие BaseTrader.NewPositions срабатывает и вызывает обновление интерфейса в примере Sample. А если обратиться к методу Trader.GetPosition, то он возвращает позицию с нулевыми значениями.

Maxim
Maxim Autor

Более подробное описание проблемы.

Скриншот1

Скриншот2

На первом скриншоте показано состояние свойства Positions до того, как я нажал зеленую кнопку рефреш напротив выражения QuikS.GetPosition(QuikS.Portfolios.First(),QuikS.Securities.First()).

На втором скриншоте показан результат вычисления QuikS.GetPosition(QuikS.Portfolios.First(),QuikS.Securities.First()) и состояние свойства Positions после этого вычисления.

Исходя из вот этого участка кода в BaseTrade:


var key = new Tuple<Portfolio, Security, string>(portfolio, security, depoName);

if (!_positions.TryGetValue(key, out position))

можно сделать вывод, что при обращении к методу QuikS.GetPosition этот метод никогда не найдет уже существующую позицию, так как создается новый объект Tuple. Этого нового объекта Tuple в ключах _positions еще нет.

Mikhail Sukhov
Mikhail Sukhov

Maxim: Исходя из вот этого участка кода в BaseTrade:

var key = new Tuple<Portfolio, Security, string>(portfolio, security, depoName);

if (!_positions.TryGetValue(key, out position))

> 
> можно сделать вывод, что при обращении к методу QuikS.GetPosition этот метод никогда не найдет
> уже существующую позицию, так как создается новый объект Tuple.
> Этого нового объекта Tuple  в ключах _positions еще нет.

Tuple работает на основе внутренних полей... Думаю проблема тут или в передаваемых данных или просто косяк в проге. Хотя, если честно, вообще ничего не понял из картинок. Какой-то дебаг, какие-то поля. Что хотел сказать автор?🤔 
Maxim
Maxim Autor

Mikhail Sukhov: Какой-то дебаг, какие-то поля. Что хотел сказать автор?🤔

Афтар хотел сказать следующее.

До обращения к методу GetPosition в свойстве Position было четыре объекта.

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

При этом в GetPosition передавался портфель и секьюрити, которые точно есть в в одном из объектов свойства Position

Maxim
Maxim Autor

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

В метод GetPosition надо еще передавать третий параметр DepoName. Он оказался не равен пустой строке.

Геннадий Ванин (Gennady Vanin)

Maxim: В метод GetPosition надо еще передавать третий параметр DepoName Почему я не передаю и у меня нет таких проблем?

А я не передаю DepoName в GetPosition!

esper
esper

Геннадий Ванин (Gennady Vanin): Почему я не передаю и у меня нет таких проблем? DepoName есть только для портфелей по бумагам.

Maxim
Maxim Autor

Потому что у Вас DepoName равно пустой строке, а у меня, по какой-то причине, нет.

Может кому пригодится вот такая строка:


Quik.GetPosition(Portfolio, Security, (String)Portfolio.ExtensionInfo[DdeEquityPositionColumns.Account]);

Геннадий Ванин (Gennady Vanin) Axell