Извечный вопрос: повторные вызовы OnTrade, Даже при заявке на одну акцию
Пользователь
Сообщений: Регистрация: 02.01.2026
10.01.2026 13:55:24
Цитата
TGB написал: можно проверять циклически, по изменению их размеров, нужные вам таблицы QUIK (таблицы заявок, стоп-заявок, сделок и т.д.)?
Думаю такой подход сложнее, чем обработка колбеков. На примере данной ситуации: если пришедший колбек не содержит значения нужных мне параметров, то я его пропускаю и жду колбек, который их содержит. В случае же обработки таблиц вместо колбеков, нужно хранить не просто индекс последней обработанной строки таблицы, а индексы всех обработанных строк либо общее количество строк и индексы необработанных строк (пропущенных по причине отсутствия в них значений нужных параметров). И циклически проверять, не появились ли новые значения в пропущенных строках.
получение параметров индикатора, обращение к line
Пользователь
Сообщений: Регистрация: 02.01.2026
08.01.2026 20:25:46
При добавлении индикатора из контекстного меню "Добавить график (индикатор)..." Init OnCalculate OnCalculate
При изменении таймфрейма: OnCalculate
При изменении инструмента в режиме связанных окон: Init OnChangeSettings OnCalculate
получение параметров индикатора, обращение к line
Пользователь
Сообщений: Регистрация: 02.01.2026
08.01.2026 17:55:36
Цитата
Старатель написал: индикатор рассчитывается три раза (!), причём первый расчёт идёт со старым значением, но уже после нажатия на кнопку OK.
Сохраню для будущих поколений В общем случае при добавлении индикатора через меню "Редактирование настроек графика" происходит вызов функций в таком порядке: Init OnCalculate - с дефолтными значениями, заданными в скрипте OnChangeSettings - тут скрипт читает значения, заданные пользователем вручную в диалоговом окне OnCalculate OnCalculate
При запуске QUIK на один OnCalculate меньше: Init OnChangeSettings OnCalculate OnCalculate
Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков
Пользователь
Сообщений: Регистрация: 02.01.2026
07.01.2026 09:35:34
Цитата
nikolz написал: Поправьте так и ничего не повесится
А слона-то вы и не заметили. Я специально модифицировал скрипт, чтобы показать, какие инструкции выполняются под блокировкой (в используемой версии Lua).
Извечный вопрос: повторные вызовы OnTrade, Даже при заявке на одну акцию
Пользователь
Сообщений: Регистрация: 02.01.2026
06.01.2026 23:46:33
Цитата
User12501 написал: Являются ли эти три поля синхронными всегда? (Т.е. либо все три равны 0, либо все три не равны 0?)
Нет
Извечный вопрос: повторные вызовы OnTrade, Даже при заявке на одну акцию
Пользователь
Сообщений: Регистрация: 02.01.2026
06.01.2026 23:45:30
Цитата
User12501 написал: Гарантируется ли, что вызов OnTrade, в котором эти поля нулевые, является не последним
Нет. trans_id и uid в некоторых ситуациях могут иметь и нулевые значения.
Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков
Атомарность операций может обеспечиваться аппаратно (аппаратурой) и программно (программным кодом). В первом случае используются особые машинные инструкции, атомарность выполнения которых гарантируется аппаратурой. Во втором случае используются специальные программные средства синхронизации, с помощью которых осуществляется блокировка разделяемого ресурса; после блокировки выполняется операция, которую требуется выполнить атомарно. Блокировка представляет собой атомарную операцию, которая либо предоставляет ресурс в пользование потоку, либо сообщает потоку о том, что ресурс уже используется другим потоком или процессом (занят).
Теперь если ваш код модифицировать следующим образом:
Код
local x, y
function main()
while true do
y = 99
x = 199
x, y = y, x
if x ~= 99 or y ~= 199 then
s = tostring(x)..","..tostring(y).."\n"
end
end
end
и запустить, то QUIK повесится (версия Lua: 5.4.1).
Если же конкатенацию строк с си-функцией tostring вынести за пределы блока if
Код
local x, y
function main()
while true do
y = 99
x = 199
x, y = y, x
if x ~= 99 or y ~= 199 then end
s = tostring(x)..","..tostring(y).."\n"
end
end
то QUIK, хоть и загрузит одно ядро на 100%, но остаётся доступным и позволяет остановить скрипт. Что, как бы, намекает, что инструкции
Код
y = 99
x = 199
x, y = y, x
if x ~= 99 or y ~= 199 then
выполняются под блокировкой. А вот преобразование числа в строку - нет. Отсюда и ответ на 2-й : вы не сможете таким образом гарантированно вывести в файл значения переменных x и y, которые были в момент проверки их оператором if, поскольку другой поток может подменить их значения в этот момент.
Если писать из main разных скриптов, то часть данных теряется
Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков
Пользователь
Сообщений: Регистрация: 02.01.2026
06.01.2026 15:19:37
Цитата
nikolz написал: x,y=y,x; if x~=99 or y~=199 then Log:write(tostring(x)..","..tostring(y).."\n")
Даже если вы поймаете тут ошибку, то подумайте вот о чём: 1) Может ли другой поток поменять значения переменных перед if ? Будет ли это означать отсутсвие атомарности в операторе присваивания? 2) Может ли другой поток поменять значения переменных перед выводом их в файл, т.е. гарантированно ли вы получите те значения, которые проверяли в if ?
Скрытый текст
Ответ на 2-й вопрос - Нет.
Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков
Пользователь
Сообщений: Регистрация: 02.01.2026
06.01.2026 15:10:18
Цитата
Йцукен написал: В моём тесте неатомарность проявится, если значение любой из переменных (a1, a2, a3, a4, a5, a6, a7, a8, a9) в любой момент времени будет отличным от остальных. Это будет означать, что поток main стал читать значения переменных в то время, когда в другом потоке произошла запись значений только части из них.
Другими словами, если мы попадём внутрь блока
Код
if a1 ~= a2 or a1 ~= a3 or a1 ~= a4 or a1 ~= a5 or a1 ~= a6 or a1 ~= a7 or a1 ~= a8 or a1 ~= a9 or a1 == nil then
error("error")
end
Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков
Пользователь
Сообщений: Регистрация: 02.01.2026
06.01.2026 15:08:05
Цитата
nikolz написал: Вы, очевидно, ждете системные ошибки, типа ошибок обращения к памяти. Верно?
Не верно. В моём тесте неатомарность проявится, если значение любой из переменных (a1, a2, a3, a4, a5, a6, a7, a8, a9) в любой момент времени будет отличным от остальных. Это будет означать, что поток main стал читать значения переменных в то время, когда в другом потоке произошла запись значений только части из них.
Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков
Пользователь
Сообщений: Регистрация: 02.01.2026
06.01.2026 09:14:37
Похоже, операция множественного присвоения выполняется атомарно. Вот такой код работает без ошибок:
Скрытый текст
Код
local run = true
local a1, a2, a3, a4, a5, a6, a7, a8, a9 = 0, 0, 0, 0, 0, 0, 0, 0, 0
local n = 100
function OnAllTrade()
for i = 1, n do
a1, a2, a3, a4, a5, a6, a7, a8, a9 = i, i, i, i, i, i, i, i, i
end
end
function OnParam()
for i = 1, n do
a1, a2, a3, a4, a5, a6, a7, a8, a9 = i, i, i, i, i, i, i, i, i
end
end
function main()
while run do
sleep(1)
local t = prec_time()
for i = 1, n do
if a1 ~= a2 or a1 ~= a3 or a1 ~= a4 or a1 ~= a5 or a1 ~= a6 or a1 ~= a7 or a1 ~= a8 or a1 ~= a9 or a1 == nil then
error("error")
end
end
end
end
function OnStop()
run = nil
end
Cкорость обмена данными через файлы
Пользователь
Сообщений: Регистрация: 02.01.2026
06.01.2026 09:12:04
Цитата
nikolz написал: Но если это разные потоки или приложения, то надо синхронизировать
Как в QLua синхронизировать запись из разных скриптов в один файл?
Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков
Пользователь
Сообщений: Регистрация: 02.01.2026
05.01.2026 09:52:58
Цитата
nikolz написал: При множественном присваивании Lua сначала вычисляет все значения, а затем выполняет присваивание.
А если все значения уже вычислены, как в примерах выше?
Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков
Пользователь
Сообщений: Регистрация: 02.01.2026
04.01.2026 21:53:08
Является ли атомарной операция присвоения одновременно нескольким переменным?
Код
a, b = 1, 2
или
Код
x, y = y, x
Нули в индикаторе там, где должны быть пустые интервалы
Пользователь
Сообщений: Регистрация: 02.01.2026
03.01.2026 13:55:31
Вот код тестового индикатора:
Код
Settings = {
Name = "Test",
line = {{ Name = "Test" }}
}
function Init()
return 1
end
function OnCalculate(index)
if true == CandleExist(index) then
return C(index)
end
--return nil
end
Если его добавить на диаграмму с несколькими графиками и сделать экспорт в текстовый файл, то на тех свечах, где индикатор не рассчитывался будут нули.
Нули в индикаторе там, где должны быть пустые интервалы
Пользователь
Сообщений: Регистрация: 02.01.2026
02.01.2026 23:50:08
Пишу индикатор. При отсутсвии свечки OnCalculate не рассчитывает значение (когда на одну диаграмму добавляется несколько графиков). Но если сохранить индикатор в текстовый файл (ПКМ - Сохранить данные в файл), то на месте нерассчитанных значений будут нули. На примере Moving Average: