76 (2019-11-19 10:39:57 отредактировано toxa)

Re: StaticVar: Обмен данными между Lua-скриптами в QUIK

swerg пишет:

Одного опасаюсь: при таком синтаксисе (прям как таблицы) пользователи решат, что это прям натурально Lua-таблицы и начнут использовать/требовать общение и синтаксис обращения к ним как полностью аутентичным Lua-таблицам (применяя всякие table.sort(), table.insert, итерирование в for и т.п.). А т.к. пока (для скорости обмена между скриптами скриптами) предполагается это реализовывать вручную, не копируя в реальные промежуточные Lua-таблицы (при обращении по индексам), то как бы не замаяться всё это поддерживать smile

это не кажется таким уж сложным, если в качестве хранилища использовать не свои структуры, а lua же. понадобится три вещи: функция deepcopy(source_lua_state, dest_lua_state) которая копирует объект со стека одного стейта в стек другого и метаметоды __index и __newindex для таблицы, которую возвращает либа. deepcopy() должна быть защищена критической секцией, а внутри рекурсивно обходить все вложенные объекты. и, кстати, по скорости будет так же.

[s]можно реализовать две стратегии: все скрипты разделяют один объект, либо в каждом скрипте есть своя копия, и мы делаем копирование во все экземпляры. все зависит от того, что пользователь делает чаще: чтение или запись и насколько записываемые объекты развесисты.[/s] второй вариант не получится.

ps: кстати, если остановить все скрипты, использующие staticvar, то хранилище обнулится. наверное, это не очень хорошо. можно грузить либу-владелицу хранилища в квик при первой записи в хранилище, а выгружать - на wm_close основного окна quik.

77 (2019-11-21 14:44:00 отредактировано toxa)

Re: StaticVar: Обмен данными между Lua-скриптами в QUIK

.

78 (2019-11-21 14:44:27 отредактировано toxa)

Re: StaticVar: Обмен данными между Lua-скриптами в QUIK

создал отдельную тему: [url]https://quik2dde.ru/viewtopic.php?pid=2519#p2519[/url]

79

Re: StaticVar: Обмен данными между Lua-скриптами в QUIK

А с последним квиком (8.6) она работает? Что-то у меня не получается подключить.

80 (2020-08-19 22:36:40 отредактировано mzhumakhanov)

Re: StaticVar: Обмен данными между Lua-скриптами в QUIK

vasionok пишет:

А с последним квиком (8.6) она работает? Что-то у меня не получается подключить.

У меня тоже не завелось. Там lua 5.3, под него надо пересобирать. Ни разу не пробовал, но можно и попробовать.
Вроде нужная либа, удивительно, что мало активности. Может все на lua_share сидят. smile

UPD: пока перешел на lua_share, поживу на нем, пересборка StaticVar мне обойдется дольше по времени

81

Re: StaticVar: Обмен данными между Lua-скриптами в QUIK

vasionok пишет:

А с последним квиком (8.6) она работает? Что-то у меня не получается подключить.

Сделана поддержка QUIK 8.5 и далее.
Поддержка версий 8.0...8.4 убрана.

Всё по ссылкам во втором посте темы.

82 (2022-11-27 14:10:06 отредактировано dark184)

Re: StaticVar: Обмен данными между Lua-скриптами в QUIK

Разбираюсь с библиотекой, что то она не хочет запускаться в версии луа 5.4.1 с ошибкой multiple Lua VMs detected. Expected 5.3 instead of 5.4, но в 5.3.5 запускается. Правда только запускается, работу пока не проверял. Так и должно быть?
Квик 9.7.1.10, dll брал по инструкции из папки x64 и скопировал в корень папки квика QUIK_x64.
Проблема в том, что в версии 5.3.5 была у меня проблема со скриптами насколько я помню...

83 (2022-11-27 22:35:17 отредактировано toxa)

Re: StaticVar: Обмен данными между Lua-скриптами в QUIK

вы про либу StaticVar?

84

Re: StaticVar: Обмен данными между Lua-скриптами в QUIK

dark184,
для Lua5.4 в архиве нет сборки.
Нужна?

85

Re: StaticVar: Обмен данными между Lua-скриптами в QUIK

Если можно.

86

Re: StaticVar: Обмен данными между Lua-скриптами в QUIK

dark184,
написал вам на e-mail
Еще кому нужна для Lua5.4 - пишите на swerg@swerg.ru

87 (2022-12-05 11:01:54 отредактировано dark184)

Re: StaticVar: Обмен данными между Lua-скриптами в QUIK

К сожалению не видел в почте письма, видимо ушло в спам ;( За это время я тоже не бездельничал, подумал что библиотека больше не поддерживается. Продумываю и начал реализацию другой концепции, объединения всех роботов в один. Возможно не самое лучшее решение, но по крайней мере не будет зависимости от сторонних библиотек. В любом случае робот еще очень далек от совершенства и версий луа сменится еще с десяток пока я завершу его. А возможно это эпопея с роботами будет продолжаться бесконечно. Сколь бы не идеален был робот, а стратегии в любом случае будут меняться, добавляться новые, некоторые уже показывают свою неэффективность на определенных инструментах, а на других крайне эффективны... Я изначально писал робота с четким разделением на части, это "торговая" часть, она работает исключительно на торгах, и часть "стратегии", которая к бирже не прикасается и занимается исключительно анализом...

88

Re: StaticVar: Обмен данными между Lua-скриптами в QUIK

Пытаюсь прикрутить StaticVar.dll  к индикатору 

Settings = {
    Name = "goodmode"
}

-- Create a global table to store data
myData = {}
 
function Init()
    -- Add the required code here
    stv = require("StaticVar")
    stv.UseNameSpace("testNS")
    return 1
end

function OnCalculate(Index)
   if Index == 1 then
        local info = getDataSourceInfo()

        -- Store the sec_code value in the global table
        table.insert(myData, info.sec_code)

        -- Output the sec_code value to the message
        message(info.sec_code)

        -- Add the required code here
        stv.SetVar("xxx", info.sec_code)
  end
        
    return 0
end  

и забирать переменную скриптом 


stv = require("StaticVar")

stv.UseNameSpace("testNS")

function main()
     
    message("(test-2) " .. tostring(stv.GetCurrentNameSpace()) .. ".xxx=" .. tostring(stv.GetVar("xxx")), 1)
end

к сожалению не работает. есть вероятность что я что-то делаю не так и из индикатора можно давать данные в  UseNameSpace ?

89

Re: StaticVar: Обмен данными между Lua-скриптами в QUIK

Alexey89
Надо скрипт переделать  так:

stv = require("StaticVar")

function main()
    stv.UseNameSpace("testNS")    -- вот эту строку надо перенести сюда
    message("(test-2) " .. tostring(stv.GetCurrentNameSpace()) .. ".xxx=" .. tostring(stv.GetVar("xxx")), 1)
end

И всё заработает.

Суть в том, что UseNameSpace() работает "раздельно" в основном потоке выполнения (callback'и)  и в main()
Сделано это было вот почему, вот для какого сценария:
Выполняется main(), в ней выполняется вызов  UseNameSpace(). Разумеется, код в main() ожидает, что указанный NameSpace и будет выбран до нового вызова UseNameSpace() в коде main().
Тут одновременно c main() запускается какой-то callback (т.к. работает в основном потоке), в коде которого вызывается UseNameSpace(), устанавливая свой NameSpace для работы callback'а. Т.е. код callback'а отдельно устанавливает свой  NameSpace для своей работы.
Но код main() в это время ведь тоже продолжает выполняться, подразумевая своё значение NameSpace.

Поэтому и было сделано такое вот разделение: в main() устанавливается и поддерживается свой NameSpace, в остальном коде (коде основного потока) - свой NameSpace.

В общем надо отдельно не забывать устанавливать требуемый NameSpace как в main(), так и в каждом callbak'е.

Хотя, возможно, в вашем случае никакие NameSpace устанавливать и не требуется.

90

Re: StaticVar: Обмен данными между Lua-скриптами в QUIK

О великий Swerg. Заработало!!!!   Круть неимоверная. Теперь я эту переменную прикручу так что при запуске скрипта на активный график ставится заявка. С ценой  priceLAST  + несколько шагов.  Считалку числа лотов прикручу. И надеюсь будет толк.

Еще вопросик в квике поставил версию 5.3.5 под 5.4.1 работать отказалась это баг или фича?

91

Re: StaticVar: Обмен данными между Lua-скриптами в QUIK

Alexey89, сборку для Lua 5.4 высылаю по запросу
Напишите на swerg@swerg.ru

92

Re: StaticVar: Обмен данными между Lua-скриптами в QUIK

У меня скрипт, использующий эту dll-ку (StaticVar), почему-то эпизодически останавливается с ошибкой "ACCESS VIOLATION at address 00007FFD5BFF815B".
Может ли эта dll-ка быть причиной?

93

Re: StaticVar: Обмен данными между Lua-скриптами в QUIK

igor, всё может быть.
1. Надо скрипт, воспроизводящий проблему. Тогда можно будет что-то сказать предметно.

2. А еще какие-то внешние dll используются? а если другие dll отключить/удалить?
3. А если отключить StaticVar и не использовать её - проблема остаётся?

Хотя в целом ситуация странноватая, пока таких сообщений не было, при том, что данная библиотека не менялась уже несколько лет. Но, мало ли, всякое бывает.

94 (2024-09-24 15:30:05 отредактировано igor)

Re: StaticVar: Обмен данными между Lua-скриптами в QUIK

Используется ещё w32.dll.
Но самое неприятное то, что непонятно как определить, в каком именно месте скрипта происходит это событие. Это происходит где-то раз в 2 часа. Всё остальное время работает нормально.
Этот скрипт просто выводит данные в пользовательские таблицы то, что передаёт ему с помощью StaticVar другой скрипт.

95

Re: StaticVar: Обмен данными между Lua-скриптами в QUIK

У меня аналогичная проблема, выходит такая же ошибка, причем совершенно в случайном порядке.
Связываю эту ошибку с StaticVar вот по каким наблюдениям.
Своего бота, написанного на Lua, я разместил внутри кода индикатора QUIK. Для отображения параметров бота я использую таблицы рабочего места QUIK, данные в который передаются из индикатора через StaticVar.
После того, как стали появляться ошибки я добавил в код индикатора следующие строки, которые выполняются при инициализации индикатора:

local resultTable = {}
for a, b in pairs(_G) do
    table.insert(resultTable, a.."\t"..tostring(b))
    if  type(b) == "table" then
        for x, y in pairs(b) do
            table.insert(resultTable, "\t".. "|-- ".. x..'\t'..tostring(y))
        end
    end
end
local f = io.open(dir_logFile..'\\'..'GLOBAL.txt', 'w')
for i = 1, #resultTable do
    f:write(resultTable[i]..'\n') 
    f:flush() 
end
f:close()

Данный код сохраняет содержимое глобального окружения в файл. Для таблиц и функций указываются используемые ими адреса.
При возникновении ошибки я беру адрес из сообщения об ошибке и пробую его найти в вышеуказанном файле, который сформировал бот, в котором появилась ошибка.
Целиком совпадения не было ни разу, но максимальное совпадение первых символов адреса из сообщения об ошибке всегда приходится на функции StaticVar (пример на приложенном скриншоте).
https://i.postimg.cc/kXWLmXwM/image.jpg
Я не знаю насколько правильно производить такие сравнения, и возможно притянуты за уши совпадения, но другого способа найти хоть какую-то зацепку по возникающей ошибке я не знаю.
Буду благодарен если кто-то подскажет как найти источник ошибки.

ps. Ошибка носит случайный характер, так как код бота, находящийся в индикаторе, восстанавливает свою работу при получении следующего тика (изменения данных по свече) после возникновения ошибки.

96 (2024-09-25 09:38:48 отредактировано swerg)

Re: StaticVar: Обмен данными между Lua-скриптами в QUIK

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

Какая версия Lua используется в терминале?

97

Re: StaticVar: Обмен данными между Lua-скриптами в QUIK

Использовал на Lua 5.3 и Lua 5.4. Поведение одинаковое.
Скрипт, который бы воспроизводил проблему в процессе подготовки.

98 (2024-09-27 17:28:33 отредактировано igor)

Re: StaticVar: Обмен данными между Lua-скриптами в QUIK

Я использую версию 5.4.1.
Скрипт предоставить могу. Он несложный.
Но я тут сделал одно наблюдение. Я обычно запускаю quik на виртуальной машине с Windows 10. И если в это же время на этом же компьютере (точнее на ноутбуке) запущена ещё одна (вторая) виртуальная машина, например, с Windows 7, то эта ошибка начинает появляться где-то раз в час. Если вторая виртуальная машина работает под Windows XP, т.е. меньше запрашивает памяти, чем Windows 7 (2Гб против 8Гб), то эта ошибка появляется несколько реже. Если же вторая виртуальная машина вообще не запущена, то эта ошибка появляется совсем редко (но всё равно появляется). Хотя возможно вторая виртуальная машина несильно влияет на частоту появления этой ошибки – надо ещё понаблюдать.
А вот появляется ли эта ошибка, когда quik запущен не на виртуальной, а на реальной машине, сказать не могу. Последние дня два я погонял этот скрипт на реальной машине – этой ошибки не возникало вообще.
Т.е. пока, на данный момент, из всего этого можно сделать вывод, что появление этой ошибки связано не только со скриптом, но и с особенностями работы виртуальной машины.
Хотя по логике, всё должно работать одинаково – что на виртуальной машине, что на реальной.
Но это всё конечно предположение.
Может есть какое-то ограничение на количество этих статических переменных?