Добрый день! Имеется счет (у брокера БКС) с подключенной секцией NASDAQ для торговли иностранными бумагами (именно насдак с кодом класса NASDAQ, а не акции на бирже SPB). Вручную сделки совершаются без проблем, однако через lua скрипт не удается выставлять заявки функцией sendTransaction(). Приведенный ниже фрагмент кода приводит к записи в переменную "a" ошибки ' указанный инструмент не найден: "BILI" ' :
Код
local ord =
{
["ACCOUNT"]="L01-00000F00",
["CLIENT_CODE"]="....мой код клиента....",
["TYPE"]="L",
["TRANS_ID"]="111222",
["CLASSCODE"]="NASDAQ",
["SECCODE"]="BILI",
["ACTION"]="NEW_ORDER",
["OPERATION"]="B",
["PRICE"]=73.5,
["QUANTITY"]="1"
}
a = sendTransaction(ord);
Покупка, естественно, не происходит. Аналогичным способом российские акции покупаются скриптом успешно (по коду класса TQBR). В чем может быть проблема, подскажите пожалуйста
Есть скрипт на языке LUA, самостоятельно выставляющий заявки функцией sendTransaction(). Скрипт удаленно запускался несколькими тестовыми подписчиками на своих ПК с установленным терминалом QUIK (брокеры у них разные). Было замечено, что по счетам с суммой депозита менее 150-200 тысяч рублей не выставляются заявки (не появляются в Таблице заявок) по эмитентам с ценой акции около 2 тысяч за акцию и более: Норникель, Фосагро, Полиметалл. Чем может быть причиной? (возможно, существует какое-то ограничение в настройках терминала на соотношение цены акции к размеру депозита?)
Не получается решить тривиальную вроде бы задачу: найти подстроку в строке. Есть строка, считываемая из текстового файла
Код
2019-11-29 11:40:57 --- 0.3866 --- 52.1600000
и подстрока, индекс первого вхождения которой нужно найти: " --- " (всего в ней пять символов). Использую следующий код
Код
...
f_a = io.open(testFile1,"r");
f_t = io.open(testFile2,"w");
for line in f_a:lines() do
ln = line;
p = ln:find(" --- ");
f_t:write(p, "\n");
end;
и получаю p = 11 . Экспериментирую с разными строками и подстроками пришел к выводу, что проблема в следующем: функция find берет первый символ искомой подстроки (в моем примере это пробел) и возвращает его первое вхождение в строку. Как же тогда заставить ее искать вхождение всей подстроки / что я делаю не так?
Добрый день Ищу простой способ получения данных lua-скриптом из базы mysql. Узнал, что вроде бы для этих целей есть библиотека LuaSQL, подключаемая кодом
Код
require "luasql.mysql"
но где взять сами файлы библиотеки не понимаю. Как можно подключить эту библиотеку или подключиться к БД любым другим способом?
Добрый день! Моему скрипту на LUA требуются внешние данные, которые присутствуют на web-странице. В связи с этим пытаюсь найти способ сделать http-запрос. Поиски в интернете и в том числе на этом форуме привели к выводу, что нужно использовать библиотеку LuaSocket. Разобрал следующую тему и сделал всё как рекомендовано: https://forum.quik.ru/messages/forum10/message20352/topic2286 В итоге получаю ошибку "error loading module 'socket.core' from file 'C:\BCS_Work\QUIK_BCS\Include\socket\core.dll': %1 не является приложением Win32.". Похоже, что для моей версии QUIK (8.1.0.30) нужна 64-битная версия библиотеки, но такую в открытом доступе найти не получается.
Прилагаю свой код, буду признателен за помощь. Интересует получение кода web-страницы из скрипта любым способом, использование именно этой библиотеки не принципиально
Код
package.cpath = getScriptPath() .. "\\<CDIR>\\?.dll;" .. package.cpath
package.path = getScriptPath() .. "\\<LDIR>\\?.lua;" .. package.path
local address = 'http://***some_url***'
function main ()
while true do
sleep (5000)
do_smart ()
end
end
function do_smart ()
local http_request = require ( "socket.smtp" )
local headers, stream = assert(http_request.new_from_uri(address):go())
local body = assert(stream:get_body_as_string())
end
Добрый день! Вчера столкнулся со следующей проблемой: в терминале QUIK подключен QPILE скрипт (давно не изменявшийся и работавший исправно), берущий в ходе работы шаг цены для разных эмитентов из таблицы "Текущая таблица параметров". Используется функция:
Скрипт не переподключался к терминалу и не менялся долгое время, Текущая таблица параметров тоже открыта в терминале и отображает все столбцы корректно. Похоже, что со вчерашнего дня имя столбца SEC_PRICE_STEP сменилось на какое-то другое, поскольку теперь шаг цены для любого эмитента определяется равным нулю. Просьба помочь разобраться.
Знаю, что использование не поддерживаемого языка QPILE нежелательно. Всё же хотелось бы обойтись без переписывания всего скрипта, если есть такая возможность.
Есть скрипт (QPILE), выгружающий стаканы для определенного набора эмитентов в txt файлы (работал стабильно в течение нескольких недель). Глубина стакана у брокера 20. Недавно обнаружил, что вечером (примерно после 18 30) выгружаемые данные урезаются (выходит не по 20, а по 10 цен в стакане на buy и sell). При этом если смотреть на сами стаканы в терминале, там продолжают отображаться 20 цен в обе стороны. Рынок в это время еще не закрыт.
Подскажите, стандартная ли это ситуация, встречался ли кто-нибудь с ней? В чем искать проблему? Зависит ли это от конкретного брокера, либо терминала или скриптового языка? Спасибо.
Интересует, можно ли составить команду на снятие заявки (и далее передать ее в терминал через модуль "импорт транзакций"), если заявка не имеет trans_id (значение в таблице заявок постое). Что-то вроде
Существует ли в QPILE какое-либо подобие, например, конструкции try { } catch { } из C# ? Цель — в случае возникновения ошибки не заканчивать работу скрипта, а продолжать его периодическое выполнение.
Если конкретнее, то есть два компьютера, соединенные локальной сетью. Скрипт, работая в терминале на первом компьютере, обращается к директориям (текстовым файлам) на втором компьютере. Скрипт падает каждый раз, когда 2й компьютер оказывается выключен (при запущенном терминале на первом компьютере), и его приходится переподключать. Хотелось бы обернуть в такой try { } catch {} весь код скрипта, чтобы он не падал и сам начинал работать после появления доступа к нужным ему директориям.
Как получить содержимое таблицы "Клиентский портфель" без указания конкретного клиента (для всех)? В руководстве пользователя нашел только следующую функцию для работы с таблицей "Клиентский портфель": GET_CLIENT_MARGINAL_PORTFOLIO_INFO. Но она в качестве входных параметров принимает код клиента и firmID. Можно ли получить информацию по всем пользователям? Или сначала как-то узнать все возможные комбинации (client_code + firmid), чтобы потом для каждой из них получить портфель..
Второй вопрос по работе с самой функцией GET_CLIENT_MARGINAL_PORTFOLIO_INFO. Следующий фрагмент кода в итоговую таблицу почему-то не заносит ничего (на демо счете), хотя таблица "Клиентский портфель" содержит несколько записей с указанными client_code и firmid:
Код
PORTFOLIO_EX ClientPortfolioTXT;
DESCRIPTION Экспорт клиентского портфеля;
CLIENTS_LIST ALL_CLIENTS;
FIRMS_LIST ALL_FIRMS;
PROGRAM
MAP = GET_CLIENT_MARGINAL_PORTFOLIO_INFO("MC0007400000","141972")
K = GET_NUMBER_OF(MAP)
FOR I FROM 1 TO K
TR = GET_ITEM (MAP, I)
N_ASSETS=GET_VALUE(TR,"ASSETS")
' ----------------------------
' ----- Таблица (запись) -----
' ----------------------------
OUTPUT=CREATE_MAP()
OUTPUT=SET_VALUE(OUTPUT, "AS", N_ASSETS)
ADD_ITEM(1, OUTPUT)
END FOR
END_PROGRAM
PARAMETER AS;
PARAMETER_TITLE Assets;
PARAMETER_DESCRIPTION Assets;
PARAMETER_TYPE STRING(15);
END
END_PORTFOLIO_EX
Ищу способ получить объемы из таблицы заявок. Код ниже создает таблицу, аналогичную таблице заявок. Но столбец с объемами остается пустым (при том что в оригинальную таблицу заявок он добавлен и содержит нужные значения). Полагаю, что вместо GET_VALUE(TR,"VOLUME") должно стоять какое-то другое обращение, но в интернете ничего по теме найти не смог.
Спасибо
Код
K = GET_NUMBER_OF("ORDERS")
FOR I FROM 1 TO K
TR = GET_ITEM ("ORDERS", I)
N_NUMBER=GET_VALUE(TR,"NUMBER")
N_CLASS=GET_VALUE(TR,"CLASSCODE")
N_EMIT=GET_VALUE(TR,"SECCODE")
N_OPERATION=GET_VALUE(TR,"OPERATION")
N_CLIENT=GET_VALUE(TR,"CLIENTCODE")
N_ACCOUNT=GET_VALUE(TR,"ACCOUNT")
N_PRICE=GET_VALUE(TR,"PRICE")
N_VOLUME=GET_VALUE(TR,"VOLUME") 'здесь переменная остается пустой
N_STATUS=GET_VALUE(TR,"STATUS")
' ----- Запись в таблицу -----
OUTPUT=CREATE_MAP()
OUTPUT=SET_VALUE(OUTPUT, "NUMBER_N", N_NUMBER)
OUTPUT=SET_VALUE(OUTPUT, "CLASS_N", N_CLASS)
OUTPUT=SET_VALUE(OUTPUT, "EMIT_N", N_EMIT)
OUTPUT=SET_VALUE(OUTPUT, "OPERATION_N", N_OPERATION)
OUTPUT=SET_VALUE(OUTPUT, "CLIENT_N", N_CLIENT)
OUTPUT=SET_VALUE(OUTPUT, "ACCOUNT_N", N_ACCOUNT)
OUTPUT=SET_VALUE(OUTPUT, "PRICE_N", N_PRICE)
OUTPUT=SET_VALUE(OUTPUT, "VOLUME_N", N_VOLUME)
OUTPUT=SET_VALUE(OUTPUT, "STATUS_N", N_STATUS)
ADD_ITEM(1, OUTPUT)
END FOR