Страница 1 из 1

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

Добавлено: 18 сен 2019, 12:31
nsemkin
Пробую в режиме советника следующее

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

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


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

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

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

Добавлено: 18 сен 2019, 12:59
nsemkin
Нашел на форуме такое:

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

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


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

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

Добавлено: 18 сен 2019, 15:56
BugsDigger
Документация
СКРИПТЫ ПОЛЬЗОВАТЕЛЬСКИХ ИНДИКАТОРОВ И СТРАТЕГИЙ
ВЕРСИЯ 1.19 // 31.10.2018

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

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

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

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

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

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

Добавлено: 18 сен 2019, 16:29
evge
nsemkin писал(а):А как учетную цену по позиции робота получить?)


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

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

viewtopic.php?f=5&t=774

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

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

Добавлено: 20 сен 2019, 11:46
nsemkin
Такой момент не понятен, делаю

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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


А вот для

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

CloseLong();


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