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

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

Страницы: 1 2 3 След.
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
Где найти описание языка Lua. И другую полезную информацию.
 
Цитата
zv78 написал:
Как запустить что либо в квике я не знаю. Про это где написано?
Добрый день.
В справке по плагину QLUA описаны только функции, сами же основы работы со скриптами Lua в терминале Quik мы постарались подробно описать в документе 'Использование Lua в Рабочем месте Quik.pdf'. Для начала изучения работы со скриптами Lua в терминале Quik информации из данного документа должно быть достаточно. Архив с документацией и примерами скриптов можно скачать здесь: https://arqatech.com/upload/Public/quik_lua.zip
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Можно ли как то почистить таблицу транзакций?
 
Цитата
Андрей написал:
И еще вопрос где то видел, что таблицы можно перенести из одной вкладки в другую, но не могу найти как это сделать?

Добрый день, еще есть возможность быстрого переноса таблиц между вкладками, нажимаете клавишу Ctrl, не отпуская клавишу, берете указателем мыши необходимую Вам таблицу за заголовок и перетаскиваете на нужную вкладку.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Значение символов из таблиц вроде %q+
 
Цитата
Анатолий написал:
"%%%02X"  - что тут означают аж три знака % ?, первый надо понимать экранирующий, но зачем после него еще два знака % а не один? Т.к. сказано что опцией является %02X а не %%02X
Добрый день.
Выше на странице, на которую Вы ссылаетесь, описана для чего используется '%%'.
Цитата
By the way, because of those changes, a `%´ in the replacement string must be escaped as "%%".
Т.е. насколько я понял автора, в строке  return string.format ("%%%02X", string.byte(с)) он ищет подстроки вида '%00[HEX]' и меняет их на значение передаваемое в параметре c. Т.о. первые '%%' отвечают за символ %, а '%02X' уже за HEX с двумя нулями впереди.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Значение символов из таблиц вроде %q+
 
Цитата
Анатолий написал:
Что значат эти два прямых слэша в s = string.gsub(s, "\\(%a+){(.-)}", " %2 ")   -  "\\(%a+){(.-)}"?
Добрый день.
При работе с регулярными выражениями, если нужно использовать какой-либо зарезервированный символы как обычные, то их нужно экранировать, прямой слэш является символом экранирования. Погуглите на тему "экранирование спецсимволов в lua".
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Значение символов из таблиц вроде %q+
 
Цитата
Анатолий написал:
растолкуйте мне пожалуйста что они значат и что дает добавление знака плюс
Добрый день.
Поищите в интернете статьи об использовании паттернов или регулярных выражений в Lua, это достаточно мощный и интересный функционал, вот для примера официальное описание для Lua https://www.lua.org/pil/20.2.html, на русском так же статей много.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Разделение условий.
 
Вот здесь описан синтаксис оператора if в Lua.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Разделение условий.
 
Опечатался... truet = true
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Разделение условий.
 
Добрый день.
Да, Вы совершенно верно предположили необходимость использования дополнительного флага (в Вашем случе traling). Только нужно переменную traling заранее определить как false. Вот небольшой шаблон

Код
traling = false

function main()

  if traling == false then

    --что-то делаем, что нужно сделать первоочередно
    traling = true

  end

  if traling == truet then
    --что-то делаем, только если выполнен первоочередный шаг
  end

end
можно еще использовать вот такую конструкцию:
Код
traling = false

function main()

  if traling == false then

    --что-то делаем, что нужно сделать первоочередно
    traling = true

  elseif traling == truet then

    --в эту ветку уже не зайдем если зашли в ветку traling == false

  end

end
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
OnAllTrade flags, Как определить покупку или продажу по полю flags события OnAllTrade
 
Добрый день.
Поле flags структуры all_trades нужно интерпретировать как битовую маску (т.е. рассматривать не как число в десятичной системе счисления, а как число в двоичной системе счисления).
В вашем случае:
1025 = 0100 0000 0001 (бит 0 (0x1)  Сделка на продажу)
1026 = 0100 0000 0010 (бит 1 (0x2)  Сделка на покупку)

Для работы с битовыми масками есть специальные функции (см. справку QLua, раздел "Функции для работы с битовыми масками в структурах данных")

Легче всего использовать функцию bit.test, вот примет:
Код
if bit.test(alltrade.flags, 0) then
  message("Обезличенная следка на продажу")
elseif bit.test(alltrade.flags, 1) then
  message("Обезличенная следка на покупку")
else
  message("Направление обезличенной сделки не определено")
end
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Разделение условий.
 
Добрый день.
Обработал Ваш код, иначе читать такой объем в таком виде невозможно. Укажите, пожалуйста, в каком именно месте/функции Вам нужно разделить условия, описанные выше
Скрытый текст
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Арифметические операции со временем
 
Цитата
Let_it_go написал:
Все мои арифметические операции с секундами. Это главная потребность. Минуты и часы не нужны
Добрый день.
Если все операции с секундами, то, действительно, как уже сказал выше s_mike, все вычисления можно делать стандартными функциями. Вот небольшой пример:
Код
my_time = {year=1970, month=1, day=1, hour=12, min=45, sec=59}

n_time = os.time(my_time)
t_time = os.date("*t", n_time+62)

message(tostring(t_time.hour).. ':' .. tostring(t_time.min) .. ':' .. tostring(t_time.sec))
>> 12:47:1

https://www.lua.org/pil/22.1.html
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Арифметические операции со временем
 
Когда-то для своих нужд писал функцию прибавления минут (не помню почему, но нужно было прибавлять именно только минуты), можно переработать и сделать универсальной для сложения/вычитания двух временнЫх значений:
Код
--функция прибaвляет минуты к времени time.
--time передается в формате {hour, min, sec}
function addTime(time, min)
  local _time = copy(time)
  if min >= 60 then
    local hour = math.floor(min/60)
    _time.hour = _time.hour + hour
    min = min - hour*60
  end
  _time.min = _time.min + min
  if _time.min >= 60 then
    _time.hour = _time.hour + 1
    _time.min = _time.min - 60
  end
  if _time.hour >= 24 then
    _time.hour = _time.hour - 24
  end
  return _time
end
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Страницы: 1 2 3 След.
Наверх