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

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

Страницы: 1 2 3 4 5 6 7 8 9 10 11 След.
QIUK 9.8.0.11 выходит при attach MSVC 2019 debugger - защита или проблема?
 
Цитата
Variable написал:
защита или проблема?
  Поддержка отвечала что это защита.  Но если при этом не выдается внятная диагностика, то это ошибка QUIK (в части выдачи сообщений диагностики).
Кривые шибки в QLua
 
Цитата
Даниил Волошин написал:
разбор проблемы продолжается. Как только работы будут завершены, мы отправим Вам соответствующее уведомление.
  Первый раз я относительно проблемы написал 05.07.2022. До сих пор разработчик не понял мною написанное и стесняется  :smile:  задать вопросы?
Кривые шибки в QLua
 
Цитата
Даниил Волошин написал:
К сожалению, по присланным данным нам не удалось установить причину ошибки.Мы продолжаем изучение вопроса по Вашему обращению. Как только работы будут завершены, мы отправим Вам соответствующее уведомление.Приносим извинения за причиненные неудобства.
   Разработчики QUIK читали мой комментарий: https://forum.quik.ru/messages/forum10/message64871/topic5823/#message64871 ?   В нем детально описано: функция tonumber для случая многопоточного использования Lua, как это делается в QUIK, реализована некорректно. Что в моем комментарии непонятно разработчикам QUIK?
getParamEx
 
Цитата
Владимир написал:
Я не нашёл тип данных integer ВООБЩЕ! И как же мне работать с битовыми масками? Как на Lua реализуется конструкция вида:if (iData & 0x80) { blah-blah-blah }?
  Элементарно, "Ватсон"  :smile: .
Пример:
Код
local a =129.0
if (math.tointeger(a) & 0x80) == 128 then   ---  0x80 это 128 в десятичном исчислении
    message ("С битами можно работать.")
end 
Отписка callback`а SetUpdateCallbackcallback - отписывает ВСЕ заказы, Отписка callback`а SetUpdateCallbackcallback - отписывает ВСЕ заказы
 
Вообще говоря, модель случайных процессов не подходит к поведению фондового рынка. Это вам не безликие физические процессы. Здесь бы больше подошла модель толпы, жаждущей получить прибыль (рождение и падения фондовых рекурсивных,  неустойчивых «пирамид»). Но сносной модели такой толпы пока не построено и, скорее всего, построено не будет. Поэтому (на без рыбье и рак рыба) участники фондового рынка вынуждены использовать стохастику на различных индикаторах, добавляя  поиски корреляции с экономическими, политическими событиями, и, почти единственный, но расплывчатый закон: если есть большой рост (какой??), то можно ожидать падение, а если падение (какое??), то есть шансы на рост. Причем, поведение рынков со временем меняется, так как меняется среда, в которой они существуют (в том числе меняются и ее участники).
   Какие индикаторы рынка лучше, спор бессмысленный вне контекста их использования в торговых стратегиях. А единственным критерием качества торговой стратегии (возможно меняющейся со временем) и полезности ее индикаторов  является реальная прибыль автора стратегии.  В том, что можно «выжать» из истории цен торгов, скорее всего, существует  некий предел полезной информации, который невозможно преодолеть никакими вычислительными мощностями и который наступает достаточно быстро.
debugging для терминала ^9
 
Цитата
Владимир написал:
Я отказался от всех дебаггеров ещё лет 40 назад, по той простой причине, что они сами глючат.
 Действительно, для быстрой отладки, в подавляющих случаях, требуются мозги и продуманная отладочная печать, порождаемая ими. Но, "40 назад" это слабый аргумент. Средства отладки это сложные программы, в которых может быть много ошибок. Но 40 лет большой срок, и за это время появились, отлаженные многочисленными пользователями, достаточно приличные средства отладки. В этом я убедился, когда пришлось привлекать отладочные средства (редкий для меня случай) для анализа ситуации в многопоточной программе на C#.
Кривые шибки в QLua
 
Цитата
TGB
   TGB написал: Если написанное мною в комментарии #177 правильное, то причина понятна и понятно как ее можно исправить.  Пусть разработчик QUIK объяснит, в чем я ошибаюсь.
   Alexey Danin  написал:  пасибо, передали информацию разработчикам.
------
 TGB написал:  Долгое молчание: знак согласия с тем что я написал (дважды)?
 У меня вопрос к поддержке (простой, но, скорее всего, риторический).
 У каждого приличного IT-разработчика, как правило, существует в поддержке инструкция по работе с пользователями. Надеюсь что такая есть у ARQA и она не секретная.
 Мне хотелось бы на нее посмотреть.     Как это можно сделать?
Эмуляция крон внутри lua
 
Цитата
Андрей написал:
Может кто-нибудь подсказать или ткнуть в раздел документации где про этом можно почитать?

Код варианта реализации таймера:
Код
-------------                                    #### !! Вариант реализации таймерных событий            ----
function OnStop()
 isRun=false
end;

local function f1(i)       -- функция обработки таймерных событий ---
 message("Обрабатываем интервал  1:  "..i.." сек")
end;

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

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

isRun=true;

function main()
 local x
 ----  !! Таймеры задаются в виде таблицы {<Интервал таймера (в секундах) >, <Функция обработки таймера>, <Вычисляемое время запуска функции>}
 t={{4, f1, 0}, {17, f2, 0},{35, f3, 0} }    -- Начальный запуск таймера можно задать в третьем элементе таймера. Можно добавлять таймеров  сколько надо --
 x=os.time()
 for i=1,#t do t[i][3] = x + t[i][1]  end
 message("Начало работы")
 while isRun 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(100)  -- разрешение таймера млсек.  ---
 end
end
Кривые шибки в QLua
 
Цитата
Владимир написал:
TGB , Нет, у меня другая гипотеза
 Ну, возможно я ошибаюсь, и ваша гипотеза больше объясняет  :smile: .
Кривые шибки в QLua
 
Цитата
nikolz написал:
У меня всего одна гипотеза относительно почему они мудаки.
  "одна гипотеза" - только у бота бывает. Были какие то сомнения и все-таки это грубый бот  :smile: . Это не лечится.
Кривые шибки в QLua
 
Цитата
Владимир написал:
он есть неграмотный дурак.  
 Относительно nikolz у меня существовали разные гипотезы (в том числе и то, что это человек), но я все более склоняюсь, что это полу-интеллектуальный бот-спамер  :smile: . Что удивительно так это то, что он иногда, редкими местами, пишет вразумительные вещи. Слава создателю этого бота  :smile: .
 Я бы не стал его комментировать, но он часто выкладывает тексты, вносящие смуту в неокрепшие умы: типа его сентенции в сообщении #181. Конечно, каждый читающий сообщения, наверное, определит сам, где туфта, но, как представляется мне, этот бот постоянно производит информационный мусор (возможно, со злонамеренной целью переполнения базы форума  :smile: ).
Кривые шибки в QLua
 
Цитата
nikolz написал:
У меня например более 20 патентов, а  как с этим у  Вас?
   С этого места, пожалуйста поподробнее.
Выложите список своих патентов с их кратким описанием и с указанием всех реквизитов, обеспечивающих  проверку их существования.
Кривые шибки в QLua
 
Цитата
nikolz написал:
Вы ошибаетесь в главном:Разработчики библиотеки QLUA не являются разработчиками VMLua, в исходниках которой вы ковыряетесь.Поэтому все Ваши вопросы про  base_funcs (Lua 5.4.1), не по адресу.
   Похоже, вы ничего никогда не разрабатывали. Нормальный разработчик отвечает за свою разработку независимо от того что он при этом использует. А ненормальный будет рассказывать что у него не работает из того чем он пользуется (например, "кривой" головой). В этом форуме вы пишите лишь бы как то наследить :smile: .
Кривые шибки в QLua
 
Цитата
Alexey Danin написал:
Цитата TGB написал:Если написанное мною в комментарии #177 правильное, то причина понятна и понятно как ее можно исправить.  Пусть разработчик QUIK объяснит, в чем я ошибаюсь.
Спасибо, передали информацию разработчикам.
  Долгое молчание: знак согласия с тем что я написал (дважды)?
ParamRequest и CancelParamRequest в индикаторах, ACCESS VIOLATION
 
Цитата
Karina Dmitrieva написал:
Действительно метод OnCalculate может срабатывать не один раз при изменении параметров индикатора. Данная проблема будет устранена в одной из очередных версий ПО.Приносим извинения за причиненные неудобства.
  При этом, наверное, надо учесть комментарий s_mike@rambler.ru: https://forum.quik.ru/messages/forum10/message65184/topic7529/#message65184
Кривые шибки в QLua
 
Если написанное мною в комментарии #177 правильное, то причина понятна и понятно как ее можно исправить.
 Пусть разработчик QUIK объяснит, в чем я ошибаюсь.
Кривые шибки в QLua
 
Цитата
Alexey Danin написал:
Извиняемся за столь длительную задержку с ответом, к сожалению, нам не удалось ни установить причину описанной в сообщении -  https://forum.quik.ru/messages/forum10/message59792/topic5823/#message59792  проблемы, ни воспроизвести.
  Вы, все-таки, покажите разработчикам это:
Цитата
TGB написал:
Этот комментарий пишу, в основном,  для разработчика QUIK.
1. При открытии библиотеки base_funcs (Lua 5.4.1), в которой находится tonumber, все ее функции помечаются как С-функции. Это означает, что в программе Lua они выполняются в скобках: lua_unlock(L);    Запуск C-функции;    lua_lock(L);      
 Такие функции могут выполняться параллельно с исполнением  QLua-кода. Однако любые операции с использованием в них L, должны выполняться в синхронизирующих скобках:  lua_lock(L);    Выполнение операций в L;     lua_unlock(L);      
 При просмотре исходника функции tonumber (с учетом вызываемых в ней функций), я обнаружил, что в этой функции есть как минимум один фрагмент с использованием операций в L без синхронизирующих скобок (мои комментарии помечены в исходнике символами #####).
 !!!   lua_stringtonumber вызывается в tonumber:
LUA_API size_t lua_stringtonumber (lua_State *L, const char *s) {
 size_t sz = luaO_str2num(s, s2v(L->top));   //  ##### ? используется L без синхронизирующих скобок
 if (sz != 0)
   api_incr_top(L);                                      //  ##### ? используется L без синхронизирующих скобок
 return sz;
}
    Возможно, что-то я упустил, но пусть это проверит разработчик QUIK.
 И дополнительно:
Цитата
TGB написал:
Не факт, что обнаруженная сложная ошибка (синхронизации) относится только к tonumber. Существующая реализация разработчиком Lua стандартных C-функций Lua (5.4.1) архитектурно не учитывает многопоточность использования Lua. Для выполнения любых операций в таких функциях с элементами, хранящимися в lua_State, надо было сделать доступным только API-C, но этого не сделано.
Кривые шибки в QLua
 
Павел Bosco, видно, что вы хотите разобраться в том, как функционирует QLua. Но я не вижу вашей реакции на мой комментарий:
Цитата
TGB написал:
Из того, что написано, можно понять, что ваши клиентские потоки запущенные на С++ кодах используют (под синхронизацией) общий lua_State, выполняя фрагменты Lua-кода. .....
Что я не понял в вашей схеме обработки клиентских потоков?  Какие у вас есть возражения против предлагаемых мной изменений вашей схемы обработки клиентских потоков?
Кривые шибки в QLua
 
Цитата
Павел Bosco написал:
понял о чём вы начинали говорить с Anton
  Мне жаль, что Anton перестал с какого-то времени выкладывать свои комментарии. Были ситуации когда мы с ним жестко дискутировали и, наверное, я его иногда обижал. Но я всегда считал. что он много делал полезного для улучшение QUIK и для его пользователей.
Кривые шибки в QLua
 
Цитата
Павел Bosco написал:
Поясню - у меня в main крутится диспетчер входящих клиентских соединений, создающий дополнительные потоки для каждого клиента. Все клиенты работают через единый lua_State, обрамлённый CriticalSection.Всё работает, не падает, но в целях стабильности и скорости, мне приходится держать Quik свёрнутым. Потому что время сервера начинает дико отставать при отрисовке графики. И я подозреваю (да, обобщение, увы) что дело в каких-то блокировках, которые, возможно создаёт мой скрипт, делая что-тоо не так.
 Из того, что написано, можно понять, что ваши клиентские потоки запущенные на С++ кодах используют (под синхронизацией) общий lua_State, выполняя фрагменты Lua-кода. Тем самым эти потоки вмешиваются в существующую схему работы QLua, предполагающую использование QLua-кода только в потоке main и в основном потоке обработки колбеков. Без кода не понять что у вас делается, но вариант близкий к тому что у вас есть, но минимизирующий вмешательство в схему работы QLua мог бы быть следующим (опять гипотеза :smile: ). Между потоком main  и клиентскими потоками создаются (для каждого), очередь на прием и очередь на передачу. Взаимодействие потока main и клиентских потоков происходит через такие очереди (синхронизируемые). Поток main обслуживает клиентские потоки, взаимодействуя с QUIK. При этом обеспечиваются условия для параллелизма работы с клиентами и нет вмешательства клиентских потоков в схему работы QLua.
Кривые шибки в QLua
 
1.
Цитата
Владимир написал:
Нафига вам всё это нужно, господа? Я потратил недели две, чтобы вынести всё, что можно, в поток main и уже практически забыл про вылеты скрипта или отвисания Квика.
   Вы забыли про вылеты и отвисания потому, что усилиями разработчика QUIK и его пользователями было вычищено много глюков (в том числе и ошибок снхронизации). Иначе вылетали бы и отвисали до сих пор.
   Я хорошо знаю как строить устойчиво работающие программные системы, функционирующие в неустойчивых средах (в том числе аппаратных), но когда вижу "корявую" среду, которую можно улучшить, то почему бы это не делать?

2.
Цитата
Павел Bosco написал:
вопрос, как увидеть существование блокировки при вызове quik lua api для меня остался открытым.
   У меня встречный вопрос: Если вам нужно просто реализовать своего робота, а не выполнять научно-исследовательскую работу  :smile: , то зачем вам нужны потоки и прочая "лабуда"? Пишите своего робота на QLua, как советует Владимир, стараясь обходиться даже без внешних библиотек. Это хороший совет для всех и, особенно, для начинающих.
Кривые шибки в QLua
 
Цитата
TGB написал:
Цитата Павел Bosco  написал:
хотелось бы понять, c-closure и c функция это одно и тоже или нет. или другими словами, что имеется в виду под с функцией.  
Да.
Уточнение: ответ дан относительно синхронизации при многопоточном использовании Lua.  Чем отличаются замыкания от обычных функций можно прочесть в интернете.
Кривые шибки в QLua
 
1.
Цитата
Павел Bosco написал:
есть реальный факт что ваши пожелания заставили разработчиков что-то сделать и сменить версию?
  Реальным фактом является то, что ошибка синхронизации в QLua существовавшая, по крайней мере, с мая 2020г., была исправлена через три дня после того как я выложил код, который, по моему мнению (опять расплывчато  :smile: ), мог ее исправить.  Реальным фактом является, что после исправления этой ошибки разработчиком QUIK был изменен номер версии.
2. Вы. похоже, не поняли, что у разработчика QUIK не принято признавать свои ошибки (если они это как-то могут скрыть) и благодарить пользователей за найденные ими баги.
3.
Цитата
Павел Bosco написал:
хотелось бы понять, c-closure и c функция это одно и тоже или нет. или другими словами, что имеется в виду под с функцией.
  Да.
Кривые шибки в QLua
 
Цитата
Павел Bosco написал:
почитал пару листов, у вас там очень обобщающие рассуждения "похоже, что" "скорее всего", основанные на ваших собственных наблюдениях и тестах.
 1. Категорические заявления высказывают обычно дилетанты.

 2. Вы пропустили в первом же комментарии аж восемь пунктов совершенно конкретного кода на C++ демонстрирующего как правильно модифицировать исходники Lua для многопоточного использования.  

 3. Вы, похоже (заметьте  :smile: , не утверждаю что точно), не поняли, что после моего комментария разработчики QUIK исправили глобальную ошибки синхронизации в QLua и, что характерно  :smile: , сразу после этого сменили номер версии QUIK c 8..  на 9...

 4. Давать советы не видя вашего кода и не имея на это время я не способен.
Кривые шибки в QLua
 
Цитата
Павел Bosco написал:
вы как-то анализировали устройство Qlua? Или это догадки?
  Почитайте комментарии начиная с https://forum.quik.ru/messages/forum10/message54696/topic6356/#message54696
Кривые шибки в QLua
 
Цитата
Павел Bosco написал:
в 5.4.2 Lua есть такой код
Код
#if !defined(lua_lock)
#define lua_lock(L)   ((void) 0)
#define lua_unlock(L)   ((void) 0)
#endif
то есть эти "скобки" ничего не делают на самом деле.
 Этот код  заготовка для использования в нескольких потоках и ничего не делает в однопоточном Lua. Qlua многопоточный из-за выбранной ARQA архитектуры обработки колбеков в отдельном "основном" потоке. Поэтому разработчик QLua заменяет эту заготовку на свои функции синхронизации доступа к коду Lua из нескольких потоков.
 При том, что в запущенном на выполнение скрипте пользователя существует поток main, коды колбеков этого скрипта выполняются в отдельном "основном" потоке. Но все участки кода Lua (за исключением кодов C-функций Lua) используются в режиме разделения, то есть под синхронизацией, при которой только один может исполнять такой код. Таким образом в QLua параллелизм может возникать (если так сложится) только на кодах C-функций Lua (хоть в main, хоть в колбеках).
ParamRequest и CancelParamRequest в индикаторах, ACCESS VIOLATION
 
Цитата
nikolz написал:
В моем примере, повторный вызов приведет к отправке транзакции  с другим id  на 1 большетак как id увеличивается в следующем операторе после транзакции.  
 В выложенном фрагменте вашего скрипта этого нет.
ParamRequest и CancelParamRequest в индикаторах, ACCESS VIOLATION
 
Все-таки:
Цитата
TGB написал:
Зачем двойная последовательность вызов функции OnCalculate(index)?
  Вопрос задан две недели назад.
  Выложен код демонстрирующий ситуацию.
  В ветке по ссылки https://forum.quik.ru/messages/forum10/message64619/topic7524/#message64619 мучается пользователь.

 Где ответ поддержки?
ParamRequest и CancelParamRequest в индикаторах, ACCESS VIOLATION
 
Цитата
TGB написал:
Зачем двойная последовательность вызов функции OnCalculate(index)?
  Это вопрос к поддержке.
  Что это за ноу-хау? Нельзя ли обойтись без повтора?
ParamRequest и CancelParamRequest в индикаторах, ACCESS VIOLATION
 
Цитата
Старатель написал:
При добавлении / удалении индикатора возникают ошибки:
Function OnChangeSettings: ACCESS VIOLATION at address 000007FC524B89CCACCESS VIOLATION at address 000007FC524B89CC
  Такое сообщение об ошибках - это ошибка QUIK независимо от текста кода скрипта, порождающего это сообщение.  Если есть ошибка при использовании интерфейсных функций QUIK, то должны выдаваться понятные большинству пользователям сообщения об его ошибке.

2.   QUIK 9.7  Qlua 5.4
Индикатор:
Код
Settings={}
Settings.Name = "minimal"
function Init()
   return 1
end
local ind = {}
function OnCalculate(index)
  if not ind[index] then 
     ind[index] = 100
  else
     ind[index] = ind[index] + 100
  end  
  return ind[index]
end

Зачем двойная последовательность вызов функции OnCalculate(index)?:
1) index:  1, 2, 3  ….
2) index:  1, 2, 3  ….
И это, похоже, происходит в любых индикаторах.
Добавляйте в любой график, меняете, например, толщину линии и убеждайтесь.
Кривые шибки в QLua
 
Цитата
Старатель написал:
Вероятность возникновения nil не исключает, но значительно снижает.
 Это хорошее решение, если при возникновение nil не возникает других последствий и не нарушается последующее функционирование скрипта.
Кривые шибки в QLua
 
Цитата
TGB написал:
при неявных преобразованиях строк в число будет вызываться прежняя (потокоопасная) функция.
  Например, в выражении:    i = 6 + '100'   ---  (результат число 106)  будет вызвана прежняя функция tonumber.
  -----
  Существующая схема встраивания Lua в QUIK давно (я это наблюдаю с мая 2020г., а началось гораздо раньше) создает много проблем пользователям и разработчикам QLua. Само по себе, использование Lua это, с учетом IT-квалификации большинства пользователей QUIK, хорошее решение, но идея, запуска колбеков в скриптах пользователя в отдельном потоке, плохая. В этой схеме параллелизма выполнения в скрипте пользователя, при использовании только Lua, все равно нет, но есть почти все сложные проблемы многопоточного программирования, создающие нестабильность работы скриптов, даже если пользователь об этом не знает.  Кому это надо?
  В своем комментарии https://forum.quik.ru/messages/forum10/message64087/topic5823/#message64087
в п.3 я написал, как надо бы встраивать Lua в QUIK с тем, чтобы проблем многопоточности скриптов не было. Это, конечно, не отменяет проблем интерфеса скриптов с QUIK.
Кривые шибки в QLua
 
Цитата
Старатель написал:
виновник однозначно - tonumber. Но тут надо отметить, что у меня трудится много скриптов в нескольких квиках, а ошибка за неполный день возникла пока только в одном.
    Не факт, что обнаруженная вами сложная ошибка (синхронизации) относится только к tonumber. Существующая реализация разработчиком Lua стандартных C-функций Lua (5.4.1) архитектурно не учитывает многопоточность использования Lua. Для выполнения любых операций в таких функциях с элементами, хранящимися в lua_State, надо было сделать доступным только API-C, но этого не сделано.  Выяснять потокобезопасность каждой такой функции, анализируя ее исходники это, конечно, не решение.
---------
 Когда обсуждаемая ошибка будет устранена разработчиком QUIK неизвестно. Поэтому конкретную проблему с tonumber вы, наверное, могли бы решить следующим образом:
написать в каком-нибуть своем C-пакете собственную, но потокобезопасную функцию tonumber_с, аналогичную tonumber, и в начальном запуске сриптов выполнять перегрузку tonumber = tonumber_с.   Здесь, правда, существует засада: возможно, при неявных преобразованиях строк в число будет вызываться прежняя (потокоопасная) функция.
Lua 5.4
 
Цитата
s_mike@rambler.ru написал:
Проблема в том, что loadbuffer  выдает ошибку
 -----
Цитата
TGB написал:
То ваша функция forLua_xx_test  работает в 5.4 в QUIK 9.5.0.42
Это я проверил 15 минут назад.  Почему у вас не работает непонятно.
Lua 5.4
 
Цитата
s_mike@rambler.ru написал:
Может, кто то пальцем сможет указать направление в пустыне?

Если ваш код Имя_dll.dll оформлен следующим образом (Имя_dll и Имя_пакета_dll это идинтификаторы в латинской кодировке):
Код
.........................

static int forLua_xx_test(lua_State* L)    //  Ваша функция ---
{

   ............
}
 
//=== Регистрация реализованных в dll функций, чтобы они стали "видимы" для Lua ================================//
static struct luaL_Reg ls_lib[] = {
   { "xx_test", forLua_xx_test },
   { NULL, NULL }
};

extern "C" LUALIB_API int luaopen_Имя_dll>(lua_State *L) {   // !!!  luaopen_<Имя пакета>
   lua_newtable(L);
   luaL_setfuncs(L, ls_lib, 0);
   lua_pushvalue(L, -1);
   lua_setglobal(L, "Имя_пакета_dll");  // !!!  lua_setglobal(L, "<Имя пакета>");
   return 0;
}
 


А вызов в QLua:
Код
require('Имя_dll')

message("result=" .. tostring(Имя_пакета_dll.xx_test("message('hello world!!',3)")))


То ваша функция forLua_xx_test  работает в 5.4 в QUIK 9.5.0.42
Кривые шибки в QLua
 
Цитата
nikolz написал:
для особо тупых:
 1) вы так и не научились выделять фрагменты текста?
 2) объясняю:  мусорщик Lua не является потокобезопасным, и при его запуске на любом lua_State, он может обрабатывать и все остальные lua_State запущенного скрипта. Таким образом оба потока могут писать в одну и туже область памяти.
-----------------------------------
 
Цитата
nikolz написал:
Что такое (нативный) Lua ?
  Читайте:
Цитата
TGB написал:
однопоточный (нативный) Lua
Кривые шибки в QLua
 
Цитата
s_mike@rambler.ru написал:
Все что вы пишете в п3 очереди и прочие слипы можно сделать средствами луа без каких либо затруднений
  У меня все это сделано.
Ключевым п.3 является:
Цитата
TGB написал:
Существует вариант построения архитектуры встраивания Lua в QUIK, в которой можно использовать однопоточный (нативный) Lua :
и
Цитата
TGB написал:
Подключение новых версий Lua станет в описанной выше архитектуре рутинной задачей. Исчезнут все проблемы, вызванные текущей многопоточностью QLua.
Кривые шибки в QLua
 
Цитата
Старатель написал:
Думал такие ошибки возникают только в QUIK 9. Но нет, сегодня в QUIK 8.13 случилась аналогичная ошибка.QUIK clients support, надо что-то делать. Не хочется все места с tonumber параноидально обкладывать проверкой на nil.

      Этот комментарий пишу, в основном,  для разработчика QUIK.

1. При открытии библиотеки base_funcs (Lua 5.4.1), в которой находится tonumber, все ее функции помечаются как С-функции. Это означает, что в программе Lua они выполняются в скобках:
lua_unlock(L);    Запуск C-функции;    lua_lock(L);
    Такие функции могут выполняться параллельно с исполнением  QLua-кода. Однако любые операции с использованием в них L, должны выполняться в синхронизирующих скобках:
 lua_lock(L);    Выполнение операций в L;     lua_unlock(L);
     При просмотре исходника функции tonumber (с учетом вызываемых в ней функций), я обнаружил, что в этой функции есть как минимум один фрагмент с использованием операций в L без синхронизирующих скобок (мои комментарии помечены в исходнике символами #####):
Код
//   ####  lua_stringtonumber вызывается в tonumber  (luaB_tonumber)
LUA_API size_t lua_stringtonumber (lua_State *L, const char *s) {
  size_t sz = luaO_str2num(s, s2v(L->top));   //  ##### ? используется L без синхрони-зирующих скобок
  if (sz != 0)
    api_incr_top(L);                                      //  ##### ? используется L без синхронизирующих скобок
  return sz;
}

    Возможно, что-то я упустил, но пусть это проверит разработчик QUIK.
    ----------
2. Есть общая проблема в реализации стандартных функций Lua для многопоточного использования, описанная в моем комментарии: https://forum.quik.ru/messages/forum10/message57243/topic6555/#message57243
-------
3. Существует вариант построения архитектуры встраивания Lua в QUIK, в которой можно использовать однопоточный (нативный) Lua :
1)    вместо регистрации функций обратного вызова, регистрация соответствующих очередей событий (возможно, с теми же именами);  
2)    вместо sleep, использование служебной функции ожидания либо истечения интервала времени (как в sleep), либо появления данных в очередях событий (с выдачей списка непустых очередей);
3) добавление функции чтения очередей событий (их параметров);
4) реализация функций интерфейса c QUIK в виде отдельного пакета dll, подключаемого в Lua.
      Подключение новых версий Lua станет в описанной выше архитектуре рутинной задачей. Исчезнут все проблемы, вызванные текущей многопоточностью QLua.
Отладка QUIK 8.13
 
Если бы вы это не написали:
Цитата
Владимир написал:
Тут как бы пару порядков по скорости не набежало!
 то мне комментировать было бы нечего.
 А так у меня есть предложение как ускорить то, что у вас уже есть.
    Не надо обрабатывать OnTrade. Четвертьсекундный обработчик - ничего не ищет, а просто забирает только вновь появившиеся заявки из таблицы orders а далее как у вас описано но без обработки вашего стека.
Отладка QUIK 8.13
 
Цитата
Владимир написал:
И одно это уже даёт порядок по скорости.
   Интересно где этот порядок по скорости?
   Сначала, по колбеку вы заносите данные колбека в свой стек, а затем, наверное, по какому-то таймеру обрабатываете свой стек. И где в таком случае порядок по скорости?
Отладка QUIK 8.13
 
Цитата
Владимир написал:
А меня не устраивает, что таблица пухнет.
  Хотите вы это или нет таблица все равно пухнет  :smile:
Отладка QUIK 8.13
 
Цитата
Владимир написал:
А таблица с течением времени только пухнет, данные там тоже недостоверные, да ещё и всё более затратный поиск. Нафиг нужно такое счастье?
    Ну и пусть таблица пухнет. Вы знаете, что данные в ней более недостоверные, чем колбеки? Откуда все более затратный поиск в ней, если можно обрабатывать только вновь поступившие ее элементы (между циклами ее обработки)?
    Я не утверждаю, что заявки и сделки надо обрабатывать именно предлагаемым мною способом. Это, всего-навсего, альтернативный и вполне работающий вариант, избавляющий от обработки промежуточных колбеков. В принципе, чем меньше разных колбеков вы используете (при этом решая свои задачи), тем потенциально надежнее ваш скрипт.
Отладка QUIK 8.13
 
Заинтриговали:
Цитата
Владимир написал:
Я несколько раз писал здесь, почему я использую именно OnTrade и крайне редко заглядываю в orders, повторяться лень, так что если интересно, покопайтесь в моих сообщениях.
  Из того, что вы писали я это не понял. Поэтому, пожалуйста, объясните, чем вам не подходят данные из таблиц orders (Заявки) и trades (Сделки), если вы будете их проверять с некоторой периодичностью. В этих таблицах хранятся не какие-то «прерывания», а  выполненные биржей операции (выставленные заявки и выполненные сделки).  Или вам интересно «кувыркаться» с «сырыми» «прерываниями - колбеками», которые то приходят, то не приходят?
Отладка QUIK 8.13
 
Цитата
Владимир написал:
Коротко: я считаю этот вариант самым оптимальным.
 А что же жалуетесь на нестабильность  :smile: ?
Отладка QUIK 8.13
 
1.
Цитата
Владимир написал:
Вот полный код моего обработчика:Код
function OnTrade(n)
local i;
i=a[0][7][0]+1; -- новый размер стека сделок из прерывания
a[0][7][0]=i; -- записываем изменение
a[0][7][i]={}; -- заводим новый элемент стека
a[0][7][i][0]=n.trans_id; -- ID транзакции
a[0][7][i][1]=n.order_num; -- ID заявки
a[0][7][i][2]=n.trade_num; -- ID сделки
a[0][7][i][3]=n.sec_code; -- ID тикера
a[0][7][i][4]="B"; -- по умолчанию это покупка
if bit.band(n.flags,4)~=0 then a[0][7][i][4]="S";end;
a[0][7][i][5]=n.qty; -- объём сделки в лотах
a[0][7][i][6]=n.price; -- цена сделки
end;
  Зачем вы заводите новый элемент стека, когда можно было сделать так:
Код
function OnTrade(n)
local i;
i=a[0][7][0]+1;   -- новый размер стека сделок из прерывания
a[0][7][0]= i;   -- записываем изменение
a[0][7][i]= n;   -- записываем таблицу из OnTrade
end;

Вы любите писать длинные и неэффективные программы  :smile: ?
-----
 Вместо непонятных числовых индексов можно бы было использовать более содержательные текстовые ключи, например: «Тикер», «История сделок» и т.д. Читабельность вашей программы улучшилась бы, а ее эффективность практически не изменилась. Если насчет эффективности у вас есть сомнения,  то проведите эксперименты.
----
 Зачем вы вообще «обрабатываете» OnTrade, когда можно бы было периодически (по таймеру) просматривать таблицы  orders (Заявки) и trades (Сделки), в которых отображается готовые состояния по выполнению ващих транзакций ?
--------------------------------------
2. Зачем вы наезжаете на swerg?
 Он действительно сообщил существенную информацию (мне, например, она была неизвестна) и за это ему спасибо.
Отладка QUIK 8.13
 
Цитата
TGB написал:
4. В файле   lvm.с  после строки:  StkId ra;  /* instruction's A register */   добавить:    
int const Период_переключения_State = 1000;  
if (++L->Счетчик_для_переключения_State > Период_переключения_State) {    
    L->Счетчик_для_переключения_State = 0;    
    //  ! Имитация вызова "пустой" C-функции  --      
    ProtectNT((lua_unlock(L), lua_lock(L)));  
}
    Строка:  ProtectNT((lua_unlock(L), lua_lock(L)));  ошибочна (выяснилось при длительном, недельном тестировании) и ее  следует заменить
    на строку:  savestate(L, ci), lua_unlock(L), lua_lock(L), updatetrap(ci);
Отладка QUIK 8.13
 
Цитата
Владимир написал:
nikolz , Так что же такое "длинный цикл"? Гугл тоже не знает: по запросу выдаёт ссылки на менструальый цикл. Но что бы это ни было, лапуль, он спрашивал: "Где вы увидели МОЙ код с длинным циклом?", а Вы привели его цитату про блокировку потоковв QUIK выполнением длинного цикла ПОЛЬЗОВАТЕЛЬСКОЙ ПРОГРАММЫ.
  Длинный цикл на «чистом» Lua - это сленг данной ветки, обозначающий долго выполняющийся фрагмент скрипта, в котором нет вызовов C-функций. Например, sleep  это С-функция. С -функциями являются функции из стандартного пакета Lua и многие функции из подключаемых C-пакетов.
 Простейшим примером длинного  цикла на «чистом»  Lua может быть следующий фрагмент кода:
for   i = 1, 5000000000 do    end  
 Если вы вставите этот цикл в свой скрипт сразу после function   main (), то увидите, что пока этот цикл исполняется, ваш терминал полностью «подвиснет» и вы не сможете  даже остановить свой скрипт.
 Приведенный пример, конечно, искусственный, но кто запрещает пользователю написать содержательный фрагмент кода без использования C-функций и исполняющийся достаточно долго.
 Такое «подвисание» QUIK, по-хорошему, надо бы устранить, но, с учетом того что такие ситуации, наверное, редкие, а их устранение – правка сложной виртуальной машины Lua разработчиком QUIK,  то я все больше склоняюсь к тому, что это тот случай, когда можно оставить это как есть.
--------------
   Вы точно отметил: nikolz досих пор не понял, что у меня ник TGB, а не «пользователь».
Отладка QUIK 8.13
 
Цитата
nikolz написал:
Рассуждая о "чистом" луа Вы полезли  в функции СИ , которые исполняют этот чистый луа, вместо того, чтобы  написать грамотно свой длинный цикл.
  Где вы увидели мой код с длинным циклом?
  Вы филосов  :smile: ? И готовы комментировать критически все, что угодно, не разбираясь в комментируемом лишь бы накропать свой очередной безумный текст?  Вы, что, до сих не поняли, что в комментируемых вами моих последних сообщениях данной ветки я выступаю не как пользователь, лично со своей проблемой, а обращаю внимание на общую, системную ошибку текущей реализации QUIK?
Отладка QUIK 8.13
 
Код приведенный в моем сообщении 174: https://forum.quik.ru/messages/forum10/message63195/topic6356/#message63195
был проверен мною давно для Lua 5.3.5.

  Для Lua 5.4.1 аналогичный код (но есть отличие), проверенный мною недавно и устраняющий блокировку потоков в QUIK выполнением  длинного цикла пользовательской программы на «чистом» Lua, следующий:
1. В файле   lstate.h  после строки:  volatile l_signalT hookmask;
    добавить: int Счетчик_для_переключения_State;
2. В файле   lstate.с  после строки:  L->errfunc = 0;
   добавить:  L->Счетчик_для_переключения_State = 0;
3. В файле   lstate.с:
    -  после строки:  L1->ci = ci;
   добавить:  L1->Счетчик_для_переключения_State = 0;
    -  после строки:   L->oldpc = 0;
добавить: L->Счетчик_для_переключения_State = 0;
4. В файле   lvm.с  после строки:  StkId ra;  /* instruction's A register */
  добавить:  
   int const Период_переключения_State = 1000;
   if (++L->Счетчик_для_переключения_State > Период_переключения_State) {
       L->Счетчик_для_переключения_State = 0;
       //  ! Имитация вызова "пустой" C-функции  --
       ProtectNT((lua_unlock(L), lua_lock(L)));
   }
[BUG] Повышенная загрузка CPU при большом количестве функций в скрипте
 
Цитата
Владимир написал:
TGB , Важная доработка!  
 Согласен  :smile: .  Наверное, закрывающая тему данной ветки.
Страницы: 1 2 3 4 5 6 7 8 9 10 11 След.
Наверх