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

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

Страницы: Пред. 1 ... 3 4 5 6 7 8 9 10 11 12 13 След.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
 
Цитата
Артем написал:
С алиасингом булевых значений в глубоких таблицах действительно была ошибка которую надо исправить, хотя в целом некритичная - булы они и в африке булы, под каким именно алиасом они сидели это неважно.
   Я еще раз посмотрел addalias ( item, path, deep, seen ) и не увидел контроля уникальности path (с выдачей сообщения об ошибке в каком-то виде). Делать это надо отдельно  от уже реализованного контроля уникальности item.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
 
Цитата
Артем написал:
TGB , в Lua имеется встроенный компилятор который производит бинарный байткод, который может выполняться в виртуальной машине Lua.
и т.д  ..........
 Это мне известно.

Похоже, мы обсуждаем:
Цитата
TGB написал:
То, что делается в исходном, обсуждаемом модуле, можно сделать, как мне кажется, элегантнее, формируя в качестве строки образа таблицы, текст исполняемого скрипта. Результат такого подхода:
1) tbl_to_str на ~20% - длиннее, чем dumpstr;
2) str_to_tbl  - короче аналогичной  loadstr в ~10 раз. .
   Здесь рассмотрен вариант когда результатом выполнения функции tbl_to_str (аналога dumpstr) является строка-скрипт вида:
local TBL = {}  
TBL.table00000263878C31B0 =  {}  --- создание таблицы --
TBL.table00000263878C31B0 [ [[expansion]] ] = [[txt]]
TBL.table00000263878C31B0 [ [[INTERVAL_W1]] ] = 10080
TBL.table00000263878C31B0 [ [[QTABLE_DOUBLE_TYPE]] ] = 2
TBL.table00000263878C31B0 [ [[INTERVAL_M5]] ] = 5
---- и так далее.
return TBL.table00000263878C31B0
-------
Функцию str_to_tbl я приведу полностью:
--- Рузультат функции: таблица полученная из строки s или текст описания ошибки ---
local function str_to_tbl (s )
   do local tt= { }     for k, v in pairs ( alias ) do tt[ v ] = k end alias = tt end --- alias: переворот: alias = { [ <Имя> ] = <Значение (> }
   local fun , err = load ( s )  
   if  err ~= nil  then return  err  else   return  fun()   end
end
--------------------
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
 
Цитата
Артем написал:
elseif kt == 'boolean' then kcurr = alias[ k ] or k == 'true'
elseif kv == 'boolean' then v = alias[ v ] or v == 'true'
  С этим согласен.
Цитата
Артем написал:
Я понял в чём проблема с метатаблицами: возможны ситуации, когда метатаблица загружается до того, как исползующий ей стол, тогда метаметоды будут активны сразу. [QUOTE]
 Именно о такой ситуации я написал в комментарии кода.
[QUOTE]Артем написал:
Метаметоды можно обойти через rawset.
Тоже нормальный (и более простой) вариант.
Цитата
Артем написал:
При желании можно с байткодом конечно шаманить но с функциями на С это всё равно не работает, так что ради единообразности и Lua функции тоже не поддерживаются.
Это я не понял.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
 
Цитата
Артем написал:
TGB ,про бинарные строки вам уже рассказали. Собственно эта информация прямым текстом написана в третьем параграфе первой главы, т.е. в самом начале инструкции - которую вы очевидно не читали. Так что пожалуйста прочитайте, целиком и полностью. Перед тем как делать библиотеки для других людей, сначала убедитесь что ваши познания и умения находятся на уровне повыше плинтуса.
 После этого комментария, когда у меня появилось время, мне (сразу, без переобувания в тапочки :smile: ) захотелось поучиться у вас, и посмотреть тот код, который вы тут выложили.
  Выложенный вами модуль, в целом, написан в хорошем стиле. Если вы это сделали сами, то, похоже на то, что Lua вы знаете. Однако, несколько настораживает то, что в модуле нет ни одного комментария и много операторов одной строкой. Такое ощущение, что это написано сразу начисто (и без отладки). Я бы так не смог :smile: .
  При более детальном просмотре я увидел, что в представленном вами модуле есть ошибки (я сделал правки в 8-ми местах). Чего я не ожидал  :smile:  так это то, что в нем не учтено существование в Lua типа boolean (смотрите правки в коде модуля). Этот тип хорошо описан в любезно предложенной вами инструкции на сайте https://www.lua.org/manual/5.3/  в разделе 2.1  (в 1.3 этого описания не ищите).
  Я поправил в модуле те ошибки, которые, как мне кажется, увидел (но возможно и добавил свои :smile: ). Понятно, что какие-то ошибки могли и остаться. Свои правки я как-то прокомментировал, выделив существенные изменения символами ###.  
  Модифицированный код модуля выложен в конце данного комментария.
  Кстати, я проверил быстродействие dumpstr модуля  на своем ПК и моем _G  (понятно, что у нас с вами в этом могут быть большие различия). Мой dump_str  (написанный два года назад, в тренировочных целях, когда мне пришлось перейти на  QUIK) выполняется (на таблице _G)  в 3 раза быстрее, чем dumpstr модуля, но это мелочи. У представленного вами модуля назначение другое (в том виде как он есть, это точно не визуализация) и его функциональность богаче.
----
    То, что делается в исходном, обсуждаемом модуле, можно сделать, как мне кажется, элегантнее, формируя в качестве строки образа таблицы, текст исполняемого скрипта. Результат такого подхода:
1) tbl_to_str на ~20% - длиннее, чем dumpstr;
2) str_to_tbl  - короче аналогичной  loadstr в ~10 раз. .
--------------------------------
P.S.
 Все мы, время от времени, в чем-то ошибаемся. Существенная разница состоит только в том, что одни больше усилий предпринимают для устранения своих ошибок, а другие на их оправдание и надувание щёк.
-------
Измененный код обсуждаемого модуля:
Код

local aliases = { }     

local function escape ( s )
    s = tostring ( s ):gsub ( "\n", "\\n" )
    return s
end

 local function dumpstr ( t, alias, seen )
    alias, seen = alias or aliases, seen or { }
    if seen[ t ]  then return "" else seen[ t ] = true end
    local s, mt = string.format ( "newtable %s\n", alias[ t ] or escape ( t ) ), getmetatable ( t )
    if mt then s = string.format ( "%smetatable %s\n", s, alias [ mt ] or escape ( mt ) ) end
 local k_t, v_t                                                                                                                     
    for k, v in pairs ( t ) do
       k_t, v_t  = alias[ k ] or escape ( k ),  alias[ v ] or escape ( v )                                         
      if k_t == 'charpattern' then v_t = '%[' end                                    ----     ??? --- и без этого все работает, но если этот символ оставить в покое, обрубается виализация результата dumpstr ?
        s = string.format ( "%sk %s %s\nv %s %s\n", s, type ( k ), k_t, type ( v ), v_t )                
    end
    if mt  then  s = string.format ( "%s%s", s, dumpstr ( mt, alias, seen ) )  end
    for k, v in pairs ( t ) do
        if type ( k ) == 'table'  then s = string.format ( "%s%s", s, dumpstr ( k, alias, seen ) ) end
        if type ( v ) == 'table' then s = string.format ( "%s%s", s, dumpstr ( v, alias, seen ) ) end
    end 
    return s
end

local function unescape ( s )
    s = s:gsub ( "\\n", "\n" )
    return s
end
---------------                                                         ! Символами ###  выделены измененные места, для  исправления ошибок    -------
local function loadstr ( s, alias )
    alias = alias or aliases
    do local t = { } for k, v in pairs ( alias ) do t[ v ] = k end alias = t end
    local tlist, tcurr, kcurr, troot = { }, nil, nil, nil
   local tmt, ttb 
    for l in s:gmatch ( "([^\n]+)\n" ) do
        local nt = l:match ( "newtable (.+)" )
        local mt = l:match ( "metatable (.+)" )
        local kt, k = l:match ( "k ([^ ]+) (.+)" )
        local vt, v = l:match ( "v ([^ ]+) (.+)" )
        if nt     then    if tmt then setmetatable ( ttb, tmt ); tmt, ttb  = nil, nil  end                      --- ###   1. setmetatable выполняется после завершения формирования  ttb (смотрите п.2)
            tlist[ nt ] = tlist [ nt ] or alias[ nt ] or { }; tcurr = tlist[ nt ]; troot = troot or tcurr;  d_nt = nt 
        elseif mt then tlist[ mt ] = tlist[ mt ] or alias [ mt ] or { };  ttb = tcurr; tmt = tlist [ mt ]        --  ###  2. setmetatable  нужно выполнять после того как будет полностью сформирована tcurr. 
        elseif k then                                                                                                             ----         Иначе могут срабатывать метаметоды, если метатаблица была сформирована раньше. 
            if   kt == 'table' then  tlist[ k ] = tlist[ k ] or alias[ k ] or { }; kcurr = tlist[ k ]
            elseif kt == 'number' then kcurr = alias[ k ] or tonumber ( k ) or 0/0
            elseif kt == 'string' then kcurr = alias[ k ] or unescape ( k )
         elseif kt == 'boolean'  then  kcurr = alias[ k ] or  k                                                 ----- ###   3.  добавлено (учет типа boolean): elseif  kt == 'boolean'  then  kcurr = alias[ k ] or  k  ---
            else kcurr = alias[ k ]  or  k                                                                                 ----- ###   4.   добавлено (учет:элеметов не входящих в alias)   or  k   ---
            end
        elseif v and tcurr and kcurr ~= nil then
            if   vt == 'table' then tlist[ v ] = tlist[ v ] or alias[ v ] or { }; tcurr[ kcurr ] = tlist[ v ]
            elseif vt == 'number' then  tcurr[ kcurr ] = alias[ v ] or tonumber ( v ) or 0/0           
            elseif vt == 'string' then tcurr[ kcurr ] = alias[ v ] or unescape ( v )
         elseif vt == 'boolean' then  tcurr [ kcurr ] = alias[ v ] or  v                                        ---- ###   5.   добавлено: elseif vt == 'boolean' then  tcurr [ kcurr ] = alias[ v ] or  v ---
            else tcurr [ kcurr ] = alias[ v ] or  v                                                                       ----- ###   6.   добавлено:  or  v   ---                
            end
        end
    end
   if tmt then setmetatable ( ttb, tmt )   end                                                                         --- ###   7. Выполняется в поледней обработанной таблице (! если у нее есть метатаблица)
    return troot
end

local function dumpfile ( file, t, alias, seen )
    alias, seen = alias or aliases, seen or { }
    if seen[ t ] then return else seen[ t ] = true end
    local mt = getmetatable ( t )
    file:write ( string.format ( "newtable %s\n", alias[ t ] or escape ( t ) ) )  
    if mt then file:write ( string.format ( "metatable %s\n", alias [ mt ] or escape ( mt ) ) ) end
    for k, v in pairs ( t ) do
        file:write ( string.format ( "k %s %s\nv %s %s\n", type ( k ), alias[ k ] or escape ( k ), type ( v ), alias[ v ] or escape ( v ) ) )
    end
    if mt then dumpfile ( file, mt, alias, seen ) end
    for k, v in pairs ( t ) do
        if type ( k ) == 'table' then dumpfile ( file, k, alias, seen ) end
        if type ( v ) == 'table' then dumpfile ( file, v, alias, seen) end
    end
end

local function addalias ( item, path, deep, seen )
    if item == nil and path == nil and deep == nil and seen == nil then item, path, deep = _G, "_G", true end
    seen = seen or { }
    if item == nil or path == nil or seen[ item ] ~= nil then
        return
    elseif type ( item ) == 'table' and deep then
        seen[ item ] = true
        for k, v in pairs ( item ) do
            if type ( v ) == 'table'  then
                addalias ( v, string.format ( "%s.%s", path , escape( k ) ), deep, seen )   
            elseif type ( v ) ~= 'string' and type ( v ) ~= 'number' and type ( v ) ~= 'boolean' then         ----- ###  8.   добавлено (учет boolean):  and type ( v ) ~= 'boolean' 
                aliases[ v ] = string.format ( "%s.%s", path, escape ( k ) )  
            end
        end
    else
        aliases[ item ] = path
    end
end
 
addalias ( math.huge, "math.huge" )
addalias ( -math.huge, "-math.huge" )

return { dumpstr = dumpstr, dumpfile = dumpfile, loadstr = loadstr, addalias = addalias }
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
 
Цитата
Артем написал:
TGB ,  https://www.lua.org/manual/5.3/  https://www.lua.org/manual/5.4/
От корки до корки прошдутируйте, пожалуйста.
  Я думаю что вы мне здесь все расскажите :smile:
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
 
Цитата
s_mike@rambler.ru написал:
Здесь вы опять ошибаетесьprint(#("x" .. "a\0\b"))4


www.bot4sale.ru         t.me/bot4sale
 Ну и ладно :smile:
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
 
Цитата
s_mike@rambler.ru написал:
print(string.len("a"))print(string.len("a\0b"))
   Длины разные, но "a" .. "a\0b" = "aa". Проверено в Lua 5.3.5 и 5.4.1. Непорядок. Разработчикам Lua это надо бы довести до сведенья.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
 
Цитата
s_mike@rambler.ru написал:
в первом примере не раскрыто содержимое таблицы, являющеся ключом. Сериализация это подразумевает. Таблица ключа может содержать вложенные таблицы, которые также должны быть раскрыты.
   Я при описании dump_tbl ни разу не упоминал про сериализацию и в этой функции ключи типа table, userdata и function не раскрываются. Для них выдается их служебный код (ссылка).

Цитата
s_mike@rambler.ru написал:
во втором случае результат явно неверен. "a" и "a\0b" - совершенно разные строки.
   Так как символ \0 в Lua это признак завершения строки, то для Lua "a" и "a\0b" - эквивалентные строки.

Цитата
s_mike@rambler.ru написал:
в третьем случае 1.#inf не является допустимым числом lua. Это всего лишь нерегламентированное внутреннее представление, которое не может попадать в результат.
   Результат 1.#inf выдает Lua и я не собираюсь переделывать его.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
 
Цитата
Nikolay написал:
Велосипеды уже давно написаны, языку уже 27 лет. Не стесняетесь пользоваться  http://lua-users.org/wiki/SampleCode , раздел Serialization.
 Согласен. Пользоваться не стесняюсь. Сайт хороший.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
 
Цитата
s_mike@rambler.ru написал:
dump_tbl ({[{"xx","yy"}]=5}, " ", 0)c dump_tbl ({math.huge}, " ", 0) тоже как то не очень.dump_tbl ({"a\0b"}, " ", 0)Торопитесь, TGB ..
 Спасибо за нетривиальные примеры для тестирования.

local str = ""    
for k,v in next, dump_tbl ({ [ {"xx","yy"} ] =5}, " ", 0) do str = str .. v end РЕЗУЛЬТАТЫ теста (в квадратных скобках индексы таблиц)
MessageDlg ( 1, 1, "Скрипт", " Результат: \n" .. str)                                             Результат: [table: 0F4ED2F0] (number) = 5
-------
str = ""    
for k,v in next, dump_tbl ({"a\0b"}, " ", 0) do   str = str .. v  end
MessageDlg ( 1, 1, "Скрипт", " Результат: \n" .. str)                                             Результат: [1] (string) = a
MessageDlg ( 1, 1, "Скрипт", " Результат: \n" .. "a\0b")                                        Результат:  a   ---
message ("a\0b")                                                                                                Результат:  a
-------
str = ""    
for k,v in next, dump_tbl ({math.huge}, " ", 0) do   str = str .. v  end
MessageDlg ( 1, 1, "Скрипт", " Результат: \n" .. str)                                             Результат: [1] (number) = 1.#INF
message (tostring(math.huge))                                                                            Результат: 1.#INF
-----------------------------------------------------------------------------------------
 Я ошибок не нашел. Где они?
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
 
Цитата
Незнайка написал:
В чём это выражается?
Цитата
Незнайка написал:
И там и там конкатенация строк. В чём профит?
  В том как я предложил вам собирать строку профита нет. Профит есть при использовании специальной быстрой C-функции сборки строки из массива строк (тоже из API, но С-пакета, который пришлось бы устанавливать).
  Если собирать без профита, то при выполнении операции  <строка1> = <строка1> .. <добавляемая строка>  в Lua всякий раз выполняется отказ от предыдущей памяти <строка1> и запрашивается новая память под новое значение <строка1>.  В быстрой C-функции сборки строки на C++ реализована эффективная динамическая строка, в которую последовательно добавляются <добавляемые строки> вообще без описанной мною в предыдущем предложении нагрузки на автоматическое управление памятью.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
 
Цитата
Nikolay написал:
В этом проблема. Кеширования ссылок нет.
  Покажите пример. Можете распечатать контекст Lua: dump_tbl (_G, " ", 0)
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
 
Цитата
Незнайка написал:
Ставить дополнительную библиотеку только лишь для создания уникальных ключей - не лучшее решение.
  Согласен.  Но я не предлагаю что-то ставить. Я привел оглавление описания API и одну из простых, но полезных, по моему мнению, для разработчиков функций.
Цитата
Незнайка написал:
Может, лучше сразу распечатать таблицу в виде строки, без конвертации в другую таблицу?
  У меня используется специальная быстрая функция сборки строки из массива строк и я это делаю в dump_str используя dump_tbl.  Дело в том, что цикл вида:  <строка1> = <строка1> .. <добавляемая строка> при большом количестве повторений (а я предполагаю что это может быть) в Lua заметно нагружает управление памятью.  Вы же можете получать свою строку следующим образом: local str = ""     for k,v in next, dump_tbl (<Параметры>) do   str = str .. v  end  или модифицировать код функции dump_tbl.                              
Цитата
Nikolay написал:
Вы попробуйте им вывести Класс или таблицы с перекрестными ссылками.
Функция dump_tbl   рекурсивная и в ней раскручиваются все ссылки.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
 
Комментариев обсуждения функции cоздания последовательности ключей я насчитал более двадцати. Это одна из самых простых функций из списка API  OS_Quesha, оглавление описания которого в документации приводится ниже.
1. Вывод сообщений.
2. Работа со временем.
3. Создание последовательностей ключей.
4. Создание среды функционирования разрабатываемого робота.
5. Взаимодействие потоков.
6. Обеспечение явной синхронизации потоков.
7. Работа с таймерными событиями.
8. Работа с контрольными точками.
9. Работа с фоновыми заданиями.
10. Обеспечение отладки функций и взаимодействия потоков.
11. Разное.
   Примером простой (классическая задача на рекурсию), но, наверное, полезной функции из раздела 10 является универсальная функция печати переменных dump_str. Она может быть использована в тексте программ для вывода любых переменных (и таблиц произвольной вложенности) Lua.
  Ниже приводится код функции, которую можно использовать автономно (может быть кому то окажется полезной):
Код
---                                       Вывод  произвольной таблицы в виде таблицы-массива строк                  ------
------  Параметры: 1) t  -  таблица (выводятся все вложения до limit);  2) i  -  строка формирования отступа при выводе вложений (например, "  ")  
----    3) limit - уровень вложенности до которого просматривается таблица (если = 0, то все уровни)-----
--- ! Результат: таблица строк:   структура со значениями таблицы t  (текстовая сортировка по возрастанию индексов таблиц). -----
---  !!  Элемент таблицы [1] - заголовок таблицы. Остальные элементы - строковые представления  структуры таблицы t 
---       с дополнительными служебными описаниями вложенных в t таблиц.    -----
function dump_tbl(t, i, limit)
   if type(t) ~= "table" then
         return nil
   end  
     
   local tbl = {};  ---   для результата  ----
   tbl[#tbl +1]  = "=====    Таблица (текстовая сортировка по возрастанию индексов таблиц): " .. tostring(t) 
                      .. "  \n                                                                                       ! Количество выводимых уровней вложенности (если = 0, то выводятся все) =  " .. limit .. "\n" 
   if next(t) == nil then   ---  таблица пустая  -------
        tbl[#tbl +1]  = "Таблица пустая"
        return tbl
   end   
   local seen={}    --  просмотренные --
   local Level =1
    -----------
    function dump(t,i)      ---------
   if seen[t] then  return end      
        seen[t]=true    
        local s={}  ---  массив хранение имен ключей (строк) для сортировки ---
   local ss={}   -- массив для хранения самих ключей --
        local n=0
        local ks=0   
        for k, v in next,t do
      ks = tostring(k)
                n=n+1 
      s[n] = ks
             ss[ks] = k      
        end
      
        table.sort(s)
   local tt
      
        for k,v in next,s do
      tt=t[ss[v]]   
      if  not seen[tt] then   
                    tbl[#tbl +1]  =  i .. "[" .. v .. "]   (" .. type(tt) .. ") = " .. tostring(tt) .. "\n"
                    if Level < limit or limit == 0 then
                          if type(tt) == "table" then
               Level = Level +1
                    tbl[#tbl +1]  =  i .. "Вложенность: " .. Level .. "  === Содержимое таблицы :  "  .. v .. "\n"
                              dump(tt, i.."\t")
               tbl[#tbl +1]  =  i .. "Вложенность: " .. Level .. "  === Конец таблицы   " .. v .. "\n"         
               Level = Level - 1
                          end 
                    end   
      end
        end
    end
   ---------------------
    dump(t,i) 
    return (tbl)
end


 В диалоге OS_Quesha, в процессе ее работы, функцию dump_str можно вызвать в любой момент для любой глобальной переменной скрипта с тем,  чтобы распечатать ее с выдачей в журнал отладки. Например, у меня контекст Lua (переменная _G) выводится (это ~5000 строк) за 20 млсек (по поводу скорости вывода жду комментария Владимира :smile: ).
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
 
И по теме (описание интерфейсных функций OS_Quesha):
 5.3 Создание последовательности ключей
Последовательность ключей это функция, при обращении к которой выдаются значения некото-
рого типа, уникальные в некотором контексте их использования. Дополнительным требованием
(кроме уникальности значений), в некоторых случаях использования таких функций, может быть
необходимость формирования их значений по определенным правилам.
В качестве примера использования последовательности можно привести создание идентифи-
каторов заявок при их выставлении в QUIKе с помощью функции sendTransaction.
1. Запрос последовательности ключей (number):
Cl_LuaGL ()
Результат функции: number - глобальный ключ системы формата: <Номер запус-
ка/перезапуска системы >(старшие, оставшиеся разряды, начиная с 6-го )<Счетчик запросов
ключей после запуска/перезапуска системы>(6 десятичных разрядов)
Эта функция при обращении из любого потока (функции скрипта), выдает значение отличное от всех ранее ее вы-
данных (независимо того, были запуски или перезапуски системы).
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
 
Цитата
Владимир написал:
или просто нумеровать их у себя как 1, 2, 3, 4,...
Если у вашего робота не предусмотрен перезапуск с продолжением с прерванного места, то это самое подходящее. Если же перезапуск предусмотрен, то необходимо предусмотреть и продолжение нумерации после перезапуска (с сохранением ее последнего значения в энергонезависимой памяти).
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
 
Цитата
Артем написал:
Создаешь с помощью вашего фреймворка робота который будет торговать и зарабатывать деньги - тут налицо коммерческое использование.
  Робота вы можете создать и использовать его сами для зарабатывания денег, но не можете зарабатывать на торговле самими роботами.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
 
Цитата
Артем написал:
какой такой сценарий в контексте брокерского торгового терминала предпологает "некоммерческое" использование?
  Некоммерческое использование это значит, что любое частное лицо (пользователь) может использовать обсуждаемые средства (в том виде как они есть, без гарантии последующей их поддержки с моей стороны) для создания своего робота.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
 
Цитата
Александр М написал:
У разработчика уже есть готовые набор библиотек, каркасы роботов, индикаторов и т.д. из которых он собирает продукт. Все это переделывать на ЧУЖУЮ библиотеку:1. Непонятно зачем, т.к. уже есть свое и готовое.2. Опасно.
 Я, во многом, согласен с выше написанным относительно разработчиков, давно работающими над внешними проектами. Но среди большого количества пользователей, по моему представлению (основанным на моем опыте), найдутся те (их будет очень мало), кому это будет интересно и кто способен в этом быстро разобраться и использовать. И мне интересны такие пользователи. Кроме того, представленное мною (некоторая готовая инфраструктура создания роботов, которая создавалась для решения собственных задач) может вдруг показаться полезной и профессиональным разработчикам.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
 
Цитата
Владимир написал:
кое-что можно сделать ТОЛЬКО на ассемблере. А потому именно на нём и можно предельно быстро и качественно разрабатывать любые приложения. В общем случае, быстрее, чем на любом другом языке.
  Ваше утверждение слишком сильное, но оно же сильно расходится с вашей практикой. Вы же своего робота сделали на QLua и мало того, что не используете в нем ассемблер, но даже отказываетесь использовать C.

Цитата
Владимир написал:
задачи. которые решаются в Квике по определению не требуют ни "нескольких ядер в ЦП компьютера", ни параллельных вычислений, ни какого-либо "расхода ресурсов ПК"
     Я согласен с тем, что подавляющее большинства пользователей QLua эффективность вычислений (параллелизм т.д.) мало волнует, но это в перечислении основных функций OS_Quesha всего лишь первый пункт. У меня самого возникла потребность в потоках не из-за проблем с вычислительными ресурсами, а из-за того, что появилась группа взаимодействующих задач, и в рамках одного потока надо было реализовывать некоторый диспетчер, занимающийся распределением процессорного времени одного потока между этими задачами. Вместо реализации такого диспетчера (а это была бы реализация в корявом виде функций потоков) были реализованы функции первого пункта, которые не только решали проблемы диспетчирования задач, но и при необходимости могли решать проблемы обеспечения эффективности вычислений. Возможность создания потока внутри скрипта обеспечила также беспроблемное использование любых доступных отлаженных графических пакетов, из которых я выбрал IUP.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
 
Цитата
Александр М написал:
Большинство перечисленных пунктов в "Основные функции OS_Quesha." решаются в виде простого lua скрипта, включая и графические интерфейсы
Когда обсуждаются любые средства, облегчающие разработку программ, возражение типа: «Это можно сделать существующими средствами», «не катит», так как, в конце концов, все можно сделать и на ассемблере. По существу же, обсуждать имеет смысл то, насколько быстро и качественно можно разрабатывать приложения, использую предлагаемые средства по сравнению с тем, что  обеспечивают существующие средства их разработки. Конечно, только практика использования любого средства разработки программ может определить его реальную полезность для разработчиков. Такая возможность разработчикам роботов в QUiK предоставлена в виде кодов и документации OS_Quesha.

Цитата
Александр М написал:
Очень специфическое возможное использование, я даже не смог придумать сходу, где бы мне это решение понадобилось с учетом всех реализованных мною проектов, включая заказные
 Мне непонятно в чем состоит специфичность использования OS_Quesha, если вместо одной функции main в QLua, в OS_Quesha, при использовании исходника TS_QUIK_RT.lua, предоставляется четыре (количество определяется в исходнике, в описании схемы обработки в табличном виде), аналогичные функции, в которых доступен весь API QLua. Эти функции могут, при наличии нескольких ядер в ЦП компьютера, выполняться параллельно (с учетом особенностей версий QUIK  > 8.4, описанных в моем начальном комментарии). Дополнительно они могут взаимодействовать между собой через готовые очереди. Кроме того, в них  доступны все возможности, описанные в моем начальном комментарии. Причем, расход ресурсов ПК на функционирование OS_Quesha ничтожен и в этом можно убедиться, запустив немодифицированный исходник TS_QUIK_RT.lua. Все дополнительное использовать не обязательно, но это может потребоваться при последующем расширении возможностей робота.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
 
Цитата
Александр М написал:
Вы это сделали в первую очередь для себя, а потом уже как-то решили выдать в массы
Цитата
Александр М написал:
Решение явно сделано программистом для программиста.
 Это вы отметили правильно.
Цитата
Александр М написал:
Всяческих вам успехов.
 Спасибо за пожелание.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
 
Цитата
BlaZed написал:
читаю и понимаю, что вроде что-то может быть даже и нужное, но вот зачем оно мне и какие преимущества даст совершенно не понятно.
 В документацию я добавил исходник TS_QUIK_RT.lua (это TS_QUIK.lua без тестовых функций) полностью готовый для практического использования пользователем. В нем определены четыре циклические функции-шаблоны: main, main_user1, main_user2, main_user3, в которые пользователь может вставить свои фрагменты программ, обрабатываемые в циклах этих функций. Эти функции запускаются в разных потоках. У всех перечисленных циклических функций есть входные очереди, обеспечивающие (при необходимости) их взаимодействие (чтение/запись). Любая функция активируется либо по истечении интервала ожидания (как в sleep), либо в момент записи данных в любую ее входную очередь. Во всех четырех функциях вместо известной  функции sleep используется функция WaitEventOCLua, реализующая описанную схему обработки циклов.
   В функции main реализована схема обработки колбеков, в которой основной поток QUIK записывает параметры колбеков в очереди, обрабатываемые в main. Операция записи в очередь быстрая и поэтому основной поток, при обработке колбеков, не блокируется.
   Количество циклических функций, их очереди и другие параметры определяются в TS_QUIK_RT.lua  схемой описания обработки данных, которую пользователь может модифицировать под свои задачи. Кроме того, пользователь может использовать следующие, уже подключен-ные, пакеты:
1) iup (графический пакет);
2) sqlite (пакет работы с встроенными базами данных);
3) lfs (файловый пакет).
 Дополнительные возможности (настраиваемый диалог, ведение журналов диалога и отладки, средства отладка скриптов и т.д.) при использовании OS_Quesha были описаны в моем начальном комментарии.
---
P.S.  Текущая версия OS_Quesha работоспособна и для QUIK (Lua 5.4).
запуск из работающего скрипта другого скрипта или скриптов
 
Возможно, это для вас окажется интересным: https://forum.quik.ru/messages/forum10/message52233/topic6198/#message52233
   Но это трудно отнести к небольшому примеру.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
 
Цитата
BlaZed написал:
Короче, грамотный рекламщик вам нужен, если хотите в массы свой софт пустить.
 В том виде как он есть, софт не массовый, а потому о рекламе речь не идет. Те, кому он может показаться интересным практически (а таких, я думаю, окажется мало),  наверное, и без рекламы поставят его в тестовую конфигурацию QUIK и быстро разберутся, нужен ли он им и зачем.
Отладка QUIK 8.11
 
Цитата
Nikolay написал:
include файлы и lua54.lib взято с оф. сайта lua.
  Не точно, но возможно, вы взяли статическую библиотеку  lua54.lib (~300 кб.). Надо использовать библиотеку импорта dll    lua54.lib (~30 кб.) с тем, чтобы использовались функции QUIK из его lua54.dll. Либо надо самому создать библиотеку импорта lua54.lib, используя lua54.dll из QUIK.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
 
Цитата
Владимир написал:
Но вот специализированную ОС под задачи торговли - такого я ещё не видывал ни разу за всю свою (не очень-то и короткую) жизнь.
 Ну! Это уже реклама.  Я бы так не смог :smile:
А если серьезно :smile:  Ведь было доброе время, когда программы набирались на тумблерах. Все ошибки в них, кроме ошибок железа, были свои и ведь они как-то работали. Потом появились операционные системы, трансляторы языков программирования и т.д. и теперь нам приходиться иметь дело со всей этой огромной лабудой, искать не только свои ошибки но и чужие глюки.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
 
Цитата
Владимир написал:
У моего так ГИБКАЯ стратегия, алгоритм меняет поведение в зависимости от поведения рынка здесь и сейчас (причём как рынка вообще, так и поведение по каждому конкретному тикеру в частности), от настроек, заданных юзером (именно они и меняются в диалоге при необходимости)
  Вы счастливый человек и я не очень понимаю, зачем вам так много писать в этой теме :smile:
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
 
Цитата
Владимир написал:
АКИЕ возможности для торговли она предоставила лично Вам?

 1. У меня автоматически парсятся некоторые сайты с аналитикой фондовых рынков. На основе полученных данных автоматически выбираются бумаги и стратегия для внутридневных торгов.
 2. На основе базовой (выбранной) стратегии автоматически выставляются заявки и отслеживаются сделки,
 3. Паралльльно, по трем альтернативным стратегиям торговли ведется виртуальная торговля. При значительной разнице результатов происходит переход на более прибыльную стратегию.
Все я не буду описавать. Думаю, что этого доствточно.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
 
Цитата
Владимир написал:
ЮЗЕРЫ! АУ!!! ОТЗОВИСЬ КТО-НИБУДЬ!  
  Я сам работаю в этой программе :smile:
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
 
Цитата
Владимир написал:
Должно же быть какое-то представление о целевой аудитории! У меня лично фантазии не хватает.
  Те, кто могут полностью обойтись тем, что предоставляет QLua. не являются целевой аудиторией.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
 
Цитата
Незнайка написал:
Но кому-то может, и пригодятся реализованные автором средства, которых нет изначально в qlua.Вы ведь не думаете, что автор предложил исключительно вам двоим    опробовать свой продукт?С таким же успехом можно, пойти, например на форум TSLaba и возмущаться там, зачем мне ваша хрень, я и сам могу тестер написать.  
  Достойный ответ, который я не смог сформулировать так четко.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
 
Цитата
Владимир написал:
И любые примочки доморощенных "сторонних исполнителей" - библиотеки, внешние модули, не говоря уже про "специализированную ОС" - только добавляют глюков в этот винегрет.
  Я согласен с выше написанным, но вы ломитесь в открытую дверь :smile:
Цитата
TGB написал:
уговариваю пользователей не лезть без нужды ни в какие дебри, а решать свои задачи наиболее простыми и понятными для себя средствами.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
 
Цитата
Владимир написал:
И он прекрасно реализован с помощью парочки lua-таблиц: одна основная, другая - контекстное меню, всплывающее по клику на строчку первой.
  Я же написал, что диалог можно сделать на таблицах, некстати, обслуживаемых основным потоком QUIK. У вас все хорошо.  Ну и замечательно! Кстати, какой-то диалог можно реализовать и на обычном Блокноте :smile:
-----
Цитата
TGB написал:
Кроме того, для пользователя предусмотрена возможность настройки обработки собственных сложных команд, задаваемых в командной строке формы диалога.
 Дополнительно, для пользователя доступны все возможности графического пакета iup (это, по поводу комментария Nikolay о простом диалоге).
----
 Вообще, мне кажется, что у нас спор ни о чем. Я же не предлагаю заменить диалог Nikolay или запретить использование таблиц QUIK. Я даже уговариваю пользователей не лезть без нужды ни в какие дебри, а решать свои задачи наиболее простыми и понятными для себя средствами.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
 
Цитата
Nikolay написал:
Так я и спрашиваю какой такой случай требует использование этого продукта. Просто для примера.

 1. Допустим, что в вашем скрипте нужен диалог. В данном продукте реализация диалога пользователя  это модификация в TS_QUIK.lua  готовой таблицы «меню пользователя» с  заданием функций-обработчиков команд  и определение этих функций. И это все, что при этом требуется.

Образец таблицы меню пользователя, который надо будет модифицировать под конкретное приложение:
--   Таблица описания  диалога приложения (образец) ---
local mmenu =
{
   "Меню 1 (образец)",
{
       "Команда 1", default,       --   default -  функция-реакция    ----
       "Команда 2", default,
       "Команда 3",default,
       "-", nil,
       "...........",  default        
   }
   ,"Меню 2 (образец)",
{
       "Команда 4",default,
       "Команда 5", default,
       "-------------",nil,
       "Подменю ",
{
           "Команда 6", default,
           "Команда 7", default
       }
   }
}
В образце default это функция-обработчик команды (их надо заменить на свои после изменения таблицы под свои нужды).
  Кроме того, для пользователя предусмотрена возможность настройки обработки собственных сложных команд, задаваемых в командной строке формы диалога.
  Можно сделать диалог другим способом? Конечно, можно (на таблице QUIK, используя VCLua, вообще написать на ассемблере). Вопрос состоит только в том, насколько удобным, расширяемым будет этот диалог и как это сделать быстрее.

2. Допустим, что вам нужны таймерные события, обеспечивающие временные интервалы. В данном продукте вы их можете заказывать.
Можно реализовать таймерные события другим способом? Можно, но это надо будет делать.

3. Предположим, что вам нужно реализовать контрольные точки, обеспечивающие продолжение работы скрипта после его перезапуска по любой причине. В данном продукте есть специальные средства создания и использования контрольных точек.
  Можете вы это сделать сами? Да, но при этом вам придется, в каком-то виде разработать что-то похожее на то, что уже реализовано.
------

Приведенный список можно продолжить, но, кому это интересно, может прочесть в файле  OS_Quesha.pdf.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
 
Цитата
Старатель написал:
Что не так с iup?
   При работе с iup в отдельном потоке (как это сделано у меня) я проблем не встретил.

Цитата
swerg написал:
Посмотрите иностранные рекламные ролики сельхоз. техники. Это крайне залипательно! И, главное, там много что можно почерпнуть в плане формата подачи рекламного материала.
  Спасибо за ценный совет.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
 
Цитата
Nikolay написал:
Вы бы хоть  абсолютные пути и отладочные выражения убрали из поставки, если это  продукт.
  Шаблон TS_QUIK.lua учебный. Наверное, его можно было «причесать», но я не видел в этом большого смысла.

Цитата
Nikolay написал:
Лицензия не ясна.
 В нормативно-правовых актах определено некоммерческое использование:
"Допускается без согласия автора или иного правообладателя воспроизведение, осуществляемое только гражданином и только в личных целях, под которыми по смыслу статьи 1273 Кодекса понимается последующее некоммерческое использование соответствующего экземпляра для удовлетворения собственных потребностей или потребностей обычного круга семьи этого гражданина (который определяется судом с учетом конкретных обстоятельств рассматриваемого дела)." (Постановление от 26 марта 2009 г. № 5/29 Пленума Верховного Суда Российской Федерации и Пленума Высшего Арбитражного Суда Российской Федерации)

Цитата
Nikolay написал:
Раз уж Вы разместили это здесь, то хотелось бы увидеть пример применения, где средств lua будет явно недостаточно и необходимо использовать данный продукт.
  Список операций, поддерживаемых Lua алгоритмически полный. То есть, на этом языке можно реализовать любой алгоритм. Но точно также, можно задать похожий вопрос: почему бы вместо Lua не использовать ассемблер?
  Назначение данного продукта не в том чтобы заменить Lua. Это в каком-то смысле «станок» с готовой инфраструктурой, которая в том или ином виде требуется  для разработки сложных программных систем. Как было сразу отмечено в моем начальном комментарии,  для простых случаев не надо ничем заморачиваться, а использовать обычные QLua-скрипты.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
 
Цитата
Владимир написал:
НА КОЙ, простите, мне эту хрень устанавливать у себя?

Читаем:
Цитата
Владимир написал:
если ваш робот простой и не требует возможности, предоставляемых OS_Quesha, то, скорее всего, его проще создать в виде обычного QLua-скрипта.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
 
Цитата
Владимир написал:
Уже и операционку под каждую сраную прикладную задачу разрабатывать будем!
  Где вы прочитали, что OS_Quesha разработана под одну конкретную прикладную задачу?

Цитата
Владимир написал:
эта хрень не будет работать НИКОГДА!
  Эта хрень работает, начиная с апреля 2019г.  Чтобы убедиться в этом, установите ее у себя (это делается просто) и запустите.
Цитата
TGB написал:
проведены тестовые, стрессовые прогоны программы, в которых она без перезапуска работала месяцами.

Цитата
Владимир написал:
я в ауте!
  То есть, в восторге :lol:
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
 
Ссылка на коды и документацию OS_Quesha (на текущий момент для версий 7<= QUIK < 8.5  и  >= 8.11  Lua 5.3.5): https://cloud.mail.ru/public/2zn2/2tZgedUu4
---------------------------------------
 Программа представляет собой специализированную операционную систему реального времени, работающую в среде программного комплекса QUIK. Она предназначена для разработки многопоточных роботов торговли ценными бумагами в QUIK. Программа реализует в скриптовом языке программирования QLua параллелизм выполнения его функций, взаимодействующих между собой, в рамках одной его инсталляции, обеспечивая использование многопроцессорности вычислительных систем. Из программы доступен весь программный интерфейс QUIK, существующий для скриптов QLua.
---------------------
   Общая схема обработки данных в OS_Quesha следуюшая. Циклические функции, запускаемые в отдельных потоках (аналогичные функции main в QLua) входят в свой основной цикл обработки. Но вместо sleep используется API-функция OS_Quesha ожидания либо истечения интервала времени (паузы циклической функции), либо появления данных во входных очередях таких функций. Взаимодействие циклических функций между собой после запуска на выполнение в потоках, сводится к чтению своих очередей и записи своих данных в чужие очереди. Вся необходимая синхронизация параллелизма выполнения происходит внутри специальных функций чтения/записи очередей. Эти очереди, при записи в них данных, выдают сигналы, активирующие те потоки, для которых они являются входными. Дополнительно, предоставляются средства синхронизации, которые могут потребоваться при использовании модифицируемых общих данных потоков, но, по возможности, этого лучше избегать.
   В этой схеме активация потоков (их динамика) определяется движением данных в их очередях, а <паузы циклических функций> * <коэффициент, заданный в настройках> являются параметрами контроля блокировок и зацикливания этих циклических функций.
   Описанная выше схема обработки данных, характерная для многих систем реального времени, к которым относятся и роботы фондового рынка, обеспечивает, наряду с распараллеливанием вычислений, реализацию удобной (для разработчиков) модели  таких вычислений. Причем, удобство этой модели вычислений, во многих случаях конкретных применений, является более существенным фактором, чем, собственно, параллелизм вычислений.
-----
   В скрипте-шаблоне создания роботов с использованием OS_Quesha, в виде исходника "TS_QUIK.lua", входящего в состав документации OS_Quesha, запускается 16 потоков, часть из которых являются служебными (реализация диалога с пользователем, генерация таймерных событий, ведение логов, контроль состояния системы, обработка фоновых заданий и т.д.). Остальные потоки пользовательские (их количество определяется схемой обработки данных пользователя, заданной в шаблоне, в табличной форме).
   Шаблон демонстрирует использование средств OS_Quesha при создании робота.
   Конкретно, в шаблоне реализовано (в отдельных потоках):
1) схема обработки колбеков в виде очередей событий QUIK, минимизирующих влияние последующей обработки событий на основной поток запуска скриптов и генерации событий QUIK;
2) сохранение истории одноминутных и пятиминутных котировок ценных бумаг в базах sqlite;
3) оперативное сохранение текущих котировок 22-ух (по 18 параметрам) торгуемых бумаг в циклических буферах с задержкой < 1 млсек относительно момента возникновения событий OnParam;
4) выполнение заданий по расписанию;
5) тестовое взаимодействие OS_Quesha с внешним процессом (Robot_KIT.exe) по дуплексному каналу передачи/получения сообщений с интенсивностью 1500 сообщений в секунду с задержкой между их приемом и передачей менее 5 млсек;
6) несколько тестовых циклических функций - примеров реализации таких функций.

Дополнительные ресурсы ЦП, потребляемые в QUIK при запуске шаблона, менее 1 % (более детальное описание потребляемых при этом вычислительных ресурсов приведено в инструкции OS_Quesha.pdf, входящей в состав документации).
-------------------------------------------------------------------------


  Основные функции OS_Quesha.
1. Организация настраиваемой многопоточной обработки данных:
   - создание потоков для выполнения QLua-функций на основе описания схемы обработки данных в табличной форме;
   - реализация таймерных событий (с разрешением в 2 млсек);
   - контроль блокировок и зацикливания в потоках, утечки оперативной памяти, а также состояния очередей взаимодействия потоков/псевдопотоков.
2. Создание настраиваемого диалога с пользователем. Пользователь имеет возможность добавлять в форму диалога свои меню.
3. Ведения журналов OS_Quesha (диалога и отладки) с милисекундным разрешением.
4. Запуск на выполнения Lua-функций в фоновом режиме в отдельных потоках.
5. Работа с контрольными точками (для продолжения работы с прерванного, по любой причине, места).
6. Обеспечение интерфейса ( в виде шаблона исходников на C++) с dll для подключения к системе функций, реализуемых в среде C++.
7. Ведение истории котировок (одноминутных и пятиминутных) в базах SQLite.
8. Ведение текущих дневных котировок в векторах оперативной памяти.
9. Эффективная схема обработки событий QUIK в виде циклических потокобезопасных очередей получения данных колбеков (реализованных без синхронизации).
10. Обеспечение интерфейса реализации торговых индикаторов на основе текущих котировок.
11. Обеспечение виртуальной торговли ценными бумагами.
12. Описание и реализация плана торгов.
13. Обеспечение отладки разрабатываемых параллельных программ и их функций.
14. Обеспечение интерфейса взаимодействия ( в виде шаблонов исходников) с приложениями разрабатываемыми средствами C#, vb и запускаемыми (с целью изоляции от QUIK) в отдельных процессах.
15. Обеспечение парсинга сайтов для информационной поддержки торговли.
   Документация.
 Основная документация представлена в виде исходника скрипта-шаблона "TS_QUIK.lua", в котором имеются подробные комментарии по использованию средств OS_Quesha при реализации, представленной в этом шаблоне некоторой обобщенной схемы обработки (в том числе колбеков).  Этот шаблон может служить основой для создания конкретных торговых роботов. Кроме того существует инструкция OS_Quesha.pdf, которая может быть вызвана и из диалога системы: <Система> -> <Справка> либо просмотрена в папке C:\OS_Quesha\OS_Quesha_files.
-----
  Коды.
 Исполняемые коды представлены в виде исходника TS_QUIK.lua (общего для всех поддерживаемых версий QUIK) и  оттранслированных кодов, соответствующих версиям QUIK.
  Общий объем исполняемых кодов OS_Quesha для любой, поддерживаемой версии QUIK менее 5 мб.  
-----
  Установка программы сводится к распаковке ее файлов, копированию полученной папки на диск C, а также добавлению скрипта  TS_QUIK.lua  в меню QUIK «Доступные скрипты».  После установки можно запускать скрипт TS_QUIK.lua. Появится диалоговая форма программы с разнообразными меню.  При первом запуске TS_QUIK.lua в папку с info.exe копируются пакеты из папки ….\Файлы папки QUIK, соответствующии используемой версии QUIK.  Все это описано в прилагаемой инструкции по установке и запуску OS_Quesha.
-----
Настройки программы.
  Настройки OS_Quesha на конкретное использование представлены в виде:
1) глобальных переменных, хранящихся в sqlite-базе;
2) локальных определений объектов системы, описанных в тексте скрипта, в основном, в виде таблиц.

===============================================

 Если у кого-то будут вопросы, замечания или предложения, то я постараюсь как-то на них отвечать. Наверное, ответы на некоторые вопросы можно найти и в прилагаемой к программе документации.
---------------------------------------------
 Превентивно отвечу на три вопроса, которые, по-моему, скорее всего, могут возникнуть при чтении данного комментария у многих.

1. О каком параллелизме можно говорить, если в QLua версий QUIK > 8.4 (! в отличие от младших, по номеру, версий) VM-Lua не реентерабельна, а является разделяемым, синхронизируемым ресурсом?
 Ответ (относится к QLua 5.3.5 версии QUIK >= 8.5).
 Если в коде скрипта полностью исключить обращение к C-функциям (в том числе к sleep), то о параллелизме можно было бы забыть. Но так как C-функции в любом скрипте есть (хотя бы из-за присутствия sleep) и реентерабельны, то они могут выполняться в отдельных потоках параллельно между собой и с VM-Lua, обслуживающими (в режиме разделения) Lua-коды скрипта.  С учетом выше сказанного «тяжелые» вычисления могут быть, если это требуется, без особых проблем реализованы на C/C++, и они могут выполняться параллельно. При этом надо учитывать, что все C-API функции Lua при своем вызове переходят (с последующим возвратом в предыдущий режим), всегда в режим VM-Lua, в том числе, и при использовании их в C-функциях.
   По сути, в OS_Quesha  обеспечивает следующую схему обработки данных. В нескольких потоках исполняются функции, в которых могут быть чередующиеся фрагменты C-кодов и Luа-кодов. И только при исполнении  фрагментов Luа-кодов идет обращение к VM-Lua с блокировкой, как к разделяемому ресурсу. В остальных случаях коды могут выполняться параллельно.
   Для удобства реализации функций на C/C++ в составе OS_Quesha  есть С- пакет QluaUser.dll, c его исходниками.
  Исходя из всего вышесказанного, общая стратегия построения многопоточного скрипта при использовании OS_Quesha  следующая.  Функция main оперативно поддерживает интерфейс c QUIK, раздавая тяжелые вычисления в другие потоки, и это демонстрируется в шаблоне TS_QUIK.lua.
---------------
2. Кому может пригодиться эта программа? И какие ее особенности, которые могут быть полезны разработчикам роботов в первую очередь?  
      Ответ.
2.1 OS_Quesha является набором инструментов для разработки роботов в QUIK и одновременно средой их функционирования. Для ее использования, как и любого инструмента, требуется ознакомиться с инструкцией по ее применению. Исходник шаблона, сильно упрощает ее применение, но все равно требуется какое-то время на ее изучение. Поэтому, если ваш робот простой и не требует возможности, предоставляемых OS_Quesha, то, скорее всего, его проще создать в виде обычного QLua-скрипта.
2.2 Основные особенности программы, которые могут быть интересны разработчикам роботов, следующие:
1) полная инкапсуляция параллелизма функционирования потоков в API OS_Quesha, обеспечивающих эффективность (реализована специально разработанная схема синхронизации), корректность синхронизации и безопасность взаимодействия функций, выполняемых в разных потоках;
2) настаиваемый диалог пользователя с роботом;
3) встроенный контроль времени выполнения функций роботов, блокировок, зацикливаний в потоках, утечки оперативной памяти, а также состояния очередей взаимодействия потоков.
4) встроенные средства отладки межпотокового взаимодействия, а также разрабатываемых функций;
при этом обеспечивается возможности:
 -  оперативного настраиваемого фильтрующего вывода данных из любых очередей взаимодействия потоков в журнал отладки;
 - оперативной печати любых глобальных переменных работающего робота (в том числе таблиц произвольной вложенности);
 - оперативного запуска скриптов, в работающей системе с доступом из них к ее среде исполнения, обеспечивающего удобство отладки фрагментов разрабатываемого робота;
 - централизованной обработки возникающих ошибок;
5) наличие средств реализации контрольных точек, с которых может быть продолжено функционирование робота  после его перезапуска по любой причине;
6) раздельное ведение журнала диалога и журнала отладки с записью сообщений с миллисекундным разрешением;
7) реализация схемы обработки колбеков, в которой после записи параметров колбека во входную очередь функции main, ей сразу выдается сигнал на обработку колбека;
8) низкое потребление ресурсов на собственное функционирование OS_Quesha (подробности в  статье, на которую есть ссылка в начале комментария).
---------------  
3. Насколько стабильна OS_Quesha?
Ответ.
  Одним из объективных показателей стабильности (надежности) любой программы является длительность ее эксплуатации без проявления ошибок, после устранения очередной, обнаруженной в ней ошибки.
   Для версий QUIK < 8.5 в ядре программы (реализованном на C++), работающем круглые сутки в различных режимах, и являющимся самой сложной частью OS_Quesha, исправление, устраняющее последнюю по времени, обнаруженную в нем ошибку, было выполнено в мае 2019 года. Кроме того в QUIK версии 8.4 проведены тестовые, стрессовые прогоны программы, в которых она без перезапуска работала месяцами. Технические подробности проведения тестовых прогонов описаны в инструкции OS_Quesha.pdf.
   Для версии QUIK 8.11  Lua 5.3.5 (ядро OS_Quesha не менялось, а только перетранслировалось из-за изменения версии Lua), на текущий момент времени, выполнены 3-х суточные тестовые прогоны OS_Quesha (аналогичные тем, которые были выполнены для младших версий QUIK). Проблем не  обнаружено.
ParamRequest и getParamEx2, Как получить актуальные данные через getParamEx2?
 
Цитата
Старатель написал:
Если getParamEx2 вернул данные, то они актуальные или старые?

В ТТТ есть следующие поля:
 "TRADE_DATE_CODE" - дата торгов
"TIME"  -  время последней сделки (с точностью до секунды)

По-хорошему, во всех записях обмена с сервером следовало бы иметь служебные поля <Дата и время передачи с точностью до млсек.> и <Дата и время приема с точностью до млсек.>, заполняемые соответствующими сторонами в момент приема/передачи таких записей.  Эти поля должны быть доступны пользователю.
Грядущие изменения на срочном рынке МБ: поддержка работы с 19-значными номерами заявок и сделок
 
Мой модифицированный тест управления автоматической памятью QLua  в версии QUIK 8.11  Lua 5.3.5, на текущий момент времени, проблем не обнаруживает.
---  
     1. Есть вопрос к поддержке QUIK:
   из Lua53.dll, кроме стандартных функций C-API Lua, экспортирует около 100 дополнительных функций. Зачем это делается?
Что не могут сделать разработчики QUIK, оставаясь в рамках стандартных функций C-API Lua?
-----
     2. Есть предложение:
   выкладывать библиотеки импорта (.lib) функций Lua53.dll (Lua54.dll и т.д.), например, в папке хранения файла info.exe. Понятно, что такие библиотеки можно создать на основе файлов dll, но, наверное, не все пользователи знают, как это сделать. Эти библиотеки нужны при перетрансляции C-пакетов QLua при переходе на новые версии Lua.
Грядущие изменения на срочном рынке МБ: поддержка работы с 19-значными номерами заявок и сделок
 
Цитата
Anton написал:
И у такого решения есть минус, на момент выборки сообщения в потоке скрипта общее состояние квика уже другое
  Дополнительно, насчет минуса?:
 5) так как, по появлению нового события, в предложенном решении выдается сигнал, по которому (если есть ожидание потока main  на операции sleep_q)  запускаются колбеки скрипта, то мы имеем более оперативную  реакция пользовательского потока main по сравнению с существующим решением, и описанный вами фактор, в предложенном решении менее значим;
 6) в этом решении на пользовательские колбеки нет никаких ограничений (связанных с нагрузкой основного потока обслуживания скриптов), кроме понимания, того, что выполнение колбеков делается в пользовательском потоке;
 7) и еще раз: любая синхронизация (для того, кто понимает) - это геморрой, порождающий трудно исправляемые ошибки (совершенно неожиданные), от которого, если есть возможность, следует избавляться.
Грядущие изменения на срочном рынке МБ: поддержка работы с 19-значными номерами заявок и сделок
 
Цитата
Anton написал:
И у такого решения есть минус, на момент выборки сообщения в потоке скрипта общее состояние квика уже другое.
  Это не является особенностью предлагаемого решения. Это относится и к существующей реализации.
 Вообще, это неустранимый фактор в системах реального времени, к которым относится и QUIK.
Грядущие изменения на срочном рынке МБ: поддержка работы с 19-значными номерами заявок и сделок
 
Цитата
Anton написал:
Вы обнаружили, что на время вызова любой сишной функции (а не только sleep) луа снимает лок, и сделали неправильный вывод, подумав только на sleep. В качестве такой функции может выступить и message, как в примере, и любая встроенная в луа библиотечная функция, и любая функция qlua.
  Обкладывать синхронизацией все используемые сишные функции в однопоточном QLua для меня неожиданное решение. Мне, казалось, что с учетом рекомендуемого ARQA способа взаимодействия колбеков c потоком main через очереди, в существующей реализации достаточно было синхронизировать только sleep.
   Вообще, в однопоточном QLua можно было бы практически полностью отказаться от всякой синхронизации и от модификации исходного Lua. При этом можно бы было сохранить и существующий пользовательский интерфейс обработки колбеков. Для этого можно модифицировать функцию sleep следующим образом. В модифицированной функции (например, с именем sleep_q) ожидается либо истечение интервала времени (как в sleep), либо появление данных в очередях событий скрипта. При наличии или появлении таких событий в этой функции запускаются все, соответствующие событиям, колбеки скрипта и далее работа продолжается как обычно.
  В этом варианте:
1) внутри Qlua полностью отсутствует синхронизация, а вся синхронизация, связанная с обработкой очередей между основным потоком и потоком main, может быть сосредоточена в sleep_q;
2) заметно разгружается основной поток (он подготавливает очереди событий (это делает и сейчас) и при необходимости выдает лишь сигнал о начале их обработки);
3) для включения Lua  в QUIK не требуется модификация исходного Lua, а значит, облегчается подключение новых версий Lua а также повышается надежность среды исполнения скриптов:
4) в целом, обеспечивается простота сопровождения QUIK.
Грядущие изменения на срочном рынке МБ: поддержка работы с 19-значными номерами заявок и сделок
 
Цитата
Anton написал:
Теперь очевидно?
 Да.
Грядущие изменения на срочном рынке МБ: поддержка работы с 19-значными номерами заявок и сделок
 
Цитата
Anton написал:
TGB , неправда. Если бы было правдой, в следующем скрипте между сообщениями 'Before loop' и 'After loop' ни одно сообщение 'OnAllTrade' вклиниться не могло

 Правда.  При выполнении таких тестов (анализ выполнения потоков) необходимо для вывода сообщений вместо  message  использовать  PrintDbgStr. Сделайте такую замену и прогоните ваш тест заново. Для просмотра результатов используйте Dbgview.
     Я прогонял ваш тест (с предложенной вам заменой). Между сообщениями 'Before loop' и 'After loop' ни одно сообщение 'OnAllTrade' не вклинилось.
Грядущие изменения на срочном рынке МБ: поддержка работы с 19-значными номерами заявок и сделок
 
В QUIK 8.11 (QLua 5.3.5) обработка колбеков выглядит следующим образом.
1. QLua 5.3.5 однопоточный и тем самым снимаются вопросы по моему тесту управления памятью в многопоточном QLua.
2. В скрипте пользователя могут существовать два потока одновременно: поток main и основной поток, в котором запускаются колбеки скрипта. Причем выполнение любого из перечисленных потоков блокирует выполнение другого. Таким образом предполагается обеспечивать корректность работы двух потоков в однопоточном QLua 5.3.5.
   Переключение потоков реализовано следующим образом. Колбеки могут запускаться только тогда, когда поток main «висит» в операции sleep(<интервал ожидания>). Пока запущенный колбек выполняется, поток main не может продолжить свою работу, даже если истек его <интервал ожидания>.  Если, вдруг, в колбеке используется операция sleep(<интервал ожидания>), то она выполняется точно также, как это описано для потока main. То есть, зависание колбека на операции sleep допускает выполнение потока main, но при этом поток колбека «отвиснет» только тогда, когда поток main попадет на свою операцию sleep.
  Реализованную схему обработки событий элегантной назвать трудно, но она позволяет сохранить существующий пользовательский интерфейс.
Как определить абсолютный путь к исполняемому файлу lua?
 
Цитата
Старатель написал:
Без collectgarbage сработает и для финализации.

 Дело в том, что уборка мусора может быть запущена в скрипте в процессе его работы, до его завершения и если сработает финализатор, то это ошибка.
Вопросы, не требующие ответов
 
Цитата
Roman Azarov написал:
Anton , Благодарим за дополнительную информацию.

 Мне, кажется, что Anton, действительно, сделал большую и качественную работу по улучшению обработки исключений в QLua. Наверное, можно бы было как то использовать и его исходники по обработке исключений, с каким-то реальным вознаграждением. Почему бы нет?
Страницы: Пред. 1 ... 3 4 5 6 7 8 9 10 11 12 13 След.
Наверх