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

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

Страницы: Пред. 1 2 3 4 5 6 7 8 9 10 11 ... 13 След.
Отладка QUIK 8.13
 
Цитата
Старатель написал:
пример написан криво. Отдать 100% CPU под два оператора - такое себе.Реальный пример есть?
  Ну, если вам этот пример не  нравится, то ждите дальше.
Отладка QUIK 8.13
 
Цитата
Владимир написал:
TGB , Специальный сервер на бирже с прямыми каналами доступа к торгам тоже не поможет - Квик, батенька! Да ещё и Луа. А, ну да - ещё не дочитал до конца.
  Согласен.
Отладка QUIK 8.13
 
Цитата
Старатель написал:
TGB , как я понял, проблемы-то и нет вовсе. Или что вам продемонстрировала реальная жизнь?
 Читайте:
Цитата
TGB написал:
2) Последний случай бурного обсуждения системной ошибки QLua, устраняемой моим предложением  https://forum.quik.ru/forum10/topic7303/  . Причем этот случай далеко не первый.
Отладка QUIK 8.13
 
Цитата
nikolz написал:
Так что HFT робот вполне  реально, но должен быть в дата центре.
  Дата центр вам не поможет. Вам надо арендовать для вашего QUIK специальный сервер на бирже с прямыми каналами доступа к торгам.
  Но и это вам не поможет при использовании стандартного рабочего места QUIK, так как API взаимодействия QLua с QUIK выполняется в среде Lua, в которой автоматическое управление памятью, и в произвольные моменты времени может запускаться сборка мусора. Сборка мусора может вносить заметные задержки (не исключено миллисекундные) при взаимодействии вашей программы с QUIK. Вы, конечно, можете отключить сборку мусора, но тогда флаг вам в руки :smile: . Попробуйте.
----------
  Вообще, надо заниматься тем, о чем есть хоть какое-то понятие.  HFT роботы не "манна небесная" и о проблемах их использования (как технических так и алгоритмических) достаточно информации в интернете.
Отладка QUIK 8.13
 
Цитата
TGB написал:
Мое предложение от  22.04.2021 15:59:54 https://forum.quik.ru/messages/forum10/message55019/topic6356/#message55019
 Добавлю:
1) Я уже тогда написал, что вариант предлагаемого решения проверен мною на моем стенде имитации QLua (исключая его API).
2) Последний случай бурного обсуждения системной ошибки QLua, устраняемой моим предложением https://forum.quik.ru/forum10/topic7303/ . Причем этот случай далеко не первый.
Отладка QUIK 8.13
 
Цитата
nikolz написал:
Таких проблем не существует, если делать как у меня.
 Я написал свое предложение не про вас, не для вас и даже не для, конкретно, себя. Это про системную ошибку в QLua.
Цитата
nikolz написал:
Можно делать HFT, чего раньше даже не думал
 Ну, вы фантазер.  HFT в QUIK  :smile: ? Это диагноз.
Отладка QUIK 8.13
 
Цитата
Roman Azarov написал:
Данные пожелания еще не были рассмотрены. Как только появится какая-то новая информация, мы сообщим об этом в данной ветке форума.
Мое предложение от  22.04.2021 15:59:54
https://forum.quik.ru/messages/forum10/message55019/topic6356/#message55019
Прошел год.
-----------------
 Напомню описание ситуации и вариант ее устранения.
---
 Бывают ситуации зависания в QLua, когда основной поток обслуживания колбеков всех скриптов пользователя, а также таблиц QUIK (это не таблицы Lua), блокируется выполнением  длинного цикла пользовательской программы на «чистом» Lua, в котором нет ни вызова seep ни вызова дру-гих C-функций.
Это может порождать ошибки, которые для многих пользователей QLua (использующих несколько запускаемых скриптов)  являются неожиданными и труднообъяснимыми. Блокируются выполнения колбеков всех скриптов из-за выполнения длинного цикла пользовательской программы на «чистом» Lua в каком-то из запущенных пользователем скриптов.  При этом зависает рабочее место QUIK. Это системная ошибка QLua.
----
  Есть простой вариант реализации пожелания (далее список изменений, реализующих этот вариант в тексте исходников QLua ):
1. В файле   lstate.h  после строки:  lu_byte allowhook;
добавить: int Счетчик_для_переключения_State;
2. В файле   lstate.с  после строки:  L->errfunc = 0;
добавить:  L->Счетчик_для_переключения_State = 0;
3. В файле   lstate.с  после строки:  L1->stacksize = BASIC_STACK_SIZE;
добавить:  L1->Счетчик_для_переключения_State = 0;
4. В файле   lvm.с  после строки:  StkId ra;
добавить:  
if (++L->Счетчик_для_переключения_State > 1000) {   //  1000  надо задать кон-стантой  
 L->Счетчик_для_переключения_State = 0;
 lua_unlock(L); lua_lock(L);
}
-----------------------
В чем проблема реализации этого пожелания?
Сохранение результатов работы скрипта в файл
 
Цитата
Владимир-Лапуля написал:
Лапуль
 Опять адрес форума перепутали :smile: ?
Сохранение результатов работы скрипта в файл
 
Цитата
TGB написал:
(а всех переменных)
Описка. Читать: (а не всех переменных)
Сохранение результатов работы скрипта в файл
 
Цитата
Владимир написал:
просто безумная сложность!   Я говорил про сложность СТРУКТУРЫ данных, ЛОГИЧЕСКОЙ структуры, и предельная сложность такой структуры называется "граф общего вида" (если учесть, что узлами такого графа могут быть не только атомарные элементы, но и субграфы, а его рёбра также могут быть нагружены произвольной информацией, при этом количество рёбер по разным измерениям может быть переменным, в т.ч. нулевым.
  Особой сложности нет.
  Практически любая безумность, которую вы сможете написать на Lua, будет сереализована и десереализована моими сложными функциями сереализации.
  Но, на самом деле, для целей сохранения и восстановления состояний функций, требуемых (а всех переменных) для продолжения функционирования моего скрипта после перезапуска, я вполне обхожусь простыми функциями сереализации, выложенными здесь.
Сохранение результатов работы скрипта в файл
 
Цитата
Владимир написал:
НУ ЗА КАКИМ ХЕРОМ нужно "сохранять и восстанавливать ВСЁ окружение"? Это же ИДИОТИЗМ! Нужно делать только то, что нужно, и ничего, кроме этого.
  В моем комментарии не написано, что в моих боевых скриптах сохраняется все окружение.
  Там написано:
Цитата
TGB написал:
Это проверено на сохранении и восстановлении всего окружения (таблица _G) моих разных скриптов и, кстати, выполняется быстро.
Сохранение результатов работы скрипта в файл
 
Цитата
Владимир написал:
это Ваши комплексы, не мои
 А это на что похоже (много повторений да еще крупным шрифтом самое-самое)?:
Цитата
Владимир написал:
структура моих сохраняемых и восстанавливаемых данных НАМНОГО сложнее, и эта задача В ПРИНЦИПЕ не решаема такими функциями.
 Да ладно вам, какие технологические сложности могут быть при построении торговых роботов? Статегия торгов это действительно проблема. Но эффективность стратегии торгов, конечно, определяется не ее сложностью. Стратегия может быть сложной, но не прибыльной, а может быть простой и прибыльной.
  Судя по фрагментам кодов вашего скрипта, структура данных в нем представлена в виде давно известной многомерной матрицы размерности N < 1000, с числовыми индексами, в которой вы храните свой граф. Или это не так?  Что, кроме  table, boolean, number, string, являются эле-ментами вашего графа? Если у вас что-то более монструозное, то было бы интересно узнать: зачем это сделано? Все-таки, надо стремиться к простоте.  
  Но даже, если вы построили что-то монструозное, и корнем этого является таблица, то у меня есть более сложные функции сереализации (их я вам не предлагаю, понимая вашу реакцию на это  :smile: ), которые, скорее всего, смогут сереализовать и десереализовать вашу монструозность. Это проверено на сохранении и восстановлении всего окружения (таблица _G) моих разных скриптов и, кстати, выполняется быстро.
   У меня нет цели что-то вам навязывать.  Мне просто интересно: у вас что-то более сложное, чем служебная таблица окружения скрипта _G, в которой хранятся все глобаль-ные переменные работающего скрипта и многое другое?
Сохранение результатов работы скрипта в файл
 
Цитата
Владимир написал:
TGB , Я не вижу смысла в этих функциях - зачем же мне их тестировать?
  Вам лично они, наверное, пока не нужны, так ка вы что то сделали свое. Но вы голословно, вместо того чтобы проверить, утверждаете, что эти функции не работают. У вас что, такой принцип: обгаживать все чужое, чтобы на этом фоне самому выглядеть "молодцом"? Возникает такое ощущение, что вы считаете что весь форум посвящен только вашему непревзойденному" скрипту. На форуме на самом деле есть и другие пользователи и гости.
-----
 Кстати, начальную проверку функций можно выполнить за 2-3 минуты (это меньше, чем написание пяти строк текста комментария)
Например, для начала вы могли бы посмотреть готовый вариант:
1. Перед запуском проверок, в функции tbl_to_string  заменить  GetLocalTimeMls()  на стандартную os.time().  
2. Код проверки простой таблицы (под кодом функций)
Код
   local tbl =  {
                       ['Тикер'] = 'SBER'
           , [{ 1, 2, 3}] = { 'QUIK'}
           , TOBR =  {6, 8, 4, {1, 2, 3 }}
           , 'Сохранение таблицы'
           , ok = true
                    }
-- Сохранение таблицы --
  local str = tbl_to_string (tbl)  
  message ( str )   -- в str строковый образ таблицы  ---
 -- Восстановление таблицы ---
   local tbl1 = string_to_tbl (str)   --- в tbl1 восстановленная таблица 

 3.  Далее можно, экспериментировать, меняя таблицу tbl
Сохранение результатов работы скрипта в файл
 
Цитата
Владимир написал:
Но если снова начнёте пороть чушь, ничего хорошего я Вам не гарантирую.
   Ну, вы неугономные  :smile: . Но только в написании длинных голословных текстов. Это вместо того, чтобы потестировать предложенные мною функции и найти таблицу (с довольно слабыми ограничениями, заданными в их описании), которую эти функции не смогут обработать.
Сохранение результатов работы скрипта в файл
 
Владимир,
если вы не против, мне  хотелось бы закончить наш с вами «батлз» миром.  Наверное, для этого достаточно не комментировать друг друга.
Сохранение результатов работы скрипта в файл
 
Цитата
Владимир-Лапуля написал:
Лапуль
   Опять промахнулись с форумом  :smile: ?
Сохранение результатов работы скрипта в файл
 
1.  
Цитата
Владимир написал:
Лапуль
    Вы, похоже, сильно ошиблись форумом. Напомню, здесь, все-таки, форум по программированию, а не гей-клуб.   Зачем вы подставляетесь? Ведь кто-нибуть может начать обращаться к вам по кликухе Владимир-Лапуля, с тем, чтобы не перепутать с другими Владимирами.

2.
Цитата
Владимир написал:
я и сам по себе хороший алгоритмист, и как таковой, знаю совершенно точно
  Алгоритмист вы посредственный, если не понимаете, что с определенными ограничениями (а я их описал в комментариях к своему коду) отдельная таблица (и вы до сих пор не поняли это) может быть сереализована. Покажите мне таблицу произвольной вложенности, в которой в качестве ключей-индексов и их значений используются :
         1) ключи и значения : table, boolean, number, string;
         2) все элементы таблицы (ключи и значения) типа table должны быть уникальными (в пределах таблицы).
  И которая не будет обработана предложенными мной кодами. А без этого все написанное вами бла-бла.

3. Что вы так убиваетесь? В конце концов, вы меня затмили по количеству выложенного вами текста, наверное, в 20 раз, с чем вас точно можно поздравить  :smile: .  Да и концовка дискуссии, наверное, будет за вами  :smile: .  И, все-таки, зацените  :smile: , в моих текстах нет ни одного грубого слова, не считая ваших цитат, и почти все они по делу.
Сохранение результатов работы скрипта в файл
 
Цитата
Владимир написал:
И кто Вам сказал, что я злюсь? Я всего лишь сказал, что Ваше беспомощное дерьмо НИКОГДА оно не сделает из того, что требуется. И это просто медицинский факт.
 Исходя из написанного вами выше, повторно, совершенно ясно, что вы опять не понимаете то, что я подробно объяснил в своем комментарии: https://forum.quik.ru/messages/forum10/message62929/topic7277/#message62929
 В этом комментарии написано все очень просто. Прочитайте этот комментарий внимательно несколько раз и, надеюсь, что ваше мнение изменится :)
Сохранение результатов работы скрипта в файл
 
Цитата
TGB написал:
Ну и пусть.
 Я так примирительно  :smile: а вы:
Цитата
Владимир написал:
Так на кой мне (или кому бы то ни было) Ваше беспомощное дерьмо? НИКОГДА оно не сделает из того, что требуется. НИКОГДА!
 Нужно или не нужно это каждый решает для себя.
 Что вы так «выпрыгиваете из штанов» и злитесь? Но я на вас не обижаюсь  :smile: .
Сохранение результатов работы скрипта в файл
 
Цитата
Владимир написал:
В ПРИНЦИПЕ неспособна это сделать! Хотя бы по той простой причине, что она не знает и не может знать, что и как сохранять, в каком виде, как и куда это всё восстанавливать. Она не будет работать НИКОГДА!
  Я нигде не писал, что сереализация знает что и как сохранять. Вы скопировав функции tbl_to_string(t, i) и string_to_tbl (str_tbl) смогли бы заменить весь ваш код по сохранению и при необходимости восстановления вашего графа двумя строками. У меня это работает в нескольких местах, начиная с 2019г. Так что вы неправы насчет НИКОГДА. Но, наверное, вам милее ваш код сохранения состояния выполнения вашего скрипта. Ну и пусть.
Сохранение результатов работы скрипта в файл
 
Цитата
Владимир написал:
Любому дебилу понятно, что исходная и сохраняемая структура - это РАЗНЫЕ структуры. Или не любому?
 Не согласен. Это понятно не всякому дебилу и поэтому поясню подробнее :smile: :
Цитата
TGB написал:
F:write(tbl_to_string( , ' '))   --- Одна строка
Таблица преобразовалась в строку и записалась в файл. Результат: строка в файле.
Цитата
TGB написал:
  = string_to_tbl ( )  --- Одна строка
Строка считана из файла и преобразована в таблицу.  Результат: таблица.
Итого:  1) <Таблица>  ->  <Строка>
           2) <Строка>  ->  <Таблица>
Сохранение результатов работы скрипта в файл
 
Упустил:
Цитата
Владимир написал:
И с этой задачей Ваша "сереализация" не справится НИКОГДА!
 Справится. Попробуйте.  
 -- Сохранение вашей таблицы --
  F:write(tbl_to_string(<Ваша таблица>, ' '))   --- Одна строка
 -- Восстановление таблицы ---
  <Ваша таблица> = string_to_tbl (<Чтение из файла вашей таблицы>)  --- Одна строка
 -- Восстановление таблицы ---
Сохранение результатов работы скрипта в файл
 
Цитата
Владимир написал:
Здесь, кстати, вообще сказано, что нужно сохранять таблицу, созданную по AllocTable, т.е. таблицу Квика, а не таблицу Lua
 Читайте внимательно:
Цитата
Дмитрий написал:
Правильно тогда мой вопрос будет звучать как: Результатом работы скрипта получается таблица как ТИП ДАННЫХ, которую нужно сохранить в файл.
 Из контекста можно понять, что пользователя, наверное, интересует таблица Lua
----------
 Вы не ответили на мой вопрос:
Цитата
TGB написал:
Зачем элементарный код вы представляете как ваше открытие  ?
 У меня есть сильное подозрение, что ваше сообщение было написано чтобы в нем появилась фраза :smile: :
Цитата
Владимир написал:
Мой скрипт каждые 5 минут записывает дамп текущего состояния - так это целый граф, а не какая-то сраная таблица!
------
Сохранение результатов работы скрипта в файл
 
Цитата
Владимир написал:
TGB , Зачем просто, когда можно сложно?  На код просто смотреть страшно (и я не собираюсь этого делать). Программа пишется в 5 секунд, и она в 100500 раз проще, чем в этом "простом варианте". ЗА КАКИМ ХРЕНОМ нужна эта долбаная "конвертация таблицы в строку"? Заняться больше нечем?
  Я предложил функции сереализации и десереализации не для вашего элементарного случая, когда массив вложен в другой массив (с индексами 1… n). Хотя и ваш случай будет обработан этими функциями.  Вопрос, заданный в ветке: как сохранить, а потом восстановить таблицу, а не по работе с числовыми индексами  таблицы-массива.
1. Ваш код не обработает, например, даже элементарную таблицу:
t = { [‘Тикер’] = 'SBER'}. Тем более, не обработает таблицу произвольной вло-женности, в которых индексами-ключами могут быть таблицы.
      В вашем коде нет функции восстановления таблицы  :smile:
2. Зачем элементарный код вы представляете как ваше открытие :smile: ?
Сохранение результатов работы скрипта в файл
 
Код
-----  Конвертация таблицы в строку (сереализация) ------
-- Преобразование таблицы без ее метатаблицы (ключи и значения : table, boolean, number, string) в текстовое представление
-- в соответствии с синтаксисом языка lua  ---
----    Можно использовать для сохранения таблиц в текстовом виде, с возможностью последующего восстановления
--      со следующими ! ограничениями:
--       1) ключи и значения : table, boolean, number, string;
--       2) все элементы таблицы (ключи и значения) типа table должны быть уникальными (в пределах таблицы).
------  Параметры: 1) t  -  таблица (обрабатываются все вложения );  
--                          2) i  -  начальная строка формирования отступа при выводе вложений (например, " ");  если i = '', то строки таблицы выводятся без отступов  
-- Результат (! два): 1) строка (тремя звездочками помечены проблемные места);  2)  количество записей, которые  нельзя представить в текстовом виде
-- с последующим восстановлением  ----
---------
local function tbl_to_string(t, i)
  if type(t) ~= "table" then
        return nil
  end
  i = i or ' '
  local key_tbl_stateOS= "--таблица: "
  local tab = "\t"
  if i == '' then tab ='' end
  local ltime_str =GetLocalTimeMls()
  local tbl = {}  ---   для результата  ----
  local no_unpack =0
   -----------
  local function dump(t, i, seen)      ---------
       if seen then
       if seen[t] then
          return seen[t]
       end
tbl[#tbl +1] = " { -- " .. tostring(t) .. "\n"
else
    seen={} --  просмотренные --
    tbl[#tbl +1] = "{" .. key_tbl_stateOS .. string.format("%.0f", ltime_str) .. " -- время создания \n"
end
       seen[t] = tostring (t)
if debug.getmetatable ( t )  then  no_unpack = no_unpack + 1;   tbl [#tbl +1] = i .. ' --- *** У таблицы ' .. tostring(t) .. ' есть метатаблица, которая в функции tbl_to_string не обрабатывается \n' end
local bracket = true  -- скобка  (начало) ---
--
       for k,v in next, t do
       if type(k) == "table" then
                   if bracket then  tbl [#tbl +1] = i .. " [\n"; bracket = false else tbl [#tbl +1] = i .. ", [\n" end
   if  dump(k, i .. tab, seen) then
                   tbl [#tbl +1] = "*** -> " .. tostring (k) .. '\n'
   no_unpack = no_unpack + 1
end
tbl [#tbl +1] = i .. " ] = "
else
                   if bracket then  tbl [#tbl +1] = i .. " [ "; bracket = false else tbl [#tbl +1] = i .. ", [ " end
if type(k) == "function"  or type(k) == "userdata" or type(k) == "thread"  then
  tbl [#tbl +1] = "*** " .. type(k)
  no_unpack = no_unpack + 1
   end
   if type(k) == "string"  then
           tbl [#tbl +1] = "'".. tostring(k) .. "'"
   else
                       tbl [#tbl +1] = tostring(k)
       end
tbl [#tbl +1] = " ] = "
               end

               if type(v) == "table" then
if  seen[v] then
           tbl [#tbl +1] = "*** -> " .. tostring(v) .. '\n'
   no_unpack = no_unpack + 1
else
                       dump(v, i .. tab, seen)  ---
   end
else
   if type(v) == "function"  or type(v) == "userdata" or type(v) == "thread" then
   no_unpack = no_unpack +1
tbl [#tbl +1] = "*** " .. tostring(v) .. '\n'
else
   if type(v) == "string"  then
        tbl [#tbl +1]= '"' .. v .. '" \n'
   else
                            tbl [#tbl +1] = tostring(v) .. "\n"
   end
end
end
       end
--
tbl[#tbl +1] = i .. " } \n"
   end
---------------------
   dump(t,i)
tbl[#tbl] = i .. "}".. key_tbl_stateOS .. string.format("%.0f", ltime_str) .. "\n" --- !!! заменяется последняя фугурная скобка ---
return  table.concat ( tbl), no_unpack    ----- Результат: 1) строка ;  2)  количество значений, не представимых в текстовом виде  ----
end
-----
---- Преобразование сереализованной таблицы (строки) в таблицу Lua (десереализация)  --------------------
--- Результат:  таблица  Lua   ------
function string_to_tbl (str_tbl)
--    message (" string_to_tbl ", "return " ..  str_tbl )
   if str_tbl:find("{") == nil then return nil end  ---  если в строке str_tbl нет {
local tbl , err_tbl = load ("return " ..  str_tbl )         ----    assert (load_OS ( "retur " .. 4))   -- $$$$
   if  err_tbl ~= nil  then
message (" string_to_tbl ", "!!! Ошибка в синтаксисе таблицы:  "  .. str_tbl)  --- err_tbl)
return nil
end
return  tbl()
end
----
Сохранение результатов работы скрипта в файл
 
Цитата
Дмитрий написал:
в этом и вопрос как ее написать - никаких функций для этого я не нашел, даже зацепочки.
 Сереализация и десереализация таблиц (простой вариант).
<code>
-----  Конвертация таблицы в строку (сереализация) ------
-- Преобразование таблицы без ее метатаблицы (ключи и значения : table, boolean, number, string) в текстовое представление
-- в соответствии с синтаксисом языка lua  ---
----    Можно использовать для сохранения таблиц в текстовом виде, с возможностью последующего восстановления
--      со следующими ! ограничениями:
--       1) ключи и значения : table, boolean, number, string;
--       2) все элементы таблицы (ключи и значения) типа table должны быть уникальными (в пределах таблицы).
------  Параметры: 1) t  -  таблица (обрабатываются все вложения );  
--                          2) i  -  начальная строка формирования отступа при выводе вложений (например, " ");  если i = '', то строки таблицы выводятся без отступов  
-- Результат (! два): 1) строка (тремя звездочками помечены проблемные места);  2)  количество записей, которые  нельзя представить в текстовом виде
-- с последующим восстановлением  ----
---------
local function tbl_to_string(t, i)
  if type(t) ~= "table" then
        return nil
  end
  i = i or ' '
  local key_tbl_stateOS= "--таблица: "
  local tab = "\t"
  if i == '' then tab ='' end
  local ltime_str =GetLocalTimeMls()
  local tbl = {}  ---   для результата  ----
  local no_unpack =0
   -----------
  local function dump(t, i, seen)      ---------
       if seen then
       if seen[t] then
          return seen[t]
       end
tbl[#tbl +1] = " { -- " .. tostring(t) .. "\n"
else
    seen={} --  просмотренные --
    tbl[#tbl +1] = "{" .. key_tbl_stateOS .. string.format("%.0f", ltime_str) .. " -- время создания \n"
end
       seen[t] = tostring (t)
if debug.getmetatable ( t )  then  no_unpack = no_unpack + 1;   tbl [#tbl +1] = i .. ' --- *** У таблицы ' .. tostring(t) .. ' есть метатаблица, которая в функции tbl_to_string не обрабатывается \n' end
local bracket = true  -- скобка  (начало) ---
--
       for k,v in next, t do
       if type(k) == "table" then
                   if bracket then  tbl [#tbl +1] = i .. " [\n"; bracket = false else tbl [#tbl +1] = i .. ", [\n" end
   if  dump(k, i .. tab, seen) then
                   tbl [#tbl +1] = "*** -> " .. tostring (k) .. '\n'
   no_unpack = no_unpack + 1
end
tbl [#tbl +1] = i .. " ] = "
else
                   if bracket then  tbl [#tbl +1] = i .. " [ "; bracket = false else tbl [#tbl +1] = i .. ", [ " end
if type(k) == "function"  or type(k) == "userdata" or type(k) == "thread"  then
  tbl [#tbl +1] = "*** " .. type(k)
  no_unpack = no_unpack + 1
   end
   if type(k) == "string"  then
           tbl [#tbl +1] = "'".. tostring(k) .. "'"
   else
                       tbl [#tbl +1] = tostring(k)
       end
tbl [#tbl +1] = " ] = "
               end

               if type(v) == "table" then
if  seen[v] then
           tbl [#tbl +1] = "*** -> " .. tostring(v) .. '\n'
   no_unpack = no_unpack + 1
else
                       dump(v, i .. tab, seen)  ---
   end
else
   if type(v) == "function"  or type(v) == "userdata" or type(v) == "thread" then
   no_unpack = no_unpack +1
tbl [#tbl +1] = "*** " .. tostring(v) .. '\n'
else
   if type(v) == "string"  then
        tbl [#tbl +1]= '"' .. v .. '" \n'
   else
                            tbl [#tbl +1] = tostring(v) .. "\n"
   end
end
end
       end
--
tbl[#tbl +1] = i .. " } \n"
   end
---------------------
   dump(t,i)
tbl[#tbl] = i .. "}".. key_tbl_stateOS .. string.format("%.0f", ltime_str) .. "\n" --- !!! заменяется последняя фугурная скобка ---
return  table.concat ( tbl), no_unpack    ----- Результат: 1) строка ;  2)  количество значений, не представимых в текстовом виде  ----
end
-----
---- Преобразование сереализованной таблицы (строки) в таблицу Lua (десереализация)  --------------------
--- Результат:  таблица  Lua   ------
function string_to_tbl (str_tbl)
--    message (" string_to_tbl ", "return " ..  str_tbl )
   if str_tbl:find("{") == nil then return nil end  ---  если в строке str_tbl нет {
local tbl , err_tbl = load ("return " ..  str_tbl )         ----    assert (load_OS ( "retur " .. 4))   -- $$$$
   if  err_tbl ~= nil  then
message (" string_to_tbl ", "!!! Ошибка в синтаксисе таблицы:  "  .. str_tbl)  --- err_tbl)
return nil
end
return  tbl()
end
----
<code>
Кривые шибки в QLua
 
Цитата
Владимир написал:
3. Проверять на nil во всех таких "опасных" ситуациях - это, по крайней мере, не приведёт к вылету скрипта.
 Альтернативный вариант (может быть не единственный): использовать стандартные функции lua pcall или xpcall. Я не буду напрягать публику, как это можно использовать эти функции.

Цитата
Владимир написал:
Ну и не обращаться к техподдержке с пожеланиями что-либо исправить: в лучшем случае, останется всё как есть.
 Вы хотите совершенствоваться в своих программах. Но может и разработчик QUIK тоже хочет улучшать QUIK и QLua. Ну и пусть улучшают.
Кривые шибки в QLua
 
Цитата
nikolz написал:
В документации на Lua Вы можете прочитать, чтодлина массив #a  - не является действительной длиной, если в массиве есть дырки - nil
 Иногда вы отвечаете правильно :smile: , но, почти всегда, длинно. Зачем вы цитируете комментарии полностью?
  Я тут с друзьями поспорил на бутылку хорошего коньяка, которую мы, конечно же, вы-пьем вместе.
  Первый друг утверждает, что вы не способны выделить фрагмент текста и потому всегда копируете весь комментарий, на который есть ваша реакция.
  Второй утверждает, что вы интеллектуальный спамер-бот, котрый генериhetn тексты иногда похожие на то, что мог бы выдать посредственный IT- специалист.
  Я же думаю что вы человек, которому платят за то, чтобы вы переполнили базу форума.
       Большая просьба к вам: разрешить наш спор и написать кто из нас прав  :smile: , чтобы мы смогли, наконец, «раздавить» вожделенную бутылку.
Кривые шибки в QLua
 
Цитата
Старатель написал:
А ошибка похожа на вторую ошибку из сообщения  #105 .
Да. похоже на это.
Кривые шибки в QLua
 
Цитата
Старатель написал:
Щас все (или большинство функций) дают вам статическую копию состояния таблицы на момент обращения.
    Вот и пусть это подтвердит поддержка. В любом случае разработчик QLua должен обеспечить возможность корректной работы со стаканом.
Кривые шибки в QLua
 
Цитата
s_mike@rambler.ru написал:
вот интересно, откуда у вас эта уверенность)
 Присоединяюсь.
----
 Дело в том, что стакан обслуживается в потоке отличном от main и может быть ситуация, что при чтении таблиц bid/offer и их проверки на существование они есть, но при обращении к ним они удалены в потоке обслуживания стакана. Но, конечно, желателен разъясняющий комментарий поддержки QLua.
Не могу заставить работать функцию Subscribe_Level_II_Quotes()
 
1. Кроме Subscribe_Level_II_Quotes и Unsubscribe_Level_II_Quotes, есть функция
IsSubscribed_Level_II_Quotes
Функция позволяет узнать, заказан ли с сервера стакан по указанному классу и инструменту.
Формат вызова:
BOOLEAN IsSubscribed_Level_II_Quotes (STRING class_code, STRING sec_code)
Параметры:
• class_code – код класса;
• sec_code – код инструмента.
Функция возвращает «true», если стакан по классу class_code и инструменту sec_code уже заказан.
---
2. Посмотрите сайт https://quikluacsharp.ru/quik-qlua/poluchenie-stakana-iz-quik-v-qlua-lua/ ,  на котором обсуждается работа со стаканом.
Не могу заставить работать функцию Subscribe_Level_II_Quotes()
 
Цитата
Вася написал:
while not x do  
   sleep(10)    
end

Внутри цикла while переменная x не меняется. Если окажется not x эквивалентно true то цикл бесконечный.
Чудно считает CalcBuySell
 
Цитата
Владимир написал:
И в гробу я видел эту идиотскую CalcBuySell, равно как и "обработку ситуации отказа выставления заявки" - просто OnTrade не сработает, И ВСЁ!
   Я сам не использую CalcBuySell (моя стратегия торгов учитывает ограниченность средств), но QUIK написан не только под нас с вами и возможно кто-то эту функцию использует. Ну и пусть. Что вы так горячитесь  :smile: ?
Чудно считает CalcBuySell
 
В моем предыдущем сообщении фразу "Дмитрий написал:" читать как "Владимир написал:"
Чудно считает CalcBuySell
 
Цитата
Дмитрий написал:
Во-первых, за каким хреном мне нужно МАКСИМАЛЬНО возможное количество лотов в заявке? Во-вторых, откуда какая-то внешняя хреновина может знать, сколько МНЕ нужно лотов в МОЕЙ заявке?!
    При выставлении брокером вашей заявки, его программа всегда проверяет вашу состоятельность (ваши лимиты). Формулу лимитов вы можете посмотреть у брокера, но, как правило, она может зависеть от параметров, которые могут брокером определяться динамически.  Более того, ваши лимиты могут изменяться при выполнении ваших заявок (например, продажи ваших бумаг). Ваша заявка может быть отвергнута, если при ее выставлении будут исчерпаны ваши лимиты. Перед выставлением заявки следует либо проверять возможность ее выполнения (в заявленном объеме) используя функцию CalcBuySell, либо не проверять, но в любом случае обрабатывать ситуацию отказа выставления заявки. Функция CalcBuySell действительно лезет в ваш кошелек (а как можно понять что вы состоятельны), но она не выставляет заявок, а позволяет понять будет ли выставлена ваша заявка с указанными вами параметрами.
 Вы, конечно, можете сами считать свои лимиты, используя формулу брокера, но там присутствуют параметры, которые потенциально могут изменяться брокером. Поэтому, скорее всего ваши расчеты окажутся приблизительными.
Кривые шибки в QLua
 
Цитата
Старатель написал:
while
    Старатель дал развернутый ответ и за это ему спасибо.
 А где реакция поддержки? Где хотя бы ее спасибо Старателю?  Читает ли ведущий разработчик QUIK сообщения пользователей о ситуациях в QUIK хотя бы по «наводке» поддержки?
-----
  Старатель выложил, найденную им ошибку QLua аж 25.09.2020.
------
  Я выложил тест диагностирующий ошибку QLua 5.3  10.09.2021, который упростил 10.10.2021 до проявления ошибки с частотой в 1-2 минуты и локализации с точностью, что ха-рактерно  :smile: , до оператора while (смотрите https://forum.quik.ru/messages/forum10/message58500/topic5823/#message58500).
  И вот итог  :smile:  7.11.2021использования разработчиком QUIK выложенного мною теста (цитирую поддержку):
«Добрый день,
Мы рекомендуем отказываться от использования Lua 5.3 и переходить на Lua 5.4. Какие-либо доработки в Lua 5.3 не планируются.» (ссылка https://forum.quik.ru/messages/forum10/message59594/topic5823/#message59594)
 Как это можно назвать, не употребляя нецензурных слов?
 Где официальное подтверждение ARQA о том, что QLua 5.3 больше не поддерживается?
Кривые шибки в QLua
 
Цитата
s_mike@rambler.ru написал:
Если возникают проблемы, дело не в os.date, а в чем то другом. Испорчен стек вызовов, проблемы синхронизации или что угодно ещё. Грешить на луа не имеет смысла.
Согласен.
Цитата
TGB написал:
в тесте, представленном мною в этой ветке ( https://forum.quik.ru/messages/forum10/message58500/topic5823/#message58500 ) и демонстрирующем ошибку в QLua 5,3, с высокой частотой, при замене while на for, ошибка  не проявляется.
-----    Вопрос к разработчику QUIK: где гарантия, что существующая ошибка QLua 5,3  отсутствует в QLua 5,4?  
 Ответ поддержки, который уже прозвучал ранее: что QLua 5,3 не поддерживается ARQA не "катит".
Кривые шибки в QLua
 
Цитата
Старатель написал:
local Hour = tonumber((os.date('%H')))
   return Hour >= 10 and Hour < 22  -- тут возникла ошибка "attempt to compare number with nil"
   Эти вопросы, наверное, должна была задать поддержка, но когда она это сделает не-понятно.
 Просьба к Старателю, ответить на следующие вопросы:
1) Как часто это возникает?
2) Где это происходит (в потоке main? В колбеках?)?
  Если это возникает в main, то, как реализован цикл, в котором ошибка проявляется. Это: 1) while; 2) repeat; 3) for  или как-то иначе?  Вопрос «как реализован цикл?» возник, по той причине, что в тесте, представленном мною в этой ветке (https://forum.quik.ru/messages/forum10/message58500/topic5823/#message58500) и демонстрирующем ошибку в QLua 5,3, с высокой частотой, при замене while на for, ошибка  не проявляется.
-----
   Вопрос к разработчику QUIK: где гарантия, что существующая ошибка QLua 5,3  отсутствует в QLua 5,4?  
3) Есть ли возможность создать тест, в котором обнаруженная вами ошибка QLua 5.4 проявляется часто?
нужна помощь, атомизация рутинных операций в QUIK, нужна помощь (платная) в атомизации рутинных операций в QUIK
 
Цитата
Аркадий написал:
После решения первоочередных задач потребуется шустрая двунапрваленная связка с Visual Studio (или иное известное вам, но удобное нам решение) для автоматизации алертов с возможность интерактивной настройки кода на лету (собственно, внешний гуи для ввода параметров в  скрипт по возможности без перезапуска)  befulcrum@yandex.ru
     Не уверен, но возможно, вас может заинтересовать то, что мною представлено в ветке по ссылки https://forum.quik.ru/forum10/topic6198/. Я сейчас занят и со своей стороны, в текущий момент, я смогу только ответить на какие-то ваши вопросы (если они будут).
[BUG] Повышенная загрузка CPU при большом количестве функций в скрипте
 
Цитата
Владимир написал:
С "Титанником", кстати, тоже маразм: предположим, что эти придурки что-то предскажут с вероятностью 100% - и чего? Какой вообще толк от этой идиотской погремушки?
  Вы, что, еще не поняли, что фондовый рынок на текущий момент не существует? Это не моя жалоба: я в декабре 2021г. избавился от всех бумаг.
-----
Цитата
Владимир написал:
НАИКРУТЕЙШИЙ программист.  
 Наикрутейший алгоритмист и программист я  :smile: .  Но какая наивность в это поверит?
[BUG] Повышенная загрузка CPU при большом количестве функций в скрипте
 
Roffild
Мне кажется вы не вполне поняли меня.
Ключевой фразой является:
Цитата
TGB написал:
"титанник", практически, уже почти утонул   :smile:  .
[BUG] Повышенная загрузка CPU при большом количестве функций в скрипте
 
Интересно, временами, наблюдать битву титанов, когда "титанник", практически, уже почти утонул  :smile: .
Бесконечный цикл функции с заданным интервалом времени
 
Цитата
Владимир написал:
Далее, чтобы ни по одному поводу мявкнуть не посмели, разжёвываю код.
 Мявкну :smile:
----
  Несколько замечаний по выложенному вами скрипту.
1. loadstring в версиях QLua > 5.1  не существует. В этих версиях надо использовать load (это все QUIK версии >= 8.5).
2. Фрагмент:
if x%t[i]==0 then
   loadstring("f"..t[i].."("..i..")")();
end;
работоспособен только  в предположении того, что х непрерывная последовательность секунд.
  Кто гарантирует, что x=os.time() в приведенном коде всегда выдаст x+1 сек.? Даже если реакция на таймерные события message (……), то в операционной системе ПК могут возникнуть работы, требующие > 1 сек. и, тогда в последовательности x возникнут пропуски, потенциально приводящие к пропуску таймерных событий (возможно, важных для торговли).
3. Зачем в цикле используется loadstring (load в версиях QUIK >= 8.5)? Эта функция вызова программы Lua для трансляции строки в байт-код и хоть она выполняется быстро, зачем это делать? Конечно, если скрипт пишется только для себя, то его производительностью надо заниматься в последнюю очередь. Но, если есть понимание, то почему бы не реализовать более эффективный скрипт?
4. Для эффективности выполнения скриптов Lua везде, где это возможно, следует использовать переменные со спецификацией local.  Переменные со спецификацией local хранятся в стеке блоков Lua (обращении к ним – прямой, быстрый доступ). Переменные без спецификации local, это поля таблицы, которая хранится в служебной переменной _ENV (для версий Lua > 5.1) и обращение к ним, это обращение к полям таблицы с использованием ее индексов.  Это же относится и к спецификации создании функций Lua.
-----
С учетом выше приведенных замечаний, выкладываю модифицированный код вашего скрипта:
Код
local function OnStop()
 f=false;
end;

local function f4(i)
 message("Истёк интервал "..i.." сек");
end;

local function f17(i)
 message("Интервал "..i.." сек");
end;

local function f35(i)
 message("Обрабатываем интервал "..i.." сек");
end;

f=true;

function main()
 local x
 ----  Таймеры задаются в порядке увеличения их интервалов, в виде {<Интервал таймера>, <Функция обработки таймера>, <Вычисляемое время запуска функции>}
 t={{4, f4, 0}, {17, f17, 0},{35, f35, 0} }    -- Начальное состояние (можно задать и другое в третьей записи таймера). Можно добавлять таймеров (с разрешением 1 сек.) сколько надо --
 x=os.time()
 for i=1,#t do t[i][3] = x + t[i][1]  end
 message("Начало");
 while f==true do
   x=os.time();
   for i=1,#t do 
     if  x >= t[i][3] then 
    t[i][3] = x + t[i][1]   --- !! Если существенна обработка пропущенных интервалов, то:t [i][3] = t[i][3] + t[i][1]
         t[i][2]( t[i][1] )
     end
   end
   sleep(1000);
 end;
end;
Вы не можете заменить заявку ..., так как ее обработка еще не завершена.
 
Цитата
swerg написал:
потому и просят зайти через брокера
 Добавлю "пять копеек"
  Непосредственно биржей (например, ММВБ) обрабатываются только биржевые заявки: лимитные, рыночные, айсберги. Все условные заявки пользователей, в том числе изменение заявки, отрабатываются на сервере-QUIK  брокера с использованием биржевых заявок. Причем, чтобы не было необеспеченных биржевых заявок пользователя, это делается с учетом текущего состояния лимитов пользователя. На все это тратится вычислительный ресурс и сетевой трафик.
   Время выполнения заявок пользователя определяется интенсивностью входных потоков заявок пользователей брокера (а также общим объемом уже выставленных заявок), производительностью обработки биржевых заявок на бирже, производительностью железа (физического сервера), на котором выполняется сервер-QUIK  брокера, качеством используемой сети и качеством реализации сервера-QUIK.
   Проблема задержки выполнения заявок это, конечно, к брокеру.

P.S.
 Вообще то, одними из главных критериев качества любой программы, конечно же, являются: соответствие заявленной спецификации, а также ее надежность. Но, когда приходится видеть программы (в том числе и известных международных брендов), которые часто используются сотнями тысяч пользователями (с нетерпением, ожидающих свои результаты) и которые можно ускорить, иногда,  не в пять, а в 500 раз, за счет использования более эффективных алгоритмов (и это реализовывалось  практически), то, возникает ощущение, что с эффективностью многих существующих программ имеются большие проблемы. Что такое 500 раз? Это значит, что программа, выдающая результат спустя 8 минут, может выдать его через 1 секунду (при этом еще и энергия экономится  :smile: ).
[BUG] Повышенная загрузка CPU при большом количестве функций в скрипте
 
Цитата
Владимир написал:
TGB , Информация ПОЛНОСТЬЮ определяется ПРИЁМНИКОМ, так что Ваши фантазии насчёт "закомплексованного подростка" или "исключительного и неповторимого" есть только Ваши фантазии.   А я действительно взрослый НОРМАЛЬНЫЙ человек, и веду себя именно по-взрослому - у меня на сайте в описании моего "идеального стиля общения" давным-давно чёрным по белому написано
     Не хотелось мне это писать, но вынудили: «Горбатого исправит только могила».
[BUG] Повышенная загрузка CPU при большом количестве функций в скрипте
 
Цитата
Владимир написал:
у меня всего-то первый разряд когда-то был, но моя программа (точнее, наша с Юркой) всё-таки была двукратным чемпионом России и даже бронзовым призёром чемпионата мира в Лондоне, и имела не только гроссмейстерский рейтинг (2456 максимально), но и немало поверженных мастеров и гроссмейстеров в личных встречах. А тут какая-то сраная задача организации торговли на бирже - да тьфу! Это может быть проблемой разве что для распальцованных бездарей по кличке "гуру".

 Вы же, вроде, взрослый человек, а ведете себя как сильно закомплексованный подросток  :smile: .  Наверное, ~90% ваших комментариев, с многочисленными повторами, про то, какой вы исключительный и неповторимый. Вы что, в этом сомневаетесь? Да тут все исключительные и неповторимые, хотя бы по отпечаткам пальцев  :smile: . При этом, многие об этом скромно умалчивают :smile: .
[BUG] Повышенная загрузка CPU при большом количестве функций в скрипте
 
Цитата
Anton написал:
Тут ответ по форуму распределен в виде 1000 веток, где у одних мусор НЕ собирается, у других собирается прям из под рук, третьим самим неясно ничего, но они тоже за какую-нибудь движуху.
 И, конечно, разработчик QUIK не мог не добавить свои пять копеек :smile: .
------
Цитата
TGB написал:
Я уже как то писал: что чем меньше дергаешься, тем реже падаешь  . Кому это непонятно?
 Вам это понятно?
[BUG] Повышенная загрузка CPU при большом количестве функций в скрипте
 
Цитата
Anton написал:
Тратит, но не на каждом колбеке. По моим наблюдениям, не чаще раза в секунду, если его не подталкивать
 1. Из ваших комментариев следует (и я с этим согласен), что в текущем QLua:
     1) перед запуском колбека сборка мусора отключается;
     2) после запуском колбека сборка мусора включается;
     3) в неизвестном месте и в неизвестное время периодически делается уборка мусора.
 2. В своем комментарии 167 и повторно в 190 я предлагаю вообще при обработке колбеков оставить мусорщик в покое. Он в соответствии с параметрами, заданными по умолчанию (а может быть и пользователем) сможет автоматически собирать мусор как-нибудь сам. Зачем весь гемморой, перечисленный в пункте1? И мне интересен ответ разработчика QUIK.
    Я уже как то писал: что чем меньше дергаешься, тем реже падаешь :smile: . Кому это непонятно?
[BUG] Повышенная загрузка CPU при большом количестве функций в скрипте
 
Цитата
Anton написал:
Квик как-то там прибирается и молодец и флаг ему в руки.
 И не тратит на это никаких вычислительных ресурсов?
Страницы: Пред. 1 2 3 4 5 6 7 8 9 10 11 ... 13 След.
Наверх