Как узнать текущие чистые позиции?

Страницы: 1
RSS
Как узнать текущие чистые позиции?
 
Всем добрый день. У меня есть задача - вытащить из терминала текущие чистые позиции.

Пытаюсь использовать следующий код:

first=getFuturesHolding(Settings.FIRM_ID,Settings.ACCOUNT,Settings.SECCODE, 0).totalnet;

Однако, выдаёт ошибку, мол: attempt to index a nil value

Не понимаю, что делаю не так. Подскажите пожалуйста.
Все значения FIRM_ID, ACCOUNT и SECCODE соответствуют полям "Фирма", "Торговый счет" и "Код класса" таблицы "Позиции по клиентским счетам".
 
Цитата
Егор Масалкин написал:
Все значения FIRM_ID, ACCOUNT и SECCODE соответствуют полям "Фирма", "Торговый счет" и "Код класса" таблицы "Позиции по клиентским счетам".
SECCODE это код инструмента, а не класса.
 
Опечатался. Верно, код инструмента (в моем случае - 'RIM7').

Но в чем проблема?
 
Егор Масалкин,

Правильно понимаем, что речь идет про lua индикатор?
Если так то в этом и есть проблема.
Функция getFuturesHolding недоступна в индикаторах.
 
Цитата
Sergey Gorokhov написал:
Егор Масалкин  ,

Правильно понимаем, что речь идет про lua индикатор?
Если так то в этом и есть проблема.
Функция getFuturesHolding недоступна в индикаторах.
Нннуу... я пишу обычный lua-скрипт, не индикатор. И запускаю его соответственно через Сервисы-->lua скрипты
 
Егор Масалкин,
Тогда, проверьте внимательней проверить какие именно параметры попадают в функцию.
 
Что обозначает параметр pos_type ?
В документации нигде про него не сказано, кроме его наличия
 
Егор Масалкин,

Возможные значения описаны в описании параметров таблицы.
Цитата от туда
Тип лимита. Возможные значения:
«0» – не определён;
«1» – основной счет;
«2» – клиентские и дополнительные счета;
«4» – все счета торг. членов
 
Разобрался.Действительно, ошибка была в передаче данных в функцию.

Однако, пока копался в документации, ещё один нюанс обнаружил. В описании функции указано, что pos_type является типом Number, а в описании параметров таблицы, во-первых, указан параметр type (разные названия), во-вторых, у него тип STRING.

Соответственно, предложение - привести к общему виду и название параметра, и его тип, как в описании функции, так и в описании таблицы параметров.
 
Егор Масалкин,

У Вас устаревшая документация, или версия терминала.
В последней версии, параметры называются одинаково и тип данных тоже.
 
Возникла такая проблема...
На демо-счете программа работает верно, но когда ввожу данные реального счета - снова выдаёт ту же ошибку... Корректность данных проверил несколько раз, всё в норме... Я чего-то ещё не учел? На реальном счете есть какие-то особенности применения этой функции?
 
Егор Масалкин,

Никаких особенностей, кроме того что параметры разные, нет.
Совет тот же, проверьте что попадает в параметры функции и визуально проверьте что в таблице.
 
Нет никакой возможности выцепить, на каком именно параметре рубит? Уже два дня пытаюсь понять что происходит, напрямую задал параметры функции, копировал прямо из таблицы...
При этом заявки по тем же параметрам успешно выставляются.
 
Егор Масалкин,
Пришлите нам для анализа архив всей папки с терминалом QUIK (без ключей доступа) на адрес quiksupport@arqatech.com.
Архив следует паковать при закрытом терминале.
Если файл архива получится больше 10мб, заархивируйте его с паролем и выложите на какой-либо файлообменник.
В письме к нам сообщите ссылку для скачивания, и пароль.
 
День  добрый!

Тоже проблема с  getFuturesHolding(Settings.FIRM_ID,Settings.ACCOUNT,Settings.SECCODE, 0).totalnet; Несколько  иная.
Выдаёт  -   attempt to index a nil value .   Но  только пока  таблица  пустая.  Она же обновляется  каждую сессию -  если позиций  несколько дней  нет,  то всякие записи в ней  отсутствуют.  Видимо,  getFuturesHolding  не находит  строку (массив), из которой  нужно  выбрать значение.
Подобные ошибки моментально останавливают  скрипт.  

Ещё раз. -  Если нет входящих (или текущих)  позиций  -  таблица  пустая  -  пишет  ошибку.  После совершения  сделки  считывается  нормально.
Скрипт  невозможно запустить пока не совершишь  сделку.

Каким  образом  можно  обойти  эту  неприятность?
 
ak56,
Согласно документации, функция getFuturesHolding возвращает nil в случае ошибки.
Отсутствие данных в этом случае можно считать ошибкой.
Из nil нельзя выдернут значение totalnet об этом и говорит ошибка "attempt to index a nil value".

Для решения добавьте проверку:

Код
T_FuturesHolding = getFuturesHolding(Settings.FIRM_ID,Settings.ACCOUNT,Settings.SECCODE, 0)
if T_FuturesHolding then
totalnet = T_FuturesHolding.totalnet
end
 
Большое спасибо!

Спасибо за  оперативность.  Сейчас позиции в моей  таблице уже имеются.  

В ближайшее время  проверю.  
 
Цитата
ak56 написал:

Если нет входящих (или текущих)  позиций  -  таблица  пустая  -  пишет  ошибку.  После совершения  сделки  считывается  нормально.
Скрипт  невозможно запустить пока не совершишь  сделку.

Каким  образом  можно  обойти  эту  неприятность?

Да очень просто. Если строчки по инструменту в таблице вообще нет, то позиция, очевидно, равна 0. Позволю себе кое-что добавить в приведенный выше код:
Код
T_FuturesHolding = getFuturesHolding(Settings.FIRM_ID,Settings.ACCOUNT,Settings.SECCODE, 0)

if T_FuturesHolding then
  totalnet = T_FuturesHolding.totalnet
esle
  totalnet = 0 -- Если строчки нет
end
 
Цитата
SDL написал:
Да очень просто...

Лучше ещё проще! Используйте Lua на всю катушку:

Код
T_FuturesHolding = getFuturesHolding(Settings.FIRM_ID,Settings.ACCOUNT,Settings.SECCODE, 0)
totalnet  =  T_FuturesHolding and T_FuturesHolding.totalnet or 0
 
Добрый день. Помогите, пожалуйста, разобраться с получением информации о текущих позициях.
После совершения  сделки я хочу узнать текущие позиции по фьючерсам. Но позиции показываются с задержкой в одну сделку. Т.е. если изначально все по нулям и я покупаю один лот, функция getFuturesHolding возвращает 0 в текущих чистых позициях. Когда я продаю один лот - возвращает 1. Подозреваю, что к моменту вызова getFuturesHolding информация в этой таблице еще не обновилась после сделки? Где тогда отлавливать момент совершения сделки, чтобы информация по позициям уже была?
Спасибо

Код
function OnTrade(trade)

local tableFut = getFuturesHolding(firm,ACC,SCode,0)

message("POS="..tableFut.totalnet)
 
 
Добрый день.
Сама позиция в таблице меняется в QUIK? Выложите полный код, проверим.
 
Цитата
Юлия написал:
что к моменту вызова getFuturesHolding информация в этой таблице еще не обновилась после сделки
Именно так. OnTrade, как правило, - самый "быстрый" коллбэк из всех событий, относящихся к торговым действиям. Quik весь устроен так, что информация в разные таблицы приходит независимыми потоками, никак не синхронизированными друг с другом. Это много раз здесь обсуждалось. Поэтому совокупное состояние таблиц терминала в любой момент времени ("срез данных") никак нельзя считать согласованным. Другое дело, что когда мы смотрим в таблицы глазами, относительные задержки обновления информации так малы, что мы их не замечаем. И которые нельзя не учитывать при программировании в скриптах.
Цитата
Юлия написал:
Где тогда отлавливать момент совершения сделки
Придется вести позиции в собственных переменных скрипта самостоятельно, обновляя их в тех же OnTrade. Периодически, в периоды относительной "тишины" в торговле, синхронизируя значения с таблицей позиций Quik.

Цитата
Egor Zaytsev написал:
Сама позиция в таблице меняется в QUIK?
Конечно она поменяется, куда денется. Тут и код выкладывать не нужно. Человек ведь пишет, что это происходит после вызова OnTrade.
 
Цитата
Юлия написал:
Где тогда отлавливать момент совершения сделки, чтобы информация по позициям уже была?
Добрый день.
Можете попробовать использовать функции обратного вызова OnFuturesClientHolding(TABLE fut_pos) и OnFuturesLimitChange(TABLE fut_limit), они точно Вам сообщат, что фьючерсные позиция и ограничение изменились.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
 
В скрипте использую функцию OnFuturesClientHolding(fut_pos), но когда наступает промежуточный и основной клиринги, в этот момент функция возвращает "Текущие чистые позиции - 0", хотя есть открытые позиции. Подскажите как обойти эту проблему?
 
Не проверять в клиринг. Т.е. надо проверить статус сессии и контролировать позицию только в торговое время.
Плюс, если Вы делаете это из колбека OnFuturesClientHolding, то он дергается по любому поводу, связанному с изменением в таблице (вар. маржа и т.д.). А позиция та же самая. В клиринг особенно.
Т.е. это не самый удачный колбек, в плане получения только позиции.
Страницы: 1
Читают тему
Наверх