Андрей А (Автор тем)

Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Выставление заявок в секции NASDAQ, функция sendTransaction
 
Добрый день!
Имеется счет (у брокера БКС) с подключенной секцией 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 скрипта
 
Добрый день
Ищу простой способ получения данных lua-скриптом из базы mysql. Узнал, что вроде бы для этих целей есть библиотека LuaSQL, подключаемая кодом

Код
require "luasql.mysql"
но где взять сами файлы библиотеки не понимаю. Как можно подключить эту библиотеку или подключиться к БД любым другим способом?
HHTP запросы в LUA и проблема с 32-битной версией библиотеки LuaSocket
 
Добрый день!
Моему скрипту на 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
Шаг цены SEC_PRICE_STEP, Изменения в Текущей таблице параметров
 
Добрый день!
Вчера столкнулся со следующей проблемой: в терминале QUIK подключен QPILE скрипт (давно не изменявшийся и работавший исправно), берущий в ходе работы шаг цены для разных эмитентов из таблицы "Текущая таблица параметров". Используется функция:
Код
= get_value(get_param_ex(classCodeVariable,secCodeVariable,"SEC_PRICE_STEP"),"Param_value")
Скрипт не переподключался к терминалу и не менялся долгое время, Текущая таблица параметров тоже открыта в терминале и отображает все столбцы корректно. Похоже, что со вчерашнего дня имя столбца SEC_PRICE_STEP сменилось на какое-то другое, поскольку теперь шаг цены для любого эмитента определяется равным нулю. Просьба помочь разобраться.

Знаю, что использование не поддерживаемого языка QPILE нежелательно. Всё же хотелось бы обойтись без переписывания всего скрипта, если есть такая возможность.
Уменьшение глубины стакана перед закрытием рынка
 
Есть скрипт (QPILE), выгружающий стаканы для определенного набора эмитентов в txt файлы (работал стабильно в течение нескольких недель). Глубина стакана у брокера 20. Недавно обнаружил, что вечером (примерно после 18 30) выгружаемые данные урезаются (выходит не по 20, а по 10 цен в стакане на buy и sell). При этом если смотреть на сами стаканы в терминале, там продолжают отображаться 20 цен в обе стороны. Рынок в это время еще не закрыт.

Подскажите, стандартная ли это ситуация, встречался ли кто-нибудь с ней? В чем искать проблему? Зависит ли это от конкретного брокера, либо терминала или скриптового языка? Спасибо.
Снятия заявки без id транзакции
 
Интересует, можно ли составить команду на снятие заявки (и далее передать ее в терминал через модуль "импорт транзакций"), если заявка не имеет trans_id (значение в таблице заявок  постое). Что-то вроде

CLASSCODE=SNGSP; SECCODE=TQBR; TRANS_ID=NONE; ACTION=KILL_ORDER; ORDER_KEY=158510926;

Есть ли такая возможность в lua?
Отловить ошибку при работе скрипта, Отловить ошибку при работе скрипта
 
Существует ли в 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(trade,"VOLUME")
 
Добрый день

Ищу способ получить объемы из таблицы заявок. Код ниже создает таблицу, аналогичную таблице заявок. Но столбец с объемами остается пустым (при том что в оригинальную таблицу заявок он добавлен и содержит нужные значения). Полагаю, что вместо 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   
Страницы: 1
Наверх