Однако, выдаёт ошибку, мол: attempt to index a nil value
Не понимаю, что делаю не так. Подскажите пожалуйста. Все значения FIRM_ID, ACCOUNT и SECCODE соответствуют полям "Фирма", "Торговый счет" и "Код класса" таблицы "Позиции по клиентским счетам".
Егор Масалкин написал: Все значения FIRM_ID, ACCOUNT и SECCODE соответствуют полям "Фирма", "Торговый счет" и "Код класса" таблицы "Позиции по клиентским счетам".
Возможные значения описаны в описании параметров таблицы. Цитата от туда Тип лимита. Возможные значения: «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
Если нет входящих (или текущих) позиций - таблица пустая - пишет ошибку. После совершения сделки считывается нормально. Скрипт невозможно запустить пока не совершишь сделку.
Каким образом можно обойти эту неприятность?
Да очень просто. Если строчки по инструменту в таблице вообще нет, то позиция, очевидно, равна 0. Позволю себе кое-что добавить в приведенный выше код:
Код
T_FuturesHolding = getFuturesHolding(Settings.FIRM_ID,Settings.ACCOUNT,Settings.SECCODE, 0)
if T_FuturesHolding then
totalnet = T_FuturesHolding.totalnet
esle
totalnet = 0 -- Если строчки нет
end
Добрый день. Помогите, пожалуйста, разобраться с получением информации о текущих позициях. После совершения сделки я хочу узнать текущие позиции по фьючерсам. Но позиции показываются с задержкой в одну сделку. Т.е. если изначально все по нулям и я покупаю один лот, функция getFuturesHolding возвращает 0 в текущих чистых позициях. Когда я продаю один лот - возвращает 1. Подозреваю, что к моменту вызова getFuturesHolding информация в этой таблице еще не обновилась после сделки? Где тогда отлавливать момент совершения сделки, чтобы информация по позициям уже была? Спасибо
Код
function OnTrade(trade)
local tableFut = getFuturesHolding(firm,ACC,SCode,0)
message("POS="..tableFut.totalnet)
Юлия написал: что к моменту вызова 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, то он дергается по любому поводу, связанному с изменением в таблице (вар. маржа и т.д.). А позиция та же самая. В клиринг особенно. Т.е. это не самый удачный колбек, в плане получения только позиции.