Nikolay Pavlov (Все сообщения пользователя)

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

Страницы: 1 2 3 След.
Функция getParamEx возвращает нули по параметрам максимальная, минимальная цена для акций, проблемы с переходом на новую версию qlua
 
Цитата
_sk_ написал:
Спасибо за ответ.

Хотелось бы иметь возможность без DDE обойтись. У меня нет Excel на компьютере, а LibreOffice не поддерживает эту давным давно устаревшую технологию.

Зарегистрируйте тогда пожелание о возможности выгрузки формальных заголовков в обычный текстовый файл выбором пункта меню.

Про настройки на стороне брокера я уточню у брокера.
Добрый день!
Предложу более легкий способ получить DBName параметра из Таблицы текущие торги без использования DDE.
Заходим в настройки терминала "Система" -> "Настройки" -> "Основные настройки...", заходим в раздел "Программа" -> "Буфер обмена" и включаем настройки:
- Выводить заголовки столбцов
- Формальное представление данных
-- Формальное представление заголовков строк и столбцов

Теперь при копировании всей таблицы в буфер обмена (Ctrl+Shift+C) в буфер обмена буду копироваться DBName значения из Таблицы текущие торги, именно их нужно использовать в функции getParamEx()
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Tradedate
 
Цитата
Старатель написал:
getTradeDate() в OnCleanUp всегда даёт актуальную дату торгов или это у меня так совпало?
Добрый день.
Параметр TRADEDATE это параметр из Информационного окна Рабочего места QUIK, который обновляется так же при получении с сервера Quik новой даты торгов. Функция getInfoParam("TRADEDATE") просто возвращает значение этого параметра, который может просто еще не обновиться. Функция getTradeDate() обращается непосредственно к внутренней функции терминала GetTradeDate(), что является более надежным способом получения даты торгов, параметр TRADEDATE на момент вызова OnCleanUp() гарантированно еще старый, а функция getTradeDate() вернет новую дату торгов, если вызов OnCleanUp() был инициирован сменой сессии, а т.к. OnCleanUp() может вызываться в нескольких случаях (см. описание ниже), то актуальную дату торгов в OnCleanUp() нужно ждать в самом последнем вызове, а их может быть максимум 3. Обычно клиент подключается каждый день одним и тем же пользователем, к одному и тому же серверу, тогда вызов OnCleanUp() будет один (по смене сессии).

******************************Из документации**********************************************
OnCleanUp
Функция вызывается терминалом QUIK в следующих случаях:
- смена сервера QUIK внутри торговой сессии;
- смена пользователя, которым выполняется подключение к серверу QUIK, внутри торговой сессии;
- смена сессии.

При выполнении сразу нескольких из перечисленных условий, функция OnCleanUp() вызывается терминалом QUIK для каждого из них.

Вот мой пример. Первый вызов был инициирован сменой сервера, второй сменой сессии.
Код
is_run = true

function OnStop(signal)
  is_run = false  
end

function OnCleanUp()
  message('getInfoParam' .. tostring(getInfoParam("TRADEDATE")))
  message('getTradeDate' .. tostring(getTradeDate().date))
end

function main()
  while is_run do
    sleep(100)
  end
end

Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Порядок полей таблицы Даты-Времени у обезличенной сделки. Квик 8.5 Луа53.
 
Цитата
Aleks написал:
Можно быть уверенным, что внутри одного исполнения очерёдность полей не поменяется?
К сожалению, с уверенностью сказать не можем. Тесты показывали, что официальная VM Lua  (https://sourceforge.net/projects/luabinaries/files/5.3.5/Tools%20Executables/ ) внутри одного запуска порядок ключей в таблице сохраняет, после перезапуска порядок ключей меняется. Аналогично и в VM Lua в терминале Quik.
Все же это не очень удачный подход затачиваться на порядок ключей в Lua таблице, лучше сортировать или обращаться по ключу, что гораздо быстрее.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Порядок полей таблицы Даты-Времени у обезличенной сделки. Квик 8.5 Луа53.
 
Цитата
Aleks написал:
В новой же версии при каждом новом запуске скрипта с моей дллкой поля меняются местами
Добрый день.
В VM Lua 53 присутствует недетерминированное поведение в порядке ключе в Lua таблице, попробуйте перед выводом в файл сортировать данные по ключу.
Вот полезная информация по сортировке в Lua:
https://www.lua.org/pil/19.3.html
http://lua-users.org/wiki/SortedIteration
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Помогите восстановить работоспособность скрипта LUA после перехода на quik 8.5 с lua 5.3
 
Цитата
Nikolay Pavlov написал:
а из-за особенности Lua 5.2 tostring для double будет добавлять постфикс в виде '.0'.
конечно я говорю о Lua 5.3
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Помогите восстановить работоспособность скрипта LUA после перехода на quik 8.5 с lua 5.3
 
Цитата
Старатель написал:
В данном случае проблема именно в самом QUIK. Так, например, getParamEx(CLASS_CODE,SEC_CODE,"BID").param_value даст вам значение, которое вы не сможете подать в sendTransaction без лишних вычислений.
Добрый день.
Чтобы было более прозрачно, опишу как сейчас реализовано. Если в структурах Quik параметр, например bid, хранится в double, то и в QLua вернется в double, а из-за особенности Lua 5.2 tostring для double будет добавлять постфикс в виде '.0'. Так будет для всех чисел которые ездят в Quik в double, они будут отдаваться в сыром виде.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
19-значные номера заявок и сделок на MOEX
 
Цитата
Александр М написал:
По америке начали возвращать номер заявки в 15-ти знаках. брокер ФинамКодa=317934958413900
message (tostring(a))Результат "3.179349584139e+014"
Добрый день.
Попробуйте так

string.format('%0.17g', order_num)

Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Отправка заявки айсберг с использованием полей на англ. языке
 
1. Возможно Вы используете удобную (красивую) форму ввода заявки, на которой отображаются не все поля, в основном самые используемые. Если Вы зайдете в настройки терминала раздел Торговля -> Заявки -> Формы ввода и включите настройку Применять стандартную форму ввода, то у Вас при вводе транзакции отобразится форма со всеми доступными полями. Она менее удобная, но зато предоставляет доступ ко всем полям транзакции.

2. По поводу ошибки, да, это ответ от Биржи.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Отправка заявки айсберг с использованием полей на англ. языке
 
Цитата
rodionos написал:
Подскажите, как можно переключиться на англ. язык интерфейса? Не вижу такой опции в настройках клиентского места.Правильно я понимаю, что sendTransaction позволяет отправлять в терминал транзакции нескольких типов - заявки типа NEW_ORDER, NEW_STOP_ORDER, KILL_ORDER, и т.д. Данные типы транзакций от настроек интерфейса не зависят. Затем есть тип записей, которые в интерфейсе так и называются Транзакции, и этот тип требует указания полей в формате tri-файла. В связи с этим вопрос - почему именно айсберги нужно отправлять в tri формате?
Язык меняется в диалоге Система -> Настройки -> Языковые установки...

По поводу транзакций, любую транзакцию, которая доступна Вам по правам можно подать из Lua скрипта в формате, который выгружается в tri-файл из таблицы Карман транзакций. Это его плюс и универсальность. Но он зависит от языка интерфейса терминала, это минус.

Транзакции с ACTION равным NEW_ORDER, NEW_STOP_ORDER, KILL_ORDER и т.д., которые явно прописаны в справке к терминалу - это формат, оставшийся с давних времен и на текущий момент его не развивают, т.к. при добавлении новых полей в транзакциях их нужно будет явно прописывать в коде терминала, в документации и т.д. и выпускать каждый раз новую версию терминала (а таких транзакций очень много). В этот перечень новых транзакций попала транзакция и для Айсберг-заявок, по этой причине для нее и нет зарезервированного ACTION, наподобие NEW_ORDER.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Отправка заявки айсберг с использованием полей на англ. языке
 
Цитата
rodionos написал:
Файлы исходных кодов сохраняются в кодировке UTF-8. Подача айсберг заявки в данном случае не проходит. Нужно, чтобы кодировка файлf была Windows 1251.
Использование кодировки Windows 1251 - обязательное условие для Lua скриптов в терминале Quik. Просто перенастройте Вашу среду разработки на сохранение скриптов в нужной кодировке.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Отправка заявки айсберг с использованием полей на англ. языке
 
Цитата
rodionos написал:
Конечно, если англ. поля не поддерживаются, то ничего не сделаешь, придется как-то выкручиваться, но это заслуживает исправления в Квике.
К сожалению айсберг-заявку можно подать из Lua скрипта только в формате tri-файла, т.е. тот формат, который выгружается в файл при экспорте транзакции из таблицы Карман транзакций, а он зависим от языка, который выбран в настройках терминала. Само использование кириллицы в коде Lua скрипта не должно давать каких-либо проблем, т.к. это всего лишь ключи полей Lua-таблицы. Можете переключить интерфейс терминала на английский, и тогда в коде Lua скрипта можно будет задавать поля транзакции ввода айсберг-заявки на латинице.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Отправка заявки айсберг с использованием полей на англ. языке
 
Цитата
rodionos написал:
сть ли варианты решения проблемы?
Добрый день.
По ссылке, которую Вы приводите, я уже указывал, что если используете терминал Quik с русским интерфейсом, то нужно в Lua скрипте указывать имена полей на кириллице, если интерфейс терминала английский, то в Lua скрипте используется английский вариант полей. У Вас же в примере вообще некорректный набор параметров транзакции для айсберг заявки. Т.к. Вы используете русский интерфейс терминала, то попробуйте задать транзакцию вот так:
Код
transaction = {}
transaction['TRANS_ID'] = '400001'
transaction['ACTION'] = 'Ввод айсберг заявки'
transaction['CLASSCODE'] = 'TQBR'
transaction['Торговый счет'] = 'L01-XXXXXXXX'
transaction['Примечание'] = 'СС1'
transaction['Инструмент'] = 'LKOH'
transaction['К/П'] = 'Купля'
transaction['Цена'] = '5592.5'
transaction['Лоты'] = '1000'
transaction['Видимое количество'] = '100'
transaction['Тип'] = 'Лимитная'
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
iceberg order, (латиница в заявке)
 
Цитата
QApplication написал:
можно в документацию QLUA.chm добавить описание всех полей на ru and en для универсального формата.
Это невозможно сделать, количество рынков (и соответственно транзакций) не ограничено только Московской Биржей. В том и преимущество универсального формата транзакций, что его можно узнать самому для любой транзакции доступной по правам в Вашем терминале. Достаточно воспользоваться таблицей "Карман транзакций", добавить в нее нужную транзакцию, и сохранить ее в tri-файл.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
iceberg order, (латиница в заявке)
 
Цитата
QApplication написал:
Является ли нормальным значение поля Price indication type.
Это значение по умолчанию для данной транзакции на фондовом рынке Московской Биржи. В Lua его можно не указывать, все необязательные поля терминал Quik проставит значениями по умолчанию. Это поле наподобие EXECUTION_CONDITION=PUT_IN_QUEUE

(Раздел 6. Совместная работа с другими приложениями -> Импорт транзакций -> Формат .tri-файла с параметрами транзакций)
EXECUTION_CONDITION
Условие исполнения заявки, необязательный параметр. Возможные значения:
«PUT_IN_QUEUE» – поставить в очередь (по умолчанию),
«FILL_OR_KILL» – немедленно или отклонить,
«KILL_BALANCE» – снять остаток


Насколько мне известно, поле "Тип события активации заявки" для класса TQBR может принимать еще значения "Заявка с временем активации" и "Заявка в аукцион закрытия"
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
iceberg order, (латиница в заявке)
 
Цитата
QApplication написал:
Уточнение: поля чувствителны к регистру
Да, поля регистрозависимые.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
iceberg order, (латиница в заявке)
 
Цитата
QApplication написал:
Ок, можно пример айсберг заявки в универсальном формат на латинице.
Если терминал Quik запущен с английским интерфейсом, то если для транзакции Iceberg order entry для класса TQBR создать транзакцию в кармане транзакций и выгрузить ее в tri-файл, то получим следующее:
Скрытый текст
для данную транзакцию из Lua можно подать следующим образом:
Код
transaction = {}
transaction['TRANS_ID'] = '400001'
transaction['ACTION'] = 'Iceberg order entry'
transaction['CLASSCODE'] = 'TQBR'
transaction['Trading account'] = 'L01-XXXXXXXX'
transaction['Broker reference'] = 'СС1'
transaction['Security'] = 'LKOH'
transaction['Direction'] = 'Buy'
transaction['Price'] = '5592.5'
transaction['Lots'] = '1000'
transaction['Visible quantity'] = '100'
transaction['Type'] = 'Limit'

result = sendTransaction(transaction)

if result ~= "" then
 message(string.format("Транзакция %s не прошла проверку на стороне терминала QUIK [%s]",
 transaction.TRANS_ID, result))
else
 message(string.format("Транзакция %s отправлена",
 transaction.TRANS_ID))
end

При запуске терминала с русским интерфейсом tri-файл будет выглядеть уже следующим образом:
Скрытый текст

а Lua транзакцию соответственно уже нужно задавать так:
Код
transaction = {}
transaction['TRANS_ID'] = '400001'
transaction['ACTION'] = 'Ввод айсберг заявки'
transaction['CLASSCODE'] = 'TQBR'
transaction['Торговый счет'] = 'L01-XXXXXXXX'
transaction['Примечание'] = 'СС1'
transaction['Инструмент'] = 'LKOH'
transaction['К/П'] = 'Купля'
transaction['Цена'] = '5592.5'
transaction['Лоты'] = '1000'
transaction['Видимое количество'] = '100'
transaction['Тип'] = 'Лимитная'
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
iceberg order, (латиница в заявке)
 
Цитата
QApplication написал:
Получается нельзя направить айсберг заявку на латинице?
Вся особенность в том, что для подачи айсберг-заявки нужно использовать универсальный формат (он описан в мануале, на который я давал ссылку выше). Универсальный формат транзакции использует кириллицу, если язык интерфейса терминала Quik задан русский, или же латиницу, если язык терминала задана английский. Все это подробно описано в 4 разделе мануала 'Использование Lua в Рабочем месте QUIK.pdf'.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
iceberg order, (латиница в заявке)
 
Цитата
QApplication написал:
Действительно при офрмировании ордера необходимо писать кирилицей
Добрый день.
Да, нужно писать именно кириллицей (при условии, что у Вас включен русский язык в терминале). Подробнее про особенности подачи транзакций можно почитать в 4 разделе официального мануала, ссылку смотрите у меня в подписи.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Как узнать текущие чистые позиции?
 
Цитата
Юлия написал:
Где тогда отлавливать момент совершения сделки, чтобы информация по позициям уже была?
Добрый день.
Можете попробовать использовать функции обратного вызова OnFuturesClientHolding(TABLE fut_pos) и OnFuturesLimitChange(TABLE fut_limit), они точно Вам сообщат, что фьючерсные позиция и ограничение изменились.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Не завершается main после остановки скрипта
 
Цитата
Старатель написал:
Так и должно быть?
Добрый день.
Поведение странное, постараемся разобраться с этим. Передал коллегам, чтобы они зарегистрировали обращение по данной проблеме.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Не завершается main после остановки скрипта
 
Да, проблема похоже в другом, добавил логирование, скрипт висел 5 секунд на строчке SetCell(t_id, 1, 1, tostring(r )):
Код
dofile(getScriptPath() .. "\\tools.lua")
local run = true

local function f()
  for i = 1, 2000000 do
    local a = 1 + 2 * 3 / 4
  end
  Log("f")
  return run
end

function OnInit(script_path)
  log_file = io.open(script_path .. ".log", "w+t")
end

function main()
  local t_id = AllocTable()
  AddColumn(t_id, 1, "", true, QTABLE_DOUBLE_TYPE, 20)
  CreateWindow(t_id)
  InsertRow(t_id, -1)
  while run do
    local r = f()
    Log("main1" .. tostring(r) .. tostring(t_id))
    SetCell(t_id, 1, 1, tostring(r))
    Log("main2" .. tostring(r))
    sleep(1)
    Log("main3" .. tostring(r))
  end
  message('Exit')
end

function OnStop()
  Log('OnStop1')
  run = nil
  Log('OnStop2')
  return 5000
end
Код
 08/13/2019 18:44:22.145387 main1true124
 08/13/2019 18:44:22.147395 main2true
 08/13/2019 18:44:22.149390 main3true
 08/13/2019 18:44:22.204382 f
 08/13/2019 18:44:22.204382 main1true124
 08/13/2019 18:44:22.220383 main2true
 08/13/2019 18:44:22.222388 main3true
 08/13/2019 18:44:22.276383 f
 08/13/2019 18:44:22.277385 main1true124
 08/13/2019 18:44:22.419389 main2true
 08/13/2019 18:44:22.421386 main3true
 08/13/2019 18:44:22.421386 OnStop1
 08/13/2019 18:44:22.421386 OnStop2
 08/13/2019 18:44:22.476385 f
 08/13/2019 18:44:22.476385 main1nil124
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Не завершается main после остановки скрипта
 
Изменить свой код так:
Код
  while run do
    local r = f()
    SetCell(t_id, 1, 1, tostring(r))
    sleep(15)
  end
у меня есть предположение, что выполняя паузу в 1 мск вы забиваете очередь Windows, у которой по умолчанию стоит таймер обращения к ресурсам процессора 15.6 мск. Со sleep(15) у меня до строки message('Exit') доходит всегда.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Не завершается main после остановки скрипта
 
Цитата
Старатель написал:
На современных компьютерах время работы функции f() менее 65 мс
Я только предположил, что проблема в долгой работе функции f(), наверное, правильнее было ответить так, если весь код до строчки message('Exit') будет выполняться более 5 секунд, то при нажатии кнопки Стоп интерпретатор Lua подождет 5 секунд и завершит поток main принудительно, если он еще жив.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Где посмотреть описание на флаг в транзакции?
 
Цитата
Старатель написал:
Что такое "на ввод заявки"? Имеется ввиду ACTION "NEW_ORDER" или что-то другое?
Добрый день.
Под пунктом 'Ввод заявки', подразумевается все торговые операции, в терминале Quik Вы можете увидеть эти транзакции открыв таблицу "Таблица транзакций" и в настройках таблицы выставить галочку Тип: На выставление заявки. Транзакции снятия и замены заявок так же являются торговыми, т.о. они так же должны иметь данный флаг.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Не завершается main после остановки скрипта
 
Цитата
Старатель написал:
Почему после остановки скрипта main не завершается (чаще всего) должным образом?
Добрый день.
Судя по содержимому функции f(), ее вызов может не завершиться за 5 секунд, которые Вы даете скрипту на корректное завершение (то значение которое возвращает функция OnStop()), если за этот таймаут поток main не успеет корректно завершиться, то интерпретатор Lua принудительно завершить этот поток.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Отправка транзакций из OnParam
 
Цитата
Let_it_go написал:
Увы, приходится объявлять переменную paper как глобальную, потому что sec внутри fn не видна.
Потому что у Вас функции get_position и fn объявлены на одном уровне, а переменная sec это локальная переменная функции get_position, сделайте вот так, и должно работать:
Код
function get_position (sec)

  function fn(t)

      if stop_search then return nil end --stop_search - это флаг. Изначально равен nil

      if t.sec_code == sec and t.client_code==client_code and t.limit_kind==2 then
        stop_search=true      
          return true
      else
          return false
      end

  end

   stop_search=nil --убиваем флаг, выставленный на прежних запусках функции.
   tbl_indxs=SearchItems('depo_limits', 0, getNumberOf("depo_limits")-1, fn)   
   if tbl_indxs then
      limit = getItem("depo_limits", tbl_indxs[1]) --найден 1 индекс, его и берём.
      local lot=lot[sec]--lot[sec] ранее определена
      return limit.currentbal/lot,limit.locked_buy/lot, limit.locked_sell/lot, limit.awg_position_price
   else
      return 0,0,0,0
   end
end
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Отправка транзакций из OnParam
 
Цитата
Let_it_go написал:
и второй вопрос, как мне в функцию fn передать переменную sec?
Добрый день.
По первому вопросу s_mike Вам дал исчерпывающий ответ. По второму вопросу про переменную sec, достаточно ее объявить на уровень выше объявления функции fn, она будет видна внутри функции fn, это можно сделать на глобальном уровне, или же непосредственно перед вызовом функции SearchItems, например:
Код
sec='SBER'
client_code='12345'

function main()
  
  function fn(t)
    if t.sec_code == sec and t.client_code==client_code and t.limit_kind==2 then 
        return true
    else
        return false
    end
  end

  --или здесь...
  --sec='SBER'
  --client_code='12345'

  tbl_indxs=SearchItems('depo_limits', 0, getNumberOf("depo_limits")-1, fn)

end
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Отправка транзакций из OnParam
 
Конечно же должно быть обращение к таблице 'orders'
Код
function fn (ord_sec_code, ord_flags)
   if table_contains(ticker_list, ord_sec_code) and orderflags2table(ord_flags).active  then
      return true
   else
      return false
   end
end

tbl=SearchItems('orders', 0, getNumberOf("orders")-1, fn, "sec_code,flags")
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Отправка транзакций из OnParam
 
Так же стоит обратить внимание на то, что написано в документации по функции SearchItems

  • fn – функция обратного вызова, возвращающая одно из следующих
    значений:
    • true – текущий индекс учитывается в результате;
    • false – текущий индекс не учитывается в результате;
    • nil – поиск прерывается, функция SearchItems возвращает таблицу с индексами,
      найденными ранее, включая текущий индекс.
Так что Вам лучше переписать функцию fn, вот пример чтобы выбрать все активные заявки из Вашего списка ticker_list (если функцию table_contains() так же переписать на поиск по ключу, как я писал выше, все должно отрабатывать быстро):
Код
function fn (ord_sec_code, ord_flags)
   if table_contains(ticker_list, ord_sec_code) and orderflags2table(ord_flags).active  then
      return true
   else
      return false
   end
end

tbl=SearchItems('trades', 0, getNumberOf("trades")-1, fn, "sec_code,flags")
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Отправка транзакций из OnParam
 
Цитата
Let_it_go написал:
19,21,22 - это номера моих сделок с Башнефтью. С учётом сдвига всё верно. Но как получить все поля по этим сделкам?
Функция возвращает только индексы заявок, которые удовлетворяют условиям Вашей функции fn(), дальше нужные заявки нужно забрать функцией row=getItem("orders",i), где i, это индекс из таблицы, которую вернула функция SearchItems.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Отправка транзакций из OnParam
 
Цитата
Let_it_go написал:
посмотрел описание функции SearchItems. Почему вы её рекламируете по сравнению с Кодfor i=0,getNumberOf("orders")-1,1 doВ ней тоже задаётся список строчек  с какой по какую искать. Если у меня за день 10 000 заявок, скрипт будет пробегать по всем. Разве не так?
Данная функция сделает это гораздо быстрее.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Отправка транзакций из OnParam
 
Цитата
Let_it_go написал:
Разве что переделать тикер лист в Код'SBER'=1; 'GAZP' = 2; 'GMKN' = 3;тогда ваша функция сработает. Но и в этом случае она где-то там невидимо для меня будет перебирать всю таблицу в поисках ключа.Спасибо за помощь!
Добрый день.
Вам нужно переделать ticker_list в набор вида:
Код
'SBER'=true; 'GAZP'=true; 'GMKN'=true;...
Для этого, Вам достаточно в месте, где Вы формируете таблицу ticker_list использовать вышеописанную функцию:
Код
function addToTable(table, key)
    table[key] = true
end
в этом случае, перебора никакого не будет, (даже "где-то там невидимо..."), т.к. обращение выполняется напрямую по ключу, это в разы быстрее чем перебирать все значения таблицы в цикле. Нужно просто вместо вашей старой функции table_contains использовать:
Код
function tableContains(table, key)
    return table[key] ~= nil
end
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Отправка транзакций из OnParam
 
Цитата
Let_it_go написал:
Я запускаю CleanActive из OnStop и из самого начала функции main. Это очень часто вешает квик, приходится его убивать через окно с процессами.
Добрый день.
Функция OnStop() это тоже функция обратного вызова, соответственно тяжелые и долгие операции в ней будут подвешивать терминал. Допустим у Вас на момент остановки скрипта в терминале 10 000 заявок, при этом большинство из них сняты (делаю вывод из вашего описания из #1 поста), тогда в функции CleanActive() скрипт будет пробегать по всем заявкам, это 10 000 итераций, так же в таблице ticker_list у Вас, допустим, 50 инструментов, линейный пробег по всем еще увеличивает количество итераций (берем среднее значение=25, т.к. не обязательно, что инструмент row.sec_code будет самым последним), итого 10 000 * 25=250 000 итераций. Пока все эти циклы будут выполняться, терминал будет ждать завершения OnStop() и соответственно висеть. Могу только посоветовать оптимизировать логику работы функции CleanActive - использовать функцию SearchItems для поиска всех активных заявок по инструментам из ticker_list. Так же можно убрать линейный забег в функции table_contains, этим Вы уже в разы уменьшите количество итераций, в интернете много примеров как это сделать, вот например:
Код
function addToTable(table, key)
    table[key] = true
end

function removeFromTable(table, key)
    table[key] = nil
end

function tableContains(table, key)
    return table[key] ~= nil
end

Если будут затруднения с использованием функции SearchItems, пишите.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
QUIK 8.0
 
Цитата
s_mike@rambler.ru написал:
все остальные библиотеки и способы, в том числе те,  на которые здесь были ссылки,  не собрались нормально.  
Возможно это особенность dll, которую Вы собираете, но гадать можно бесконечно не имея исходников.
Главное, что в итоге библиотека собралась.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
QUIK 8.0
 
Цитата
s_mike@rambler.ru написал:
У меня не получается собрать почему-тоСобираю VC Enterprise 2015библиотеку беру lua-5.1.5_Win64_vc15_lib.zipсобираю проект  release x64 :  dll с многобайтовой кодировкойпри сборке виду кучу неразрешенных внешних символов типа feof в функции getF  или freopen в функции luaL_loadfile.как понимаю, это имена из lua5.1.lib и дело в разрядности сборки.
Добрый день.
В итоге у Вас получилось собрать? Какую библиотеку собираете, собственную или общедоступную?
Зачастую просто поменять Lua-шные исходники в проекте не достаточно, нужно проверить все линки в настройках проекта.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
QUIK 8.0
 
Цитата
Игорь Б написал:
Visual Studio для этого не использую.Использую LuaForWindows_v5.1.4-46
Для получения компилированного lua скрипта (*.luac) нужно скачать x64 luaс.exe, соответственно Вам нужно пройти по ссылке https://sourceforge.net/projects/luabinaries/files/5.1.5/Tools%20Executables/ и скачать lua-5.1.5_Win64_bin.zip.
Цитата
Игорь Б написал:
Цитата
Еще хотел бы поправить написанное мной выше, версия 5.1.4 это не последняя версия, есть еще патч 5.1.5 ( https://sourceforge.net/projects/luabinaries/files/5.1.5/Windows%20Libraries/Static/  ), правильнее будет использовать его.
Там несколько вариантов. Какой надо?
по данной ссылке выложены исходники для компиляции собственных dll, которые потом уже используются в lua скриптах.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
QUIK 8.0
 
Цитата
Игорь Б написал:
Там несколько вариантов. Какой надо?
Смотря какой версией Visual Studio Вы будите компилировать, для 2015 я использовал lua-5.1.5_Win64_vc15_lib.zip. Выше Павел использовал 2013 версию и скачивал lua-5.1.5_Win64_vc12_lib.zip
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
QUIK 8.0
 
Цитата
Павел написал:
Благодарю за помощь. Все получилось.
Рад был помочь.
Еще хотел бы поправить написанное мной выше, версия 5.1.4 это не последняя версия, есть еще патч 5.1.5 (https://sourceforge.net/projects/luabinaries/files/5.1.5/Windows%20Libraries/Static/ ), правильнее будет использовать его.
Проверял на Visual Studio 2015 пакет lua-5.1.5_Win64_dll15_lib.zip, все работает, библиотеки собираются.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
QUIK 8.0
 
Цитата
Павел написал:
А если мне нужно использовать собственную dll как сделать x64 ?
Добрый день.
Да для x64 необходимо скачать исходники для x64. Все доступно на официальном сайте http://luabinaries.sourceforge.net/
Проверялось для сборки Lua 5.1.4 - Release 2
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
QUIK 8.0
 
Цитата
Александр М написал:
Конкретно вот этот компилятор годится для вашей новой архитектуры?: https://sourceforge.net/projects/luabinaries/files/5.1.5/Tools%20Executables/lua-5.1.5_Win64_bin.zip....
Да, этот компилятор можно использовать (я использовал именно его). Что касается LuaForWindows, я не видел x64 сборку данного пакета, по данному вопросу могу посоветовать только обратиться к его разработчикам.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
QUIK 8.0
 
К сожалению, повторной компиляции скриптов под x64 не избежать, это последствия смены архитектуры терминала, т.к. в нем используется уже x64 интерпретатор Lua.
В документацию обязательно добавим информацию.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
QUIK 8.0
 
Добрый день.
Для корректной работы с *.luac файлами в терминале 8.0 необходимо исходные *.lua файлы скомпилировать x64 версией Luac.exe
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Отладчик, статистика для теста робота и непонятный висяк, C++ интеграция
 
Цитата
Denis написал:
Пытаюсь запустить test_trans из указанного мануала, используя номер клиентского счета из регистрационного мейла, но получаю сообщения
Не совсем понимаю про какой test_trans Вы имеете ввиду.
Сергей Вам правильно рекомендует сначала добиться выставления необходимой транзакции через интерфейс терминала Quik, а далее уже с такими же параметрами пытаться подать транзакцию из QLua.
Как посмотреть все параметры транзакции через таблицу Карман транзакций так же рассказано в мануале.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Отладчик, статистика для теста робота и непонятный висяк, C++ интеграция
 
Цитата
Denis написал:
Собственно ничего не происходит после  sendTransaction(Transaction);
Добрый день.
Анализируйте результат работы функции sendTransaction(), т.к. некоторые проверки выполняются на стороне терминала Quik в момент отправки транзакции и ожидать OnTransReply() в этом случае нет смысла, т.к. транзакция не отправляется на сервер Quik. Вот пример обработки результата работы функции sendTransaction():
Код
result = sendTransaction(transaction)

if result ~= "" then
  message(string.format("Транзакция %s не прошла проверку на стороне терминала QUIK [%s]", transaction.TRANS_ID, result))
else
  message(string.format("Транзакция %s отправлена", transaction.TRANS_ID))
end
Более подробная информация есть в официальном мануале (см. ссылку у меня в подписи)
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
getCandlesByIndex в индикаторе, Как используется функция getCandlesByIndex в индикаторе?
 
Хотя можно даже короче, т.к. только параметр index не является глобальным:
Код
function OnCalculate(index)
    plusdi,n,q = getCandlesByIndex ("SBAdx",1,0,getNumCandles("SBAdx"))  -- get +DI table
    minusdi,n,q = getCandlesByIndex ("SBAdx",2,0,getNumCandles("SBAdx")) -- get -DI table
    return handler(index)
end

function handler(index)
    if plusdi[index].close ~= nil and minusdi[index].close ~= nil then
        if plusdi[index].close > 30 then
            my_indicator = 1
        elseif minusdi[index].close > 30 then
            my_indicator = -1
        else my_indicator = 0
        end
    else my_indicator = 0
    end
    return my_indicator
end

И проверьте, возвращает ли функция getCandlesByIndex() данные, тут может быть проблема в том, что тэг 'SBAdx' не задан в свойствах индикатора ADX.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
getCandlesByIndex в индикаторе, Как используется функция getCandlesByIndex в индикаторе?
 
Добрый день.
У Вас в функции handler() используются переменная index, таблицы plusdiи minusdi, но я не вижу, чтобы вы эти данные передавали в функцию handler() (эти переменные не глобальные, соответственно они не будут видны в функции handler), сделайте вот так:
Код
function OnCalculate(index)
    plusdi,n,q = getCandlesByIndex ("SBAdx",1,0,getNumCandles("SBAdx"))  -- get +DI table
    minusdi,n,q = getCandlesByIndex ("SBAdx",2,0,getNumCandles("SBAdx")) -- get -DI table
    return handler(index, plusdi, minusdi)
end

function handler(index, plusdi, minusdi)
    if plusdi[index].close ~= nil and minusdi[index].close ~= nil then
        if plusdi[index].close > 30 then
            my_indicator = 1
        elseif minusdi[index].close > 30 then
            my_indicator = -1
        else my_indicator = 0
        end
    else my_indicator = 0
    end
    return my_indicator
end
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Выгрузка библиотек
 
Цитата
s_mike@rambler.ru написал:
И еще один вопрос по теме.в случае индикатора этот способ будет работать? Eстройство терминала в этом вопросе для меня туманная загадка...при старте loadlib() и connect() в КАЖДОМ экземпляре индикатора и в ondestroy() вычищение его из _Gпроблемы ожидаются?
Добрый день.
Проблем не должно быть, ведь каждый Lua скрипт, и каждый Lua индикатор крутятся в своем собственном экземпляре виртуальной машине Lua, соответственно в каждой из этой виртуальной машине совой экземпляр таблицы _G, package.loaded и т.д.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Выгрузка библиотек
 
Цитата
s_mike@rambler.ru написал:
Отлично, рецепт помог, спасибо.

Как понимаю, память будет освобождена..
т.к. ссылка на модуль уничтожается, в этом случае сборщик мусора VM lua в теории должен подчистить память при очередном забеге.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Выгрузка библиотек
 
И еще один момент, при завершении скрипта модули автоматически выгружаются.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Выгрузка библиотек
 
Цитата
s_mike@rambler.ru написал:
Здравствуйте.Как выгрузить библиотеку при завершении скрипта?
Добрый день.
Насколько мне известно, в Lua нет функционала принудительной выгрузки модулей, но возможность есть, вот пример (sqlite3.dll под рукой не было, проверил на odbc.dll):
Код
function main()
  
  assert(package.loadlib(getScriptPath() .. "\\lib\\luasql\\odbc.dll", "luaopen_luasql_odbc")) ()
  env = luasql.odbc()

  local db = env:connect("LuaTest","login","pass")

  db:close()
  env:close()
  
  
  print_loaded_modules()
  
  unrequire('luasql')
  message('**********')
  print_loaded_modules()
end

function print_loaded_modules()
  for k,v in pairs(package.loaded) do
    message(string.format("%s=%s", k, tostring(v)))
  end
end

function unrequire(m)
  package.loaded[m] = nil
  _G[m] = nil
end
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Страницы: 1 2 3 След.
Наверх