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

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

Страницы: Пред. 1 2 3 4 5 6 7 8 9 10 11 ... 15 След.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
VPM написал:
Вот это совсем не понял? можно своими словами попроще.
   Попроще.
 QLua это форк Lua, скомпилированный в режим использования стеков сопрограмм (thread) в отдельных потоках. Колбеки QLua запускаются в потоке отличном от пользовательского потока main.
 Для функций стандартных библиотек QLua  нет гарантии на уровне архитектуры реализации языка, того, что они  потокобезопасны для упомянутого режима.
Например, пользователь Старатель обнаружил "мерцающую" ошибку в tonumber (https://forum.quik.ru/messages/forum10/message57110/topic5823/#message57110), которая, скорее всего, подтверждает вышенаписанное.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
nikolz написал:
Поэтому поле таблицы может быть любого типа, в том числе и типа nil.
  Для удаления элемента таблицы ему полю надо присвоить nil.  Читайте матчасть.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
Владимир написал:
Тем не менее, реализовывать задачу торговли лучше всего на чистом Lua.
  Вот она истина  :smile: и это перечеркивает все остальное, написанное в вашем комментарии :smile:
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
Владимир написал:
Lua всё реализовано  через жопу (я в своё время чуть в обморок не упал, когда увидел на этом месте ФУНКЦИЮ вроде bit.band), то хрен его знает - до ТАКОГО способны додуматься только клинически криворукие, и реализвция может быть ЛЮБОГО уровня тупости.
      Несколько слов возражения (написанных мною когда-то) :smile:
                                                                                                         Краткая характеристика Lua
   Lua - интерпретатор динамический: переменным можно присваивать данные любого типа Lua. Данные языка имеют свойство Тип. Контроль типов данных выполняется только в момент исполнения скрипта Lua. По сути, Lua двухуровневый язык программирования:  Lua/C. Эта двухуровневость была заложена в проект языка и реализована изначально (Lua тесно интегрирован с C/C++). С учетом этого, функциональность, разрабатываемых на Lua программ и их эффективность, фактически определяется возможностями C/C++.
   Исходный код скрипта на Lua транслируется в байт-код либо предварительно, либо непосредственно в начале выполнения скрипта. Байт-код выполняется виртуальной ма-шиной Lua. Управление памятью автоматическое, с использованием потокоопасного мусорщика.
   Функционально все (исключая параллелизм выполнения его функций) можно написать на «чистом» Lua, но при необходимости, из Lua можно легко перейти в C/C++ (используя все его возможности) и вернуться обратно.
   Lua очень компактный как по коду его реализации, так и по его описанию, достаточного  для его начального использования. Особенно это заметно на фоне многочисленных монструозных средств разработки программ. Пожалуй, отношение <функциональности  Lua>  к <его компактности> одно из самых высоких среди известных языков программи-рования.
    Для хорошего понимания Lua необходимо четкое представление об устройстве его ассоциативных таблиц (тип table), элементами которых являются неупорядоченные пары: <Ключ таблицы (данные любого типа Lua кроме nil)>   <Поле таблицы (данные любого типа Lua кроме nil, при присвоении которого полю, соответствующая запись таблицы удаляется>.  Доступ к полям таблицы выполняется по ее ключам. Таблица используется, в том числе, и для хранения всех переменных окружения Lua (переменных, без спецификации локализации: local). Имена этих переменных всего лишь ключи, а данные переменных - поля этой глобальной таблицы (видимой из любого места скрипта).
   В Lua используются переменные двух видов: локальные переменные и переменные окружения (общие для всего скрипта и описываемое далее). Локальные переменные имеют блочную лексическую область видимости (в тексте кода видится только то, что создано/объявлено ранее во внешних или текущем блоке, а повторно объявленное все-гда экранирует предыдущее с учетом блочной структуры скрипта). Видимость переменных окружения (в таблице окружения) из некоторого места скрипта определяется выполнением обращения к переменным/ключам таблицы окружения (доступной в любом месте скрипта) не экранированных  из этого места локальными переменными.  
  Рекомендуется там, где это возможно, использовать локальные переменные, объявляемые со спецификацией:   local  <Список локальных переменных>. Эти переменные хранятся в стеках блоков Lua и обращение к ним эффективнее, чем к переменным окружения. При выходе из любого блока, его локальные переменные перестают существовать.
   Типы данных полей таблиц Lua это:
     - значения: nil, boolean , number, string;  
     - ссылочные данные: function, thread, table, userdata.
  При присвоении значения копируются, а на ссылочные данные создаются ссылки. На одно и то же ссылочное данное  может быть несколько одинаковых ссылок из разных переменных.  
  Функции (function) в Lua анонимные (данные первого класса, при присвоении и других базовых операций не отличающиеся от остальных ссылочных данных Lua), не имеющие встроенных имен для обращения к ним. Существует конструктор создания функции с присвоением переменной ссылки на нее. Вариантом конструктора функции является строка с текстом скрипта, из которой может быть создана функция скрипта с использованием служебной функции Lua.  Любую функцию Lua можно вызвать на исполнение с использованием тех переменных, в которых есть ссылка на нее. Как и остальные ссылочные данные, функции, если в процессе  выполнения скрипта на них нет ни одной ссылки, подпадают под уборку мусорщиком Lua. Функцией является сам скрипт Lua. Функция может быть создана/определена внутри любой функции в любом месте и может быть выдана как результат функции. Результатов у функции может быть больше одного. В функциях обеспечивается рекурсия, а также они представляют собой замыкания (в них допускается использование локальных переменных тех блоков, внутри которых создаются функции и которые (внешние локальные переменные,) являются составной частью функций – ее внешним локальным окружением). При создании функции, в том числе и в качестве результата некоторой функции, она создается с состоянием своего внешнего локального окружения, имеющегося на момент ее создания.  
  Строки (string) в Lua битовые (в байтах строки могут быть любые комбинации 1 и 0), семантически являются значениями (внутренне неизменяемыми после их создания, копируемыми при присвоении) и у них есть свойство длина строки. Символ ‘\0’ не является признаком конца строки. Более детально все типы Lua описаны в основном тексте справки.
  Окружение скрипта Lua определяется (начиная с версии 5.2) служебной переменной  _ENV (по умолчанию ссылающуюся на глобальную служебную таблицу _G), которой можно присвоить в скрипте ссылку на любую доступную таблицу Lua.  После такого присвоения, окружением скрипта станет присвоенная таблица.
   Таблицы в Lua можно использовать как метатаблицы. Это таблицы Lua, которые:
1) подключаются служебным оператором подключения метатаблицы к таблице (в том числе можно и к любой метатаблице или к самой себе);
2) при определенных операциях над таблицами (у которых есть метатаблицы) или ситуациях, возникающих при их использовании, Lua обрабатывает служебные ключи (с преопределенными именами) метатаблиц специальным образом (например, запускаются функции, ссылки на которые присвоены полям таких ключей и т.д.).
  В Lua можно использовать сопрограммы: тип thread. Они запускаются в отдельных стеках сопрограмм (thread) и в стандартной конфигурации Lua реализуют псевдопото-ки (нити, обслуживаемые одним потоком). В сопрограммах обеспечивается режим вызова функции с возможностью ее продолжения после программного прерывания, вызываемого с помощью служебной функции yield.
--
  Отдельные стеки сопрограмм реентерабельны и могли бы выполняться в различных потоках, но так как сборка мусора потокоопасная, то в нескольких потоках Lua можно использовать только как разделяемый ресурс под синхронизацией (в специальной конфигурации-сборки Lua). Это относится и к его функциям C-API, являющиеся частью Lua.. При компиляции интерпретатора Lua есть возможность указания режима использования стеков сопрограмм (thread), под синхронизацией, в отдельных потоках. При этом, C-функции, запускаемые в различных  стеках, могут выполняться (в разных потоках) параллельно, но код Lua может выполняться в потоках только в разделяемом режиме (под синхронизацией).
---
  В переводе на другие известные языки ООП: таблицы Lua это динамический список свойств и ее методов (заданных в том числе и в их метатаблицах), связанных с этими свойствами.
   Профессионал, наверное, сможет изучить этот язык, почти в полном объеме, дня за два-три. Для начинающих программировать это язык в своей основе (без использования средств ООП) тоже, наверное, один из самых простых.
   Если делать в программах на Lua проверку типов параметров (а может быть и областей значений) более-менее содержательных функций, то можно обеспечить и надежность разрабатываемых на Lua программ.
---
   Код реализации Lua всего: ~400kb.
   Доступный исходный код Lua может служить одним из примеров того, как можно/нужно программировать на языке C.
-----
  Несколько общих замечаний относительно Lua:
1)  Нотация записи программ не последнее дело и авторы языка зря не использовали проверенную временем нотацию C/C++, как в части записи кода, так и в напи-сании комментариев. Конструктор таблиц можно было при этом представить, на-пример, в виде:  <….>.   Как представляется издалека, сишная нотация Lua, обес-печила бы ему гораздо  большую популярность среди программистов, чем это есть сейчас.
   Показательным подтверждением написанного выше,  является язык python. В нем была выбрана нотация записи программ, которая «зашла» многим пользователям(психология восприятия текстов человеком) и этот язык, использующий многие архитектурные решения Lua (как и Java-sript, появившийся на 2 года позже Lua), стал популярным.
2)  Множественное присвоение в Lua, а также, возможные, множественные значения результата его функций обеспечивают дополнитильную гибкость (вариантность) написания скриптов Lua, однако, являются существенными потенциальны-ми источниками ошибок в них, так как семантика реализация этой множественности слабо отражается в синтаксисе ее записи и это надо контролировать на семантическом уровне (например, если в параметрах функции1 есть вызов функции2, то в качестве параметров могут вставиться несколько значений функции2, но сколько их будет, из имени функции2 формально это не следует).
3)  Влючительно до версии 5.4.1, в кодах стандартных библиотек Lua не был учтен существующий режим конфигурирования (предусмотренный в исходниках Lua)   использования стеков сопрограмм (thread) в отдельных потоках. Функции стандартных библиотек определены в Lua как сишные (потокобезопасные, допускающие параллельное выолнение), но в их коде нередко используется внутренняя среда интерпретатора Lua (не являющаяся потокобезопасной), и нет гарантии на уровне архитектуры реализации языка, того, что стандартные функции Lua по-токобезопасны для упомянутого режима.
4)  Синтаксис Lua простой: основная его сложность перенесена в функциональ-ность его таблиц, реализованных на C. Поэтому трансляция текстого кода Lua в его исполняемый байт-код, реализована эффективно, и это надо учитывать и ис-пользовать при написании скриптов на Lua (понимая возможность динамического создания текстов-скриптов внутри выполняемого скрипта).
5) Выбор в Lua фактически единственного, но универсального типа table, обеспечивающего его полную функциональность, позволяет кратко записывать семантику выполнения скриптов. Кроме того, короткий технологический цикл, от написания кода,  до его запуска, обеспечивает оперативное получение конечного результата.
Интеграция Lua с C/C++ обеспечивает его расширяемость, как в части использования существующих библиотек, так и в части эффективности выполнения его скриптов. При этом надо учитывать то, что динамизм Lua потенциально отрицательно влияет на надежность кодов, написанных непосредственно на нем.
Как запустить скрипт qlua из командной строки?
 
В моем предыдущем комментарии ошибка. Должно быть:
nikolz написал:
Как запустить скрипт qlua из командной строки?
 
Цитата
Владимир написал:
Если не понимаете, то не читайте. Классификатор Вы наш.
  Это трудно назвать ответом на заданные вопросы. И, похоже, вы не понимаете деструктивность своего поведения.
   Хотя, наверное, вам понять трудно, попытаюсь объяснить деструктивность вашего поведения.
1. Вы издеваетесь над читателями, так как прежде чем что-то прочесть, им приходится пролистывать ваш спам.
2. Вы, похоже, не способны упустить халявную возможность писать длинные комментарии и скоро переполните базу форума :smile: .
3. Работая прокладкой между комментариями, вы ухудшаете свой имидж.
Как запустить скрипт qlua из командной строки?
 
Цитата
nikolz написал:
void luaV_execute (lua_State *L, CallInfo *ci) {
...............
   Зачем вы постоянно гадите на форуме чужими длинными текстами?
   Вы испытываете терпение поддержки QUIK?
   Вы думаете, что чем длиннее ваши комментарии, тем умнее выглядите?
Помните, что говорил А.П. Чехов?:"Краткость, сестра таланта" :smile: . И куда вы относитесь по этой классификации?
В чём преимущество OnInit
 
Цитата
VPM написал:
Переписал у себя т. всех сделок  как показывает  TGB ,
  В выложенном мною коде есть ошибка в строке:
Цитата
TGB написал:
for i = NumberOf  - 1, NumberOf_t - 1 do   --  индексы в таблицах QUIK начинаются с 0  --
  Должно быть:
for i = NumberOf , NumberOf_t - 1 do   --  индексы в таблицах QUIK начинаются с 0  --
  --------------------------
Цитата
Владимир написал:
раз в сто быстрее, чем обращение к таблице Квика. Но это мелочь
 Согласен (хотя сто это "сильное" утверждение).
Цитата
Владимир написал:
Те самые прерывания, которые поступают в Квик не только передаются скрипту в OnTrade, но и вызывают перезапись таблицы сделок - я сам видел нули в некоторых полях этой таблицы (в айдишках заявок, транзакций, в цене - кажется, когда-то об этом писал), так что данные в строках таблицы не всегда сразу "устаканиваются".
 С этим я не сталкивался (все нужные мне поля для анализа сделки получаю), но если это так, то просьба к поддержке: подтвердить это.
----
Цитата
Владимир написал:
Он всегда вырабатывает ВСЕ появившиеся записи, даже если их придёт несколько десятков или сотен.
 Я не очень понимаю почему сделки нельзя обрабатывать "пачкой", но код легко изменить так, чтобы при его вызове обрабатывалось не более одной сделки.
Цитата
Владимир написал:
проблемы, и очень серьёзные: нужно ведь опознать, по какой ЗАЯВКЕ пришла эта сделка. У меня-то на этот случай есть стек активных заявок, а Вы что будете делать?
Нет проблем. В считанной из таблицы сделок есть поле order_num. Это поле номер заявки, по которой выполнилась сделка. И вы легко можете опознать, по какой ЗАЯВКЕ пришла эта сделка.
Цитата
Владимир написал:
А если это вообще "левая" заявка, поданная вручную, в обход скрипта через стакан?
 Если в вашем стеке активных заявок, нет заявки, соответствующей считанной сделки, то можете, считать, что заявка подана вручную.
В чём преимущество OnInit
 
Цитата
Владимир написал:
Сделки немедленно попадают в стек прерываний и выбираются оттуда 4 раза в секунду, обычно по одной, но если там дубль уже обработанной (тоже тот ещё маразм: несколько прерываний на одно событие!), то по 2 или 3 элемента за раз.
  Можно выбирать 4 раза в секунду новые сделки из таблицы сделок и при этом не требуется ведения стека прерываний, борьбы с дублями колбеков, которые к тому же выполняются в потоке, отличном от main, а потому, по-хорошему, надо учитывать и то, что у вас со стеком ведется работа из двух потоков.
   Фрагмент эффективной обработки таблицы сделок:
Код
--- Инициализация -----
local  NumberOf = 0    ----  сохраненная длина таблицы сделок --
local  NumberOf_t   --
local  tbl_trades
-------
 
            -- Фрагмент чтения новых сделок (4 раза в секунду )   ---
NumberOf_t = getNumberOf ('trades')       --- быстрая операция ---
if NumberOf_t > NumberOf then   -- обработка всех новых возникших сделок --
   for i = NumberOf  - 1, NumberOf_t - 1 do   --  индексы в таблицах QUIK начинаются с 0  --
      tbl_trades = getItem ('trades', i)    -- быстрая операция (прямое чтение по индексу) ---
      ---   дальнейшая обработка новых сделок  ---

      ----------------------------------------
   end
   NumberOf =  NumberOf_t   -- сохранение длины таблицы сделок --
end

В чём преимущество OnInit
 
Цитата
Владимир написал:
Затем, что сделки приходят в случайные моменты времени, алгоритмически они и есть прерывания.
 Если я правильно понимаю, вам в скрипте надо знать состояние вашего счета по сделкам. Зачем вам обрабатывать колбеки сделок в случайные моменты времени (дополнительный "геморрой"), когда вы можете посмотреть (только) изменения в таблице сделок (конечный результат), и это можно сделать просто и эффективно. Если между просмотрами таблицы сделок, возникнет несколько новых, то вы их все равно увидите. Задержка 2-3 секунды (из-за цикла просмотра таблицы) в получении состояния по сделкам вряд ли, для вас существенна, так как QUIK точно не HFT терминал.
В чём преимущество OnInit
 
Цитата
Владимир написал:
пока тебя не пнут под зад прерыванием
  Зачем вам прерывания? Вы же программу пишите не для управления системой зажигания автомобиля :smile: ?
Цитата
Владимир написал:
И как часто?
  Наверное, один раз в три секунды скорее всего будет достаточно.
В чём преимущество OnInit
 
Цитата
Владимир написал:
Зачем бегать по таблице сделок, если есть прерывание?
   Не надо бегать по таблице сделок. Достаточно сохранять ее размер и только если он изменился, читать только новые записи.
В чём преимущество OnInit
 
Цитата
Владимир написал:
Единственный коллбек, который использую я - OnTrade, некоторые работают даже без него.
  Вы до сих пор используете OnTrade? Зачем реагировать на полуфабрикаты (колбеки), когда можно использовать текущее состояние QUiK (таблица по сделкам)?  Вы же не занимаетесь FTP (зачем? и точно бессмысленное занятие этим в quik)? Чем проще, тем надежнее.
Подключение к Quik, Как подключиться к quik для получения информации с графика и формирования заявок?
 
Цитата
Юрий написал:
А можно это все как-то в виде примера с кодом увидеть?
  Можно: https://quikluacsharp.ru/qlua-c-cpp-csharp/vzaimodejstvie-lua-i-biblioteki-dll-napisannoj-na-c-c/
Вам такое не снилось!!!, LUA5.3 LUAJIT MQL5
 
Цитата
nikolz написал:
Один компьютер может обсчитывать очень сложный алгоритм по одному инструменту в реальном времени.
Например нейронную сеть на 1 миллиард  нейронных связей.
------------------------Делаем в интернет пул скажем 1000 компьютеров Получаем распределенный кластер прогнозирования 1000 инструментов в реальном времени.
:smile: .
«Остапа понесло  …..
Остап со вчерашнего дня еще ничего не ел. Поэтому красноречие его было необыкновенно»
     Ильф и Петров:  «Двенадцать стульев»
Кривые шибки в QLua
 
Цитата
nikolz написал:
Форум не церковь, а я вам не поп, чтобы слушать Вашу исповедь.
  Короткий ответ с элементами юмора радует. Это путь к исправлению. Но вы опять что-то перепутали, скорее я выступил в роли попа со своими наставлениями :smile: .
Кривые шибки в QLua
 
nikolz
  Ожидаемо, что вам не захотелось продолжения нашего «банкета», но чтобы у вас, и мысли продолжения его не возникли далее (вы мне надоели), то я сам его и завершу.
  Мне, совершенно, не интересно с вами общаться. Что-то вам объяснить, это неразрешимая задача (на уровне, попытки объяснения обезьяне тензорного исчисления).  Но, я в мягкой форме и неоднократно  пытался вам объяснить, предельно простую мысль, что вам не надо много писать на форуме, пока вы не сможете читать  :smile: .  А если это и произойдет (вы сможете читать) то, похоже, очень не скоро  :smile: .
  Вам вредно изображать из себя «гуру программирования». Вам это не идет. Вы что, не понимаете, что вы смешны со своими сотнями потоками?  Вы несчастный человек. Вам не надо заниматься сложными вещами. Вам, наверное, надо как то осознать ваше реальное место в этой жизни. Вы не торгуете на  фондовом рынке,  хоть и заявляете о каких то «бешенных» процентах. У вас нет приличной работы. Ну кто, в здравом уме, примет вас на приличную работу? Вы безработный или полубезработный и работаете на данном форуме «прокладкой» между комментариями пользователей.
Кривые шибки в QLua
 
Пропустил тяжкое обвинение  :smile:  (дополнительное подтверждение написанного ранее о вас):
Цитата
nikolz написал:
Судя по Вашим постам Вы не умеете использовать механизмы синхронизации потоков.  
 Если бы вы умели читать мои комментарии и при этом еще что-то соображать (а это, к сожалению, точно не лечится  :smile:  ), то вы могли бы, наверное, понять, что это ваше очередное заблуждение.
------------
 Кстати (о заблуждениях):
Цитата
nikolz написал:
Локальные стеки у луа машин майн и основного потока разные и следовательно синхронизация потоков при обращении к ним не требуется и нет блокировки.
 Вы что, до сих пор не сообразили, что когда мы с вами «муторно» обсуждали коды на C++, то lua_lock(L)  и   lua_unlock(L)  это те самые блокировки, которые, по вашему мнению, отсутствуют.
------------------------------
 Если же вам захочется продолжение нашего «банкета»  :smile: , то оно будет.
Кривые шибки в QLua
 
Цитата
nikolz написал:
дайте ссылку на такой пример
 nikolz  писатель, а не читатель :smile: ? Вы не умеете читать?
Мною же было написано, что обсуждаемую ошибку QLua обнаружил пользователь Старатель. Читайте: https://forum.quik.ru/messages/forum10/message57110/topic5823/#message57110

Цитата
nikolz написал:
Отвечу Вам конкретно, как решить Вашу проблему.
     Хотя у меня нет проблем, но интересно, какие проблемы вы можете решать, если даже читать не умеет?
Кривые шибки в QLua
 
Цитата
nikolz написал:
Разработчики КВИКА  к разработке VMLua  имеют ровно такое же отношение как мы с вами - т е НИКАКОГО.
  Я нигде не писал, что разработчики КВИКА разрабатывали VMLua. Но за все ошибки, которые возникают в КВИКе, независимо от того, что разработчик использовал при его создании, отвечают он.
   Вы какой-то сильно непонятливый. Но попробую объяснить вам это на простом примере. Возможно, вы ездите на своей машине. В ней наверняка используется электроника, которую производитель закупал на стороне. Например, эта электроника сломалась. Вы что, побежите со своими претензиями к производителю электроники?
Кривые шибки в QLua
 
Цитата
nikolz написал:
else {size_t l;
 const char *s =  lua_tolstring (L, 1, &l);
 if (s != NULL &&  lua_stringtonumber (L, s) == l + 1)return 1; /* successful conversion to number *//* else not a number */
  }
}
в этой части преобразуется строка в число и используется функция  lua_tolstring   ранее уже показывал, повторю:
 А функция lua_stringtonumber  для вас, конечно, не существует. Вы думаете, что она никогда не вызывается?  Даже если надо преобразовать число, представленное в виде строки?
 Вы все-таки читайте то, что я пишу. Я же дал вам ссылку на свой разбор ситуации. И эта ссылка многократно повторялась ранее.
 Но для вас повторю написанное мной ранее (цитирую себя):
----
  При просмотре исходника функции 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.
----
В конструкциях luaO_str2num и api_incr_top в качестве параметров используется L.
Найдите в этих конструкциях синхронизирующие скобки lua_unlock(L); lua_lock(L) и тогда мы продолжим общение.
Кривые шибки в QLua
 
Цитата
nikolz написал:
Ой, что не так?
  Не ту функцию с вами обсуждаем (смотрите мой предыдущий комментарий):smile: . Напрасно я вам мозги "пудрил". Но вы меня не читаете. Давно бы меня разоблачили.
Кривые шибки в QLua
 
Цитата
Anton Belonogov написал:
По обращению 1 мы производим анализ проблемы, к сожалению, он еще не завершен.
   
Цитата
TGB написал:
1) Ошибка в стандартной функции tosting, в режиме  использования Lua в нескольких потоках (как это делается сейчас в QLua), обнаруженная Старателем;
  Выше вместо tosting должно быть tonumber. Это моя ошибка.  По ссылке https://forum.quik.ru/messages/forum10/message64871/topic5823/#message64871 идет речь о tonumber.
Кривые шибки в QLua
 
Цитата
nikolz написал:
Ой, что не так?
Вы что, только писать умеете?
Читайте ранее написанное мною: https://forum.quik.ru/messages/forum10/message64871/topic5823/#message64871
Вообще, вы мне надоели со своими неуклюжими попытками "уесть" меня. Что вы вы все время "надуваете" свои щеки? Ведь можете лопнуть.
Кривые шибки в QLua
 
Цитата
nikolz написал:
LUA_API const char *lua_tolstring (lua_State *L, int idx, size_t *len)
..........
что не так?
Это не стандартная функция tostring, которая используется внутри Lua, а функция из C-API (файл lapi.c), которая используется программами пользователя, написанными на C++ при  взаимодействии с Lua.  
Стандартная tostring описана в файле lbaselib.c (lua 5.4).
Вот список стандартных базовых функций:
Код
static const luaL_Reg base_funcs[] = {
  {"assert", luaB_assert},
  {"collectgarbage", luaB_collectgarbage},
  {"dofile", luaB_dofile},
  {"error", luaB_error},
  {"getmetatable", luaB_getmetatable},
  {"ipairs", luaB_ipairs},
  {"loadfile", luaB_loadfile},
  {"load", luaB_load},
  {"next", luaB_next},
  {"pairs", luaB_pairs},
  {"pcall", luaB_pcall},
  {"print", luaB_print},
  {"warn", luaB_warn},
  {"rawequal", luaB_rawequal},
  {"rawlen", luaB_rawlen},
  {"rawget", luaB_rawget},
  {"rawset", luaB_rawset},
  {"select", luaB_select},
  {"setmetatable", luaB_setmetatable},
  {"tonumber", luaB_tonumber},
  {"tostring", luaB_tostring},
  {"type", luaB_type},
  {"xpcall", luaB_xpcall},
  /* placeholders */
  {LUA_GNAME, NULL},
  {"_VERSION", NULL},
  {NULL, NULL}
};


А вот код функции luaB_tostring, который реализует "tostring" и в которой вызывается luaL_tolstring(L, 1, NULL):
Код
static int luaB_tostring (lua_State *L) {
  luaL_checkany(L, 1);
  luaL_tolstring(L, 1, NULL);
  return 1;
}
//  -------  Вызывается в luaB_tostring (lua_State *L)  --
LUALIB_API const char *luaL_tolstring (lua_State *L, int idx, size_t *len) {
  idx = lua_absindex(L,idx);
  if (luaL_callmeta(L, idx, "__tostring")) {  /* metafield? */
    if (!lua_isstring(L, -1))
      luaL_error(L, "'__tostring' must return a string");
  }
  else {
    switch (lua_type(L, idx)) {
      case LUA_TNUMBER: {
        if (lua_isinteger(L, idx))
          lua_pushfstring(L, "%I", (LUAI_UACINT)lua_tointeger(L, idx));
        else
          lua_pushfstring(L, "%f", (LUAI_UACNUMBER)lua_tonumber(L, idx));
        break;
      }
      case LUA_TSTRING:
        lua_pushvalue(L, idx);
        break;
      case LUA_TBOOLEAN:
        lua_pushstring(L, (lua_toboolean(L, idx) ? "true" : "false"));
        break;
      case LUA_TNIL:
        lua_pushliteral(L, "nil");
        break;
      default: {
        int tt = luaL_getmetafield(L, idx, "__name");  /* try name */
        const char *kind = (tt == LUA_TSTRING) ? lua_tostring(L, -1) :
                                                 luaL_typename(L, idx);
        lua_pushfstring(L, "%s: %p", kind, lua_topointer(L, idx));
        if (tt != LUA_TNIL)
          lua_remove(L, -2);  /* remove '__name' */
        break;
      }
    }
  }
  return lua_tolstring(L, -1, len);
}

  Ну и так далее.
-------
 Когда вы пишите, например, в скрипте   tolstring (5), то используется   luaB_tostring. Эта же функция используется неявно Lua для преобразования числа 1 в строку, если вы написали: "текст " ..  1 .
Кривые шибки в QLua
 
Цитата
Anton Belonogov написал:
По обращению 1 мы производим анализ проблемы, к сожалению, он еще не завершен.
  Описав в своем комментарии, в чем, по моему мнению, заключается ошибка использования существующей функции tostring в QLua, я не привел решения по ее ее устранения.
   Приведу в данном комментарии один из вариантов решения:
     1)  В начале функции tostring  вставить lua_lock(L);
     2)  В конце всех завершений функции вставить  lua_unlock(L).
Кривые шибки в QLua
 
Цитата
Anton Belonogov написал:
По обращениям 2, 3 отвечали Вам ранее, что доработки в Lua 5.3 не будут выполняться, рекомендуем использовать Lua 5.4.
   Проблема 2 относится и к QLua 5.4, но в QLua 5.4 я не вижу ее простого решения и, как я написал, это свое предложение снимаю.
Кривые шибки в QLua
 
Цитата
Anton Belonogov написал:
По обращению 1 мы производим анализ проблемы, к сожалению, он еще не завершен. Как только результат будет получен, мы поделимся с Вами информацией.
   Если есть конкретные вопросы по моему тексту, то я попытаюсь ответить.
Кривые шибки в QLua
 
В цитате "nikolz написал:
При своем запуске, GC "ползает" по всем стекам":  вместо nikolz читать TGB.
Кривые шибки в QLua
 
Цитата
nikolz написал:
Вы почему-то опускаете тот момент, что синхронизация нужна лишь при изменении потоками общих данных . т е если данные лишь читаются, то синхронизация обращения к ним потков не требуется.

Цитата
nikolz написал:
При своем запуске, GC "ползает" по всем стекам
и при этом изменяет их данные.
  Возможно  :smile: , вам известно, что сборка мусора это нетривиальная задача даже при реализации ее в однопоточном варианте. Например, в C# для программы допускается работа в нескольких потоках, но Microsoft, с ее немалыми ресурсами, не смогла реализовать потокобезопасный сборщик мусора и при его работе "замораживает" выполнение потоков.
 То что делается в QLua, я описал в своем комментарии.
Кривые шибки в QLua
 
Цитата
Anton Belonogov написал:
Приведите, пожалуйста, ссылки на упоминаемые Вами обращения, проверим информацию.
  Здравствуйте.
Цитата
TGB написал:
1) Ошибка в стандартной функции tosting, в режиме  использования Lua в нескольких потоках (как это делается сейчас в QLua), обнаруженная Старателем;
 Ссылка на мой повтор: : https://forum.quik.ru/messages/forum10/message64871/topic5823/#message64871

Цитата
TGB написал:
2) Системная ошибка взаимоблокировки (выполнением «чистого кода Lua») потока main и основного потока QUIK,
Ссылка на мое первоначальное предложение: https://forum.quik.ru/messages/forum10/message54998/topic5119/#message54998

Цитата
TGB написал:
3) Существующая ошибка в QLua версиии 5.3, которую разработчик не собирается устранять, неофициально отказываясь от ее поддержки (заявляя это, втихомолку   , в данном форуме), Причем, что характерно, бесперспективно   , мною предложен конкретный простой тест для анализа этой ошибки.
Ссылка на мой повтор: https://forum.quik.ru/messages/forum10/message58500/topic5823/#message58500
Ответ поддержки: https://forum.quik.ru/messages/forum10/message59594/topic5823/#message59594
проблема с функцией getDepo
 
Цитата
Anton Belonogov написал:
Действительно, при вызове getDepo из Lua-скрипта из-за синхронизационных проблем могут возникать ошибки.
 Что характерно, вы появились вскоре, после того, как на форуме исчез известный пользователь Anton. В любом случае, для поддержки, это правильное решение  :smile: .
проблема с функцией getDepo
 
Цитата
Anton Belonogov написал:
проблема изучается. Постараемся в ближайшее время дать ответ.
 Проверил у себя в "песочнице" (QUIK версия последняя 10.1). Ситуация возникает постоянно. По всем признакам (возникает в разное время, сообщение не lua) ошибка синхронизации в QUIK.
Кривые шибки в QLua
 
Цитата
nikolz написал:
Локальные стеки у луа машин майн и основного потока разные и следовательно синхронизация потоков при обращении к ним не требуется и нет блокировки.
 Это было бы верно, если бы в Qlua не было общего ресурса потоков:  сборки мусора (GC).  При своем запуске, GC "ползает" по всем стекам и не является потокобезопасным. Поэтому для всех потоков QLua все фрагменты скрипта, за исключением, вызываемых С- функций, являются разделяемым ресурсом (потоки синхронизируются).  Нет синхронизации потоков только при выполнении C-функций, вызванных в скрипте.
Кривые шибки в QLua
 
! Для поддержки QUIK:
1. Вы зря игнорируете замечания пользователей. Конструктивные замечания пользователей и их учет разработчиком QUIK облегчат вам работу (но грозит последующими уволь-нениями  :smile: ).
2. В QLua можно, условно, выделить два уровня:
1) системный (обеспечивающий исполнение скриптов пользователей);
2) прикладной (обеспечивающий команды управления QUIK, например, работу с табли-цами QUIK – и это, точно, не таблицы Lua  :smile: ).
   В данном комментарии я не буду обсуждать прикладной уровень. Там, до сих пор, много ошибок  и это демонстрируют многие комментарии данного форума.
   На системном уровне, так как я это вижу (ошибок может быть, наверное, и больше),  в текущий момент, на 25.01.23, в QLua есть следующие ошибки:
 1) Ошибка в стандартной функции tosting, в режиме  использования Lua в нескольких потоках (как это делается сейчас в QLua), обнаруженная Старателем;
 2) Системная ошибка взаимоблокировки (выполнением «чистого кода Lua») потока main и основ-ного потока QUIK, реализующего колбеки (об этом я в этом форуме много писал).  В конце, концов я снял свое предложение по устранению данной ошибки, с пониманием того, что в QLua версии >= 5.4 для разработчика QLua, это неразрешимая задача  :smile: .
 3) Существующая ошибка в QLua версиии 5.3, которую разработчик не собирается устранять, неофициально отказываясь от ее поддержки (заявляя это, втихомолку  :smile: , в данном форуме), Причем, что характерно, бесперспективно  :smile: , мною предложен конкретный простой тест для анализа этой ошибки.
Тест зависания терминала QUIK 10.0.1.18
 
Цитата
nikolz написал:
_sk_ ,вот Ваш тест с исправленными Вашими ошибками. Работает без проблем.
   Вы до сих пор не поняли, что у _sk_ нет проблем со скритом ( он делает flag  =   true и все у него хорошо ). Его интерисует странное поведение скрипта когда flag =false и это нормально.
  Вообще, из того что видно невооруженным взглядом, у вас постоянный зуд отметиться на форуме (как у собачки, выпущенной на прогулку  :smile: ). Зачем вы работаете на форуме «прокладкой» между комментариями?
  Явно, что у вас проблемы с вашими комплексами и вы пытаетесь здесь их скомпенсировать. Но вы до сих пор не научились выделять фрагменты текстов комментариев, которые вы цитируете. Вас можно пожалеть (девочки точно не любят), но вы постоянно спамите на форуме и скоро переполните его базу  :smile: .  Меня это беспокоит и только поэтому я на вас реагирую  :smile: .
Тест зависания терминала QUIK 10.0.1.18
 
Цитата
_sk_ написал:
Я видел Ваши предложения по этому поводу, на которые разработчики, к сожалению, не реагируют.
   Для QLua 5.3 есть простое и эффективное решение, которое я протестировал. Но это решение не подходит к Qlua 5.4 так как там было существенно изменено управление памятью и с этим я разбираться не стал. Разработчик QUIK (через поддержку) заявил, что будет поддерживаться только QLua 5.4. Поэтому свои предложения я снял, опасаясь того, что  их реализация разработчиком в QLua 5.4. может оказаться некорректной и последствия могут оказаться более неприятными чем то, что есть сейчас.
Тест зависания терминала QUIK 10.0.1.18
 
Цитата
nikolz написал:
Предположу, что это ошибка автора  скрипта, так как в нем не учитывается многопоточность.  
  Филосов  :smile: .   Укажите конкретно в чем ошибка автора.
---
  Ошибки автора нет. Есть ошибка в QUIK, состоящая в том, что длинные участки фрагментов кода скрипта на "чистом Lua" (без вызова C-функций) блокируют переключение потоков обслуживающего колбеки и выполняющего main. Я не буду повторять свои комментарии по этому поводу. Читайте форум.
Тест зависания терминала QUIK 10.0.1.18
 
Цитата
_sk_ написал:
Спасибо большое за пояснение!
   Если код функции OnStop модифицировать следующим образом:
Код
function OnStop(flag)
    interrupted = true
    message("OnStop executed", 1)
    pcall(closeWindow)
end

  то зависания не будет и, наверное, понятно почему.
Тест зависания терминала QUIK 10.0.1.18
 
Цитата
_sk_ написал:
Я также проверял в терминале версии 9.7, там не было зависания почему-то.
  Я проверил у себя в версии 9.7.0.14.  Зависание есть.
Тест зависания терминала QUIK 10.0.1.18
 
Цитата
_sk_ написал:
Тут с OnStop какая-то проблема, как мне кажется.
  Причину я описал в своем комментарии.
В вашем скрипте эта причина проявляется следующим образом.
В цикле функции main есть два фрагмента кода с вызовами C-функций. Это sleep(0) и косвенно вызываемые (с помощью  функции run()) стандартные функции работы с таблицами QUIK.  При отключении sleep(0) остаются C-функции работы с таблицами QUIK. Поэтому OnStop запускается в потоке обработки колбеков (с выдачей сообщения "OnStop executed"). Но далее запускается pcall(closeWindow).  В функции closeWindow отключается фрагмент работы с таблицами QUIK. Исполняемый код цикла функции main при этом представляет код на "чистом Lua".  Внутри исполнения pcall(closeWindow) существует вызов C-функции (я с этим уже разбираться не буду), при котором блокируется поток обработки колбеков, но отпускается поток main, где в цикле выполнения кода на "чистом Lua" блокируется поток выполняемый функцию OnStop. QUIK виснет.
Тест зависания терминала QUIK 10.0.1.18
 
Цитата
_sk_ написал:
2) Знает ли кто-то причину такого поведения?
  Проверил у себя в песочнице 10.1.  Ваш скрипт зависает при flag = false.
 Как известно, длинный участок фрагмента кода скрипта на "чистом Lua" в main (без вызова C-функций) блокирует выполнение потока обслуживающего колбеки.
Функция sleep(0) - это C-функция.  Когда вы исключаете ее исполнение (в цикле), то получается бесконечный фрагмент скрипта на "чистом Lua" и OnStop, являющийся колбеком не может быть выполненным.
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
Страницы: Пред. 1 2 3 4 5 6 7 8 9 10 11 ... 15 След.
Наверх