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

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

Страницы: Пред. 1 2 3 4 5 6 7 8 9 10 11 ... 13 След.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
VPM написал:
подход максимальной локализации переменных, и по блочному их использованию, для таких пользователей как я оптимальный. И можно забыть про такое _G
 Да.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
1.
Цитата
VPM написал:
"наделав кучу на голове у оппонента,  сидеть на ней, как на горе Эверест, со значимым видом"
 Довольно остроумное предложение по переименованию большей, но не лучшей части данной ветки  :smile:.

2.  
Цитата
VPM написал:
Здесь вопрос вот в чем, зачем здесь глобальная таблица со своим окружением
   Если внимательно читать автора, то в переводе на простой язык написано следующее.
  У скрипта существует внешняя служебная переменная с именем _ENV (доступная программисту).
  Все <переменные скрипта>, без спецификации local (называемые переменными окружения), семантически (по смыслу) эквивалентны: _ENV.<переменная скрипта>. То есть, предполагается, что значением _ENV может быть (вообще говоря, любая) таблица. По умолчанию при запуске скрипта, _ENV автоматически присваивается  глобальная служебная таблица _G (тип table), в которой первоначально хранятся стандартные функции Lua. Переменные окружения скрипта будут ключами этой таблицы.  Поэтому (если не присваивать _ENV таблицу отличную от  _G) запись в скрипте:  val = 1 эквивалентна следующей записи (_ENV.val =1) _G.val =1 или (_ENV['val'] =1) _G['val'] = 1.
 Если же не заморачиваться деталями реализации Lua, описанными выше, и не трогать _ENV , то достаточно понимать, что все переменные скрипта без спецификации local являются ключами некоторой служебной таблицы, и экзотическими способами обращения к таким переменным не пользоваться.
SetUpdateCallback и обнудение стека Lua
 
Цитата
Quikos_1 написал:
type:string:1     //Таблица глобальных функций
  Ну, если это таблица, то я сдаюсь и "умываю руки" :smile: .  Похоже, вы долго будете развлекаться отладкой. Потом, просьба к вам, сообщить конечный результат в этой ветке.
SetUpdateCallback и обнудение стека Lua
 
Цитата
Quikos_1 написал:
Это так не работает, если только Вы монолог сами с собой не ведете.
 Учел вашу критику :smile: .

1.
Цитата
Quikos_1 написал:
Ох, Вы явно путаете сборку мусора оперативной памяти и рабочую структура стека Lua. Они ни как не связаны.
         Сначала некоторое утверждение, а затем конкретный вопрос:  
   1) При уборке мусора просматриваются объекты скрипта  и ищутся такие, на которые нет ссылок из среды выполнения скрипта.
   2) Если в стеке скрипта, в момент работы мусорщика, находится ссылка на какую то таблицу и на нее нет других ссылок, то как мусорщик определит, что эта таблица «живая», не обрабатывая стек?

2. Мне стало интересно посмотреть такой  
Цитата
Quikos_1 написал:
просто С++ код
:
    1) Ошибка:
        Оператор  if (status_lua_pcall != 0) ловит только исключения.
        Функция . CreateDataSource обычно завершается, не выбрасывая исключение, даже если источник не создан.
        Надо анализировать результат выполнения CreateDataSource.
        Если источник не создан, то первое значение результата nil, а второй результат: строка описания ошибки создания источника.
        Похоже, вы запускаете свой скрипт в песочнице, а там класс для SBER не TQBR. У вас не создался источник свечей.

   Далее мне смотреть не интересно.
SetUpdateCallback и обнудение стека Lua
 
А что вы спрашиваете :smile: ?:
Цитата
Quikos_1 написал:
ВОПРОС: КТО И ЗАЧЕМ очитстил стек ?? КАК видно из кода, между вызовов SetUpdateCallback и вызовом самой колбек-функции нет ни одной строчки кода, которая бы редактировала стек. Так что происходит тогда ?
  Сами найти не можете?
SetUpdateCallback и обнудение стека Lua
 
Цитата
Quikos_1 написал:
Что бы хотели знать ?
   В каких местах исходников Lua (файл/строка), вызывается мусорщик?
SetUpdateCallback и обнудение стека Lua
 
Цитата
Quikos_1 написал:
Для индикаторов - однозначно Нет.
 Вопрос задан: как это вы делаете с помощью C-API?
SetUpdateCallback и обнудение стека Lua
 
Цитата
Quikos_1 написал:
Так эту глупость про сборщик мусора вообще Вам не нужно было писать - дичь конечно эпичная :)
   Поделитесь, пожалуйста, с форумом вашими, интересными знаниями о сборке мусора в QLua. Очень любопытно :smile:
SetUpdateCallback и обнудение стека Lua
 
Цитата
Quikos_1 написал:
Только не открываю,а "заказываю". Просто указывая класс инструмента, имя и интервал.
    И это нельзя сделать в тексте скрипта с помощью CreateDataSource :smile: ?
SetUpdateCallback и обнудение стека Lua
 
[
Цитата
Quikos_1 написал:
Ох, Вы явно путаете сборку мусора оперативной памяти и рабочую структура стека Lua. Они ни как не связаны.
  Это без комментария :smile:

Цитата
Quikos_1 написал:
Видимо Вы просто не разу не пытались заказывать данные по инстурменту, который у Вас не открыт в Квике
  Интересно,  как вы открываете с помощью C-API "данные по инстурменту, который у Вас не открыт в Квике"?
SetUpdateCallback и обнудение стека Lua
 
1.   Это ваш вопрос?:
Цитата
Quikos_1 написал:
ВОПРОС: КТО И ЗАЧЕМ очитстил стек ??
 Это мой ответ:
Цитата
TGB написал:
Мусорщик работает по всем таблицам и стекам lua_State и что-то там делает.

2. Для меня некоторое открытие  :smile: , что в QLua:
Цитата
Quikos_1 написал:
вы не можете вызвать SetUpdateCallback - ЕСЛИ у вас не открыт график.
SetUpdateCallback и обнудение стека Lua
 
Цитата
Quikos_1 написал:
ВОПРОС: КТО И ЗАЧЕМ очитстил стек ?? КАК видно из кода, между вызовов SetUpdateCallback и вызовом самой колбек-функции нет ни одной строчки кода, которая бы редактировала стек. Так что происходит тогда ?
  1. На форуме много раз отмечалось, что если нужен результат, а не развлечение отладкой, то писать скрипты надо просто. Что-то использовать кроме QLua, надо в крайнем случае (в том числе C-API), если, действительно, QLua и многочисленных пакетов Lua не хватает для реализации задуманного.
  2. Зачем вы используете C-AP?  Что вам не хватает в Qlua?
  3. В Qlua, как известно, автоматическая память и сборка мусора может быть запущена как внутри вызова C-API, так и при вызове коллбека, в основном отдельном параллельном потоке QUIK. Мусорщик работает по всем таблицам и стекам lua_State и что-то там делает.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
VPM написал:
скорее это фильтр (detrender),
   Как ни странно, но ваш фильтр это грубая модель учета
Цитата
TGB написал:
пирамидального поведения "толпы" рвущейся за прибылью
:smile:
Примеры dll на GCC 64 для работы со скриптом
 
Цитата
Serge123 написал:
Теперь меня интересует, как получать в длл таблицы от луа и разбирать их, напр., таблицу заявок и обезличенных сделок. Я несколько лет назад перешёл с Дельфи 7 на си под 64 бит и gcc, теперь неохота сидеть на 2-х стульях.
  Я согласен с тем, что выше написал swerg.
От себя добавлю: возможно, для вас окажется полезным сайт https://quikluacsharp.ru/ , на котором есть много чего интересного, в том числе "КРАТКАЯ СПРАВКА ПО ЯЗЫКУ LUA.PDF", написанная мною. В ней есть описание трансляции C++ dll для Lua, а также краткое описание C-API Lua.
Как правильно удалить элемент из массива со "сдвигом влево"
 
Цитата
Serge123 написал:
Как правильно удалить элемент из массива со "сдвигом влево"
   Удалять в элементы таблицы в цикле, надо в конце завершения цикла, когда с ними нет операций.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
nikolz написал:
Это важно, поскольку позволяет рассчитать доверительный интервал для коэффициента корреляции Пирсона.
  Давно не заходил на форум. Интересно, у кого представления, что фондовый рынок описывается вероятностной моделью, для которой имеют реальный смысл ее характеристики. Понятно, что если нет хорошей модели рынка, то можно брать за основу и вероятностную. Но, кто понимает, то это большая "натяжка". У меня нет такой убедительной модели, но, если бы она была, то должна бы была учитывать пирамидальное поведение "толпы" рвущейся за прибылью, а также наличие инсайдерских каналов. Это точно не вероятностная модель.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
VPM написал:
Получается что сопрограммы долой?
   Про сопрограммы я не писал ничего плохого.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
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.
Страницы: Пред. 1 2 3 4 5 6 7 8 9 10 11 ... 13 След.
Наверх