Йцукен (Все сообщения пользователя)

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

Страницы: Пред. 1 2
Извечный вопрос: повторные вызовы OnTrade, Даже при заявке на одну акцию
 
Цитата
TGB написал:
можно проверять циклически, по изменению их размеров, нужные вам таблицы QUIK (таблицы заявок, стоп-заявок, сделок и т.д.)?
Думаю такой подход сложнее, чем обработка колбеков.
На примере данной ситуации: если пришедший колбек не содержит значения нужных мне параметров, то я его пропускаю и жду колбек, который их содержит.
В случае же обработки таблиц вместо колбеков, нужно хранить не просто индекс последней обработанной строки таблицы, а индексы всех обработанных строк либо общее количество строк и индексы необработанных строк (пропущенных по причине отсутствия в них значений нужных параметров). И циклически проверять, не появились ли новые значения в пропущенных строках.
получение параметров индикатора, обращение к line
 
При добавлении индикатора из контекстного меню "Добавить график (индикатор)..."
Init
OnCalculate
OnCalculate


При изменении таймфрейма:
OnCalculate

При изменении инструмента в режиме связанных окон:
Init
OnChangeSettings
OnCalculate
получение параметров индикатора, обращение к line
 
Цитата
Старатель написал:
индикатор рассчитывается три раза (!), причём первый расчёт идёт со старым значением, но уже после нажатия на кнопку OK.

Сохраню для будущих поколений  :smile:
В общем случае при добавлении индикатора через меню "Редактирование настроек графика" происходит вызов функций в таком порядке:
Init
OnCalculate - с дефолтными значениями, заданными в скрипте
OnChangeSettings - тут скрипт читает значения, заданные пользователем вручную в диалоговом окне
OnCalculate
OnCalculate

При запуске QUIK на один OnCalculate меньше:
Init
OnChangeSettings
OnCalculate
OnCalculate
Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков
 
Цитата
nikolz написал:
Поправьте так и ничего не повесится
А слона-то вы и не заметили. Я специально модифицировал скрипт, чтобы показать, какие инструкции выполняются под блокировкой (в используемой версии Lua).
Извечный вопрос: повторные вызовы OnTrade, Даже при заявке на одну акцию
 
Цитата
User12501 написал:
Являются ли эти три поля синхронными всегда? (Т.е. либо все три равны 0, либо все три не равны 0?)
Нет
Извечный вопрос: повторные вызовы OnTrade, Даже при заявке на одну акцию
 
Цитата
User12501 написал:
Гарантируется ли, что вызов OnTrade, в котором эти поля нулевые, является не последним
Нет.
trans_id и uid в некоторых ситуациях могут иметь и нулевые значения.
Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков
 
nikolz, вы же сами дали ссылку на статью:
Цитата
Атомарность операций может обеспечиваться аппаратно (аппаратурой) и программно (программным кодом). В первом случае используются особые машинные инструкции, атомарность выполнения которых гарантируется аппаратурой. Во втором случае используются специальные программные средства синхронизации, с помощью которых осуществляется блокировка разделяемого ресурса; после блокировки выполняется операция, которую требуется выполнить атомарно. Блокировка представляет собой атомарную операцию, которая либо предоставляет ресурс в пользование потоку, либо сообщает потоку о том, что ресурс уже используется другим потоком или процессом (занят).

Теперь если ваш код модифицировать следующим образом:
Код
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, поскольку другой поток может подменить их значения в этот момент.
Cкорость обмена данными через файлы
 
Цитата
nikolz написал:
Что получается?
Если писать из main разных скриптов, то часть данных теряется
Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков
 
Цитата
nikolz написал:
x,y=y,x;
       if x~=99 or y~=199 then
           Log:write(tostring(x)..","..tostring(y).."\n")
Даже если вы поймаете тут ошибку, то подумайте вот о чём:
1) Может ли другой поток поменять значения переменных перед if ? Будет ли это означать отсутсвие атомарности в операторе присваивания?
2) Может ли другой поток поменять значения переменных перед выводом их в файл, т.е. гарантированно ли вы получите те значения, которые проверяли в if ?

Скрытый текст
Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков
 
Цитата
Йцукен написал:
В моём тесте неатомарность проявится, если значение любой из переменных (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
Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков
 
Цитата
nikolz написал:
Вы, очевидно, ждете системные ошибки, типа ошибок обращения к памяти. Верно?
Не верно. В моём тесте неатомарность проявится, если значение любой из переменных (a1, a2, a3, a4, a5, a6, a7, a8, a9) в любой момент времени будет отличным от остальных. Это будет означать, что поток main стал читать значения переменных в то время, когда в другом потоке произошла запись значений только части из них.

Цитата
nikolz написал:
Вот вам тест:
И? Результаты, выводы?
Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков
 
Цитата
nikolz написал:
как вы проверили, что выполняется атомарно?  Где доказательство?
Вот: #11
Цитата
Йцукен написал:
такой код работает без ошибок

Можете опровергнуть?
Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков
 
Похоже, операция множественного присвоения выполняется атомарно.
Вот такой код работает без ошибок:
Скрытый текст
Cкорость обмена данными через файлы
 
Цитата
nikolz написал:
Но если это разные потоки или приложения, то надо синхронизировать
Как в QLua синхронизировать запись из разных скриптов в один файл?
Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков
 
Цитата
nikolz написал:
При множественном присваивании Lua сначала вычисляет все значения, а затем выполняет присваивание.
А если все значения уже вычислены, как в примерах выше?
Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков
 
Является ли атомарной операция присвоения одновременно нескольким переменным?
Код
a, b = 1, 2
или
Код
x, y = y, x
Нули в индикаторе там, где должны быть пустые интервалы
 
Вот код тестового индикатора:
Код
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
Если его добавить на диаграмму с несколькими графиками и сделать экспорт в текстовый файл, то на тех свечах, где индикатор не рассчитывался будут нули.
Нули в индикаторе там, где должны быть пустые интервалы
 
Пишу индикатор. При отсутсвии свечки OnCalculate не рассчитывает значение (когда на одну диаграмму добавляется несколько графиков).
Но если сохранить индикатор в текстовый файл (ПКМ - Сохранить данные в файл), то на месте нерассчитанных значений будут нули.
На примере Moving Average:
Цитата
CHU2 [SPBFUT],1,20251130,175500,94927.555556
CHU2 [SPBFUT],1,20251130,175900,95014.000000
CHU2 [SPBFUT],1,20251130,180100,95059.111111
CHU2 [SPBFUT],1,20251130,180400,0.000000
CHU2 [SPBFUT],1,20251130,180900,0.000000
CHU2 [SPBFUT],1,20251130,181200,0.000000
CHU2 [SPBFUT],1,20251130,181300,0.000000
CHU2 [SPBFUT],1,20251130,181700,0.000000
CHU2 [SPBFUT],1,20251130,182100,95076.111111
При этом, если сохранить стандартный квиковский индикатор с тогой же диаграммы, то он будет без нулей:
Цитата
CHU2 [SPBFUT],1,20251130,175500,94927.555556
CHU2 [SPBFUT],1,20251130,175900,95014.000000
CHU2 [SPBFUT],1,20251130,180100,95059.111111
CHU2 [SPBFUT],1,20251130,182100,95076.111111
Вопрос: как в самописном индикаторе сделать так же?

Пробовал возвращать и nil и ничего не возвращать в OnCalculate
Код
function OnCalculate(index)
  ...
  if v ~= nil then return v
  else return nil end
end
Код
function OnCalculate(index)
  ...
  if v ~= nil then return v end
end
Результат одинаковый.
Страницы: Пред. 1 2
Наверх