Общие вопросы по разработке > Как получить информацию о текущей позиции

Общие вопросы по разработке в Альфа-Директ 4. Обсуждение разработки пользовательских индикаторов, стратегий.
nsemkin
Сообщения: 11
Зарегистрирован: 12 сен 2019, 17:40
Благодарил (а): 2 раза

Как получить информацию о текущей позиции

Непрочитанное сообщение nsemkin » 18 сен 2019, 12:31

Пробую в режиме советника следующее

Код: Выделить всё

EnterLong(10000);
ShowMessage("Price: " + Input1.Close[0]);
ShowMessage("CurrentPosition: " + CurrentPosition());


Почему-то CurrentPosition() выдает позицию 0, хотя до него было EnterLong(10000);

Можно ли как-то получить учетную цену, учетную стоимость по позиции, массив сделок по позиции?

nsemkin
Сообщения: 11
Зарегистрирован: 12 сен 2019, 17:40
Благодарил (а): 2 раза

Re: Как получить информацию о текущей позиции

Непрочитанное сообщение nsemkin » 18 сен 2019, 12:59

Нашел на форуме такое:

Код: Выделить всё

var Position = GetPosition();
   
ShowMessage("Position.Price: " + Position.Price);
ShowMessage("Position.Position: " + Position.Position);


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

BugsDigger
Сообщения: 332
Зарегистрирован: 11 ноя 2018, 17:11
Благодарил (а): 21 раз
Поблагодарили: 41 раз

Re: Как получить информацию о текущей позиции

Непрочитанное сообщение BugsDigger » 18 сен 2019, 15:56

Документация
СКРИПТЫ ПОЛЬЗОВАТЕЛЬСКИХ ИНДИКАТОРОВ И СТРАТЕГИЙ
ВЕРСИЯ 1.19 // 31.10.2018

ФУНКЦИИ ОЦЕНКИ ПОЗИЦИИ
CurrentPosition() – возвращение объем текущей позиции (штук), которые посчитаны по сделкам только данной стратегии (робота). Положительное количество – показывает объем позиции лонг, отрицательное количество – объем позиции шорт.
Робот ведет собственную виртуальную позицию на основании собственных сделок, которая может не совпадать с реальной позицией по субсчету.
Пример.

Код: Выделить всё

 if ( CurrentPosition() != 0 && BarTime() >= AsTime(18, 30, 0) ) CloseShort();

nsemkin
Сообщения: 11
Зарегистрирован: 12 сен 2019, 17:40
Благодарил (а): 2 раза

Re: Как получить информацию о текущей позиции

Непрочитанное сообщение nsemkin » 18 сен 2019, 16:07

Это я нашел CurrentPosition(). А как учетную цену по позиции робота получить?) И историю сделок робота..
Может есть ссылка на что-то вроде API..

Аватара пользователя
evge
Администратор
Сообщения: 1641
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 62 раза
Поблагодарили: 294 раза
Контактная информация:

Re: Как получить информацию о текущей позиции

Непрочитанное сообщение evge » 18 сен 2019, 16:29

nsemkin писал(а):А как учетную цену по позиции робота получить?)


AverPrice() – возвращает учетную цену открытой позиции
Учетная цена – средневзвешенная цена сделок, которые увеличивают текущую открытую позицию по роботу

по поводу сделок, возможно, но пока не ясно, что вот это:

viewtopic.php?f=5&t=774

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

nsemkin
Сообщения: 11
Зарегистрирован: 12 сен 2019, 17:40
Благодарил (а): 2 раза

Re: Как получить информацию о текущей позиции

Непрочитанное сообщение nsemkin » 20 сен 2019, 11:46

Такой момент не понятен, делаю

Код: Выделить всё

EnterLong(10000);
ShowMessage("CurrentPosition: " + CurrentPosition());


Казалось бы CurrentPosition() должно быть 10000, но нет выдает 0.

Еще раз делаю EnterLong(10000);, тогда выводит 10000. Получается CurrentPosition() выдает предыдущую позицию.

BugsDigger
Сообщения: 332
Зарегистрирован: 11 ноя 2018, 17:11
Благодарил (а): 21 раз
Поблагодарили: 41 раз

Re: Как получить информацию о текущей позиции

Непрочитанное сообщение BugsDigger » 20 сен 2019, 15:09

Я тоже заметил, что сразу после изменения позиции значение, возвращаемое CurrentPosition, не меняется.
Хотелось бы узнать у разработчиков - а почему, собственно? Ведь робот ведет виртуальную позицию, ему по барабану, состоялась ли уже сделка физически или нет (особенно в тестировании). Или это рудимент системы, когда (предполагаю) сделки роботов делались только через лимитные ордера? (Недаром же есть специальный флаг в инициализации UseEnterMKT; он, по всей видимости, исторически появился позже) В этом случае - да, можно представить, что робот ждет следующей свечи, чтобы понять, появлялась ли цена исполнения, и в соответствии с этим изменяет текущую позицию.

Обхожу это тем, что смотрю позицию уже на следующем шаге (при следующем вызове OnUpdate), там все ОК, но это не всегда удобно, к сожалению.

ensh
Сообщения: 185
Зарегистрирован: 28 июн 2017, 13:56
Благодарил (а): 4 раза
Поблагодарили: 35 раз

Re: Как получить информацию о текущей позиции

Непрочитанное сообщение ensh » 20 сен 2019, 15:40

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

BugsDigger
Сообщения: 332
Зарегистрирован: 11 ноя 2018, 17:11
Благодарил (а): 21 раз
Поблагодарили: 41 раз

Re: Как получить информацию о текущей позиции

Непрочитанное сообщение BugsDigger » 21 сен 2019, 08:50

Спасибо за пояснение. Более-менее это (с физическим исполнением заявок) очевидно, однако, насколько я понимаю, роботу это все вроде как до лампочки, т.к. он ведет виртуальную позицию (по крайней мере, везде в документации это подчеркивается).

Хотя, если позиция робота чисто виртуальная, тогда не совсем понятно, откуда ему брать учетную цену позиции... Разве что опять же при маркетных заявках - по последней известной цене, при лимитных - по цене лимита, если он был пройден в текущем обрабатываемом баре...
Эта тактика (или что-то близкое), по всей видимости, реализована в классах, отвечающих за тестирование (они, как видно из дизассемблера, существуют отдельно). Что делается в реале - не знаю.

В АД3 были роботы, работавшие (через COM) в Excel. Там реальные заявки маркировались в примечании к заявке именем робота, так что он был способен выделить из общего списка именно свои заявки и из них извлечь статус исполнеия и цифры. Сейчас комментарий вроде как пустой (или я ошибаюсь ?), и я не знаю, контролирует ли робот реальное исполнение или живет исключительно в своей виртуальной реальности.

Как я уже цитировал из документации, "CurrentPosition() – возвращение объем текущей позиции (штук), которые посчитаны по сделкам только данной стратегии (робота). Робот ведет собственную виртуальную позицию на основании собственных сделок, которая может не совпадать с реальной позицией по субсчету." Это можно понимать по-разному: либо это говорит о чистой виртуальности позиции (тогда не совсем понятно, почему новое значение этой виртуальной позиции не читается через CurrentPosition немедленно после любой операции), либо отмечает только тот простой факт, что на субсчете, где работают несколько роботов и/или дополнительно проводятся ручные операции, суммарная позиция не будет равна позиции в отдельном роботе.

nsemkin
Сообщения: 11
Зарегистрирован: 12 сен 2019, 17:40
Благодарил (а): 2 раза

Re: Как получить информацию о текущей позиции

Непрочитанное сообщение nsemkin » 23 сен 2019, 16:47

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


А вот для

Код: Выделить всё

CloseLong();


временного лага похоже нет, сразу 0 выдает по CurrentPosition()


Вернуться в «Общие вопросы по разработке»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 11 гостей