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

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

Страницы: 1 2 3 4 5 6 7 След.
Отключил сборку мусора, а его всё равно кто-то собирает...
 
Спасибо, теперь ясно, почему память под скрипт уменьшалась.

А если короткой строке что-то присвоить, то алгоритм сложнее: она, как я заметил, заносится в стринг буфер, и если какой-то строке присваивается короткое значение, то в этом стринг буфере ищется по хэшу такая же строка и, если найдена, оживляется, а если такая строка не находится, то тогда создаётся новая.
Отключил сборку мусора, а его всё равно кто-то собирает...
 
Вы имели в виду, что, когда я длинной строке присваиваю "", то она сразу удаляется (вызывается free()), минуя сборщик мусора, и пересоздаётся (c выделением 56 байтов через malloc())?
Отключил сборку мусора, а его всё равно кто-то собирает...
 
А разве не сборщик мусора вызывает Win API free(...) в т.ч. для строк?
Надо кое-что исправить в документации
 
Вернее, в документации хотели сказать, что возвращаются пустые таблицы, что тоже неверно.
Надо кое-что исправить в документации
 
Таблиц bid и offer в выдаче getQuoteLevel2 не было, как и сказано в документации.
Надо кое-что исправить в документации
 
Запросил стакан, на который не подписан, и получил bid_count/offer_count = "0.000000", а не "0", как сказано в документации. Век живи - век лечись...
Квик для тикера LQDT не показывает историю от 6 мая 2024
 
Действительно, сменил сервер в Квике под Виндовс, и всё заработало само.
Надо кое-что исправить в документации
 
Спасибо, попробую эту гениальную, как и всё простое, идею.
Квик для тикера LQDT не показывает историю от 6 мая 2024
 
Спасибо, попробую в Квике выбрать остальные 2 сервера и посмотреть.
Отключил сборку мусора, а его всё равно кто-то собирает...
 
В main написал: collectgarbage('stop'), но при присваивании нового значения длинной строке в окне скриптов вижу, как занимаемая этим скриптом память сразу сильно уменьшается. Как это объясняется?
Надо кое-что исправить в документации
 
Цитата
Serge123 написал:
причём, значение для ключа quantity заканчивается на подстроку ".0", которую необходимо удалять.
Извините, это я спутал quantity с bid_count/offer_count, где к числам в строке приписывается точка и 6 нулей.
По этому поводу возникает вопрос: в случае отсутствия спроса/предложения в bid_count/offer_count возвращается символьный 0, как написано в док-ции, или этот 0 возвращается с привеском: "0.000000"?

Это трудно проверить, для этого надо поймать момент, когда какую-нибудь акцию 33-го эшелона все уже купили и все хотят только продать, а покупать уже никто не хочет.
Квик для тикера LQDT не показывает историю от 6 мая 2024
 
6 мая у тикера LQDT поменяли класс бумаги с TQTF на TQTF_F. Сегодня запустил Квик, а он  в окне графики не показывает график для LQDT за 6 мая, а последний день у него 3 мая... Хотя, 6 мая Квик показывал график за 6 мая. Приложение на Андроиде показывает историю за 6 мая, поэтому проблема в Квике...
Что будет, если внешняя dll изменит содержимое строки Lua?
 
Цитата
funduk написал:
Вы же хакер, можете заменить часть бинарника,
Я не хакер, я недавно перешёл на C, и часто приходится смотреть в справке по языку, как и чем что сделать. Я набираю программы в редакторе Фара и не пользуюсь отладчиками. Просто я слегка разобрался в структурах таблиц, строк и нодов...
Что будет, если внешняя dll изменит содержимое строки Lua?
 
Цитата
paluke написал:
А еще должна быть какая-то непустая реализация макросов lua_lock()/lua_unlock() в llimits.h
Ясно, спасибо, я как-то заметил, что в исходниках эти лок и анлок присутствуют в виде заглушек.
Получается, что нельзя самому что-то для своего удобства изменить в исходниках и получить настроенную под себя dll для Квика...
Надо кое-что исправить в документации
 
В файле
Интерпретатор языка Lua.pdf
в пункте
Код
3.9.1 getQuoteLevel2
в 1-й табличке сказано
Код
bid TABLE Котировки спроса (покупки). При отсутствии спроса возвращается пустая строка
Видимо, должно быть "... возвращается пустая таблица"? Ведь bid это таблица...
Аналогично надо исправить для таблицы offer.

А что сейчас возвращает getQuoteLevel2 при отсутствии спроса/предложения, пустую таблицу? Я не могу это проверить...

Далее, при описании структур таблиц bid и offer надо написать, что эти таблицы являются массивами из таблиц, каждая из которых состоит из двух пар ключ-значение, причём, значение для ключа quantity заканчивается на подстроку ".0", которую необходимо удалять. Это, чтобы не удивлялись...
Неплохо бы привести пример для пояснения структуры всей этой таблицы для стакана.

Аналогичные исправления надо сделать в англоязычной версии этого файла, в
Lua Interpreter.pdf.
Что будет, если внешняя dll изменит содержимое строки Lua?
 
Кстати, хотел спросить: почему на lua.org исходники даются для вер. 5.4.6, а бинарники лишь для вер. 5.4.2?
В составе Квика lua54.dll откуда берётся: квиковцы компилируют её из исходников? Они что-то перед компиляцией меняют в исходниках Lua?
Что будет, если внешняя dll изменит содержимое строки Lua?
 
Цитата
nikolz написал:
Где в вашем примере структура?
Не в моём примере структура, а в Lua структура в файле lobject.h:
Код
/*
** Header for a string value.
*/
typedef struct TString {
  CommonHeader;
  lu_byte extra;  /* reserved words for short strings; "has hash" for longs */
  lu_byte shrlen;  /* length for short strings */
  unsigned int hash;
  union {
    size_t lnglen;  /* length for long strings */
    struct TString *hnext;  /* linked list for hash table */
  } u;
  char contents[1];
} TString;
Цитата
nikolz написал:
"Один дурак может задать столько вопросов,что сто мудрецов не смогут ответить"
Ну так не задавайте...
Цитата
TGB написал:
 Далее:  char* str_h = (char*) Адрес структуры; И с str_h (указатель открытый для записи) делаете все, что хотите (в пределах размера строки).
Я уже написал dll с прямым доступом, которая меняет содержимое и размер строки, он работает. Также работает пример с массивом и хождением по нодам с поиском элемента по ключу. М.б. по примеру Миши Флёнова напишу книжку "Lua глазами хакера" (за почасовую ставку школьной уборщицы). :smile:

Чукча не читатель, чукча писатель :smile:
https://intuit.ru/goods_store/books/121
https://shop-re-books.ru/catalog/knigi/nekhudozhestvennaya_literatura/kompyuternye­_tekhnologii/31118...
https://bhv.ru/product/delphi-i-turbo-pascal-na-zanimatelnyh-primerah/
https://www.amazon.com/Flash-Game-Developing-Handbook/dp/1931769478
Цитата
TGB написал:
Вам интересно стрелять по своим ногам?
Примеры хоть и работают, но ноги иногда чувствуют себя неуютно. :smile:
Цитата
TGB написал:
для вас имеет смысл все, кроме интерфейса с QUIK, писать на C (а может быть на MASM   ).
Надо как-то оценить, в каком случае будет быстрее работать и во сколько раз. Сейчас на 2-ядерном ЦП, подозреваю, что и поток Квика с коллбэками и поток с main могут выполняться на одном ядре, поэтому с переносом работы в поток main и ожиданием события может получиться полная ерунда, надо будет это проверить на 6-ядерном ЦП.

Сейчас gcc настолько хорошо оптимизирует, что я как-то написал оптимизированную программку на flat assembler, а на C аналогичная работала заметно быстрее...
Что будет, если внешняя dll изменит содержимое строки Lua?
 
Цитата
nikolz написал:
как вы предполагаете изменить значение локальной переменной.  Она не передается как таблицы по указателю, поэтому Вы не получите к ней доступ в функции, а получите ее копию.
Странное рассуждение... Адрес структуры для локальной строки передаётся в виде указателя в параметре при вызове из Lua скрипта моей dll.

А вдруг кто-то знает, но не хочет сказать... Вот TGB, по-моему, глубоко копает.
Что будет, если внешняя dll изменит содержимое строки Lua?
 
Возможность менять строку из dll может означать, что не надо будет оправлять эту строку в мусор хрен знает сколько раз. :smile:
Что будет, если внешняя dll изменит содержимое строки Lua?
 
Цитата
paluke написал:
Или вы хотите разбираться с тем, как поменять значение в обход api, c рисками неопределенного поведения, ради ускорения в ноль целых хрен десятых процента?
Да, хочу, чтобы кто-то знающий подтвердил, что это будет незаметно для Луа (меня беспокоит какой-то непонятный буфер удалённых строк), на будущее может пригодиться в хозяйстве. Только почему сразу ноль целых хрен десятых, а вдруг будет больше? :smile:
Что будет, если внешняя dll изменит содержимое строки Lua?
 
Здесь подразумевается, что str изменилась с пом. моей dll. Вопрос: будет ли после этого скрипт работать корректно? Зачем для этого выписывать эту dll, она просто изменяет байты в массиве с содержимым этой строки...
Почему в этой программке утекает память??
 
Цитата
paluke написал:
В колбеках вызываете SetEvent - main сразу просыпается.
Ух, ты, спасибо, попробую. А я сегодня с утра думал, что будет выходной. :smile:
Почему в этой программке утекает память??
 
Цитата
paluke написал:
Где-то пролетала ссылка на библиотечку w32 для lua.
https://quik2dde.ru/viewtopic.php?id=78
Почему в этой программке утекает память??
 
Цитата
paluke написал:
Где-то пролетала ссылка на библиотечку w32 для lua. Там есть CreateEvent / WaitForSingleObject. Надо попробовать, должно работать...
Сегодня на этом форуме читал старые споры и препирательства, в которых говорилось, что мьютексы работают медленно и подходят для синхронизации потоков из разных процессов. А в одном процессе надо использовать какую-то критическую секцию. Я пока не знаю, что это такое и как это сделать быстрее, чем с мьютексами...

О, нашёл это сообщение в истории своего браузера: https://forum.quik.ru/messages/forum10/message13513/topic1464/#message13513

Цитата
paluke написал:
Вот продали вы один лот ценой 1.3862, а получили 1.39 из-за округления.
А, что-то я о таком слышал. Но для этого надо иметь право продавать без очереди. Читал, что ММ имеет такое право. Интересно, у фонда какого-то банка ММом может быть другой банк?
Что будет, если внешняя dll изменит содержимое строки Lua?
 
Цитата
swerg написал:
Покажите пример
local str = 'abc'

При этом str не используется для индексирования в таблицах, т.е. нет такого: table.str ...
Что будет, если внешняя dll изменит содержимое строки Lua?
 
Если есть просто строка Lua, ссылок на которую нет в таблицах, то изменение такой строки не повлечёт неожиданностей в работе скрипта? Возможные варианты: длина строки не меняется/уменьшается. Мне кажется, это может повлиять только на подсчёт хэша от этой строки, а кому он нужен в данном случае? Но, как я заметил по исходникам Lua, у Lua есть какой-то кэшбуфер удалённых сборкой мусора строк, я не понял, что это такое и для чего он используется...

Примечание: если dll уменьшает размер строки, то она корректирует это в поле длины строки (и если надо, типе строки: короткая/длинная строка).
Почему в этой программке утекает память??
 
Цитата
nikolz написал:
Можете взять  библиотеку w32 для Lua:
А какие функции из неё нужны для данного случая? И чтобы они работали как можно быстрее?
Цитата
nikolz написал:
Если не ошибаюсь, Вы осваиваете написание dll для луа.
Осваиваю, но в других темах форума. А в этой теме я осваиваю Луа скрипты.  :smile:  
Почему в этой программке утекает память??
 
Видимо, имелось в виду, что длл получает инфо, что коллбэк что-то записал в очередь, и длл запускает main, которая всё остальное время спит. Или что-то подобное.
Почему в этой программке утекает память??
 
https://lua.org/manual/5.4/
Где тут wait и event? Я о таких тайных заклинаниях ничего не знаю...
Почему в этой программке утекает память??
 
Цитата
nikolz написал:
Вместо sleep ставим wait в  и создаем event.
Я ничего не слышал об этих функциях, нужен пример использования в Lua.
Почему в этой программке утекает память??
 
Цитата
nikolz написал:
Кроме того, у меня нет sleep. Поэтому задержка на обработку любого колбека не более 0.1 ms. Это на порядки меньше чем задержка со sleep.
Здесь я не понял, о каком sleep идёт речь. У меня в скрипте sleep(10) используется один раз в main в цикле обработки очереди от коллбэков. В Lua по-моему нельзя прервать паузу, если в мой массив (очередь) коллбэк что-то записал.
Почему в этой программке утекает память??
 
Цитата
nikolz написал:
По одной заявке выставляют HFT роботы, скальперы и ММ.
А какой смысл это делать на дешёвом инструменте с шагом цены ноль целых шиш десятых копейки?
Почему в этой программке утекает память??
 
Цитата
Игорь М написал:
Если вы на открытии сделки совершаете, то помимо непосредственно ваших сделок ещё и большой поток информации в эти моменты приходит, поэтому Квик это тяжело переваривает.
Да, я видел, что причина торможения во время моих сделок в том, что иногда почему-то идёт большое число мелких сделок, напр., десятки сделок по 1 акции. Я так и не могу понять, зачем кто-то выставляет заявки по одной акции, как будто кто-то отлаживает свою программу или что-то тестирует. Если нет потока мелких сделок, то торможения нет.
Почему в этой программке утекает память??
 
Цитата
Игорь М написал:
Предполагаю, что Сергей описывал ситуацию зависания при приходе его личных сделок ("когда идёт много моих сделок, я ясно вижу торможение") , хотя конкретики мало дал. Отключать алгоритм Нейгла ему смысла нет. Его никто не отключает и у всех всё работает, значит, не в нём дело.
Точно, я даже предположил, что особенно на задержку влияют звуковые сигналы.
Какая нужна конкретика?
Где-то до октября 2023 я и в утреннюю и в вечернюю сессии удачно выставлял заявки с пом. скрипта, иногда даже видел по содержимому стаканов в файле, что я в очереди первый. Первым быть не всегда хорошо, потому что во время премаркета бывает в сумме крупная встречная заявка, за это снимают деньги. Но потом перестало получаться попадать в начало очереди на вечерней сессии (а утром по-прежнему всё ОК). Такое впечатление, что мосбиржа вечером варьирует время начала приёма заявок в пределах 2 секунд. То ли вечером возникли какие-то задержки (в том числе с получением ответов от сервера на заявки). Поэтому я и решил попробовать вечером отключить алгоритм Нейгла, но от этого получился полный затык в работе Квика.
Почему в этой программке утекает память??
 
Вкратце:

Вызвать regedit, перейти в ветку
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\P­arameters\Interfaces\
и далее зайти в подветку, где есть параметр DhcpIPAddress, который равен моему IP.
Добавить/изменить 2 параметра (вначале их там нет):
DWORD 32 бита TcpAckFrequency и TCPNoDelay со значением 1.
Для его восстановления надо установить эти 2 параметра в 0.
Для вступления в силу изменённых параметров надо перезагрузить ПК.
Почему в этой программке утекает память??
 
Цитата
nikolz написал:
Если правильно отключаете, то этого быть не может даже теоретически.
Я отключал, как здесь написано:
https://vk.com/@scum_survival-algoritm-neigla
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
Nikolay написал:
Если речь была про задержку потока main, то да она должна быть.
Как раз хотел спросить: какую задержку выставлять в main после цикла обработки очереди от OnAllTrade и OnQuote? Я сделал 10 мс, может, есть более правильная задержка?
Почему в этой программке утекает память??
 
Цитата
nikolz написал:
Возможно Вы знаете, но причина тормозов при отправке заявки может быть из-за  алгоритма Нэгла.
Я попробовал его отключить, но Квик начал очень сильно тормозить, занятость ЦП 82%, только и делал, что крутил бублик вместо курсора мыши, я не смог ничего сделать. Поэтому отключение этого алгоритма не для этого 2-ядерного ПК. Попробую на другом ПК.
Почему в этой программке утекает память??
 
Цитата
TGB написал:
Возможно я ошибаюсь, но вашей целью является получение прибыли на фондовом рынке.
Спасибо, что напомнили, а то я в перфекционистско-программистском угаре действительно часто об этом забываю...

В диспетчере задач занятость CPU показывает 4-12% (память занята на ~40%), во время сделки занятость CPU подскакивает до 23%, (при свёрнутом окне Квика 13%), но, когда идёт много моих сделок, я ясно вижу торможение, возможно, в связи с проигрыванием короткого звука для каждой сделки. В это время слышны только звуки, содержимое окон сделок и заявок не обновляется, щелчки по стаканам для выставления заявок не отрабатываются по несколько секунд. Иногда приходится завершать скрипт, который записывает в файл стаканы и все сделки по инструменту.

И ещё я вижу торможение, когда окно "Доступные скрипты" располагаю поверх стаканов. В этом случае хорошо видно, что циферки занятости памяти напротив скрипта перерисовываются не мгновенно. Хотя, GPU в диспетчере тоже простаивает, как и CPU. Поэтому я не знаю, как объяснить это торможение. Если перенести это окно на фоновую область окна Квика, то циферки рисуются мгновенно.

Перед началом работы я в диспетчере задач на всякий случай ставлю процессу info.exe высокий приоритет. Но каких-то изменений в связи с этим я не заметил.
Звук через mciSendString и MessageBeep
 
Цитата
paluke написал:
Ну например, может оно как-то использует оконные сообщения.
Сомнительно: не видно логики для неработоспособности этой функции в консольных программах. И в документации на сайте МС нет такого предупреждения... Аналогично для более современной функции PlaySound.
Как тогда МС вообще планирует использование звука в консольных программах??
Почему в этой программке утекает память??
 
Цитата
nikolz написал:
У вас память растет медленно и мало. Нет смысла запускать сборщик, так как он будет тормозить VMLua.
В принципе, ясно. Тогда, получается, что у меня память не утекает? Надо попробовать запустить сборщик мусора явно и посмотреть, сколько памяти освободится.

Я сегодня ещё подумал, что м.б. дело ещё в том, что сейчас у меня ПК с 2-мя ядрами, поэтому ядра всё время заняты и переключаются для выполнения разных потоков. А поток сборщика мусора, как я понимаю, имеет наинизший приоритет, поэтому до его выполнения на этом моём ПК дело не доходит.
Почему в этой программке утекает память??
 
collectgarbage("collect") помогает, даже слишком: в момент запуска в окне "Доступные скрипты" показывается, что занято скриптом 36.53 Кб, потом память, как и раньше, растёт, а в конце, после вызова collectgarbage, она становится 35.43 Кб. Чтобы это увидеть, я после collectgarbage вставил sleep(1000). Но остаётся вопрос: почему сборщик мусора не освобождает память во время работы цикла??

И ещё я мог бы опубликовать свой скрипт, который записывает в файл стакан и сделки по OnQuote и OnAllTrade, чтобы народ посмотрел и сказал, почему он потихоньку увеличивает занятую память, хотя, файловых операций не выполняет? Но боюсь, что, если никто не знает, почему, то просто не ответят, чтобы не признавать, что кто-то что-то не знает. Был уже пример на такую тему: я спросил, почему mciSendString в dll работает, а в exe файле то же самое не даёт звука, даже привёл программку. Так никто не ответил (видимо, никто не знает и в Интернете ответ не находится).

Насколько я понимаю, сборку мусора вроде бы надо делать так: в структуре каждого объекта ставят счётчик ссылок на него, тогда сборщик мусора просто просматривает эту информацию и бысто освобождает память под объекты со счётчиками ссылок == 0. Но в Lua, похоже, сборщик мусора просматривает вообще всё, что попало и смотрит, есть ли там ссылки на какие-то объекты. А если в программе имеется таблица из миллиона таблиц, тогда что делать сборщику мусора, кроме как тормозить программу?
339 сделок по одному тикеру в течение 1 мкс
 
Хотя, т.к. изменения в стаканах приходят кучей, и вроде бы с каким-то наименьшим периодом (> 0.01 с.), то о точном времени здесь говорить не приходится.
339 сделок по одному тикеру в течение 1 мкс
 
Цитата
Serge123 написал:
а откуда мне его ещё взять (от getQuoteLevel2 вестимо...)?
Ошибся, время здесь я беру через ossysdate() опять же с моего ПК. Ни OnQuote, ни getQuoteLevel2 времени не дают (хотя, здесь кто-то просил об этом в 2015 г. нашей эры...)
339 сделок по одному тикеру в течение 1 мкс
 
Цитата
nikolz написал:
У Вас время  09:50:00  не содержит микросекунд.  Это время Вашего компьютера, а не биржи.
Все времена содержат микросекунды, а время для содержимого стакана, естественно, берётся с моего ПК, а откуда мне его ещё взять (от getQuoteLevel2 вестимо...)? А время сделок, видимо, передаётся в OnAllTrade с сервера биржи(?)
339 сделок по одному тикеру в течение 1 мкс
 
В файлике a1.txt видно, что два рекорда по числу сделок с неизменным временем были не на аукционе открытия.
А почему время сделок не меняется, можно только предполагать, а может кто-то, кто сидит ближе к мосбирже, спросит у неё: как объясняется этот феномен?
339 сделок по одному тикеру в течение 1 мкс
 
Закачал сюда этот файл с содержимым стаканов и сделками:
drive.google.com/file/d/1fbPQM0Xfd-ULQFV7M0vBPW8m_6boaulj/view?usp=sharing
Там на 3-х отрезках за одно и то же время происходит > 300 сделок.
Рекорд 509 сделок, почему-то в этом месте много сделок с одной акцией, кто объяснит?
Где рекордные сделки искать, см. в файлике a1.txt.
Почему в этой программке утекает память??
 
Цитата
Nikolay написал:
Проверьте с новой нотацией  , что была введена в lua 5.4
Проверил, память утекает раза в 2 сильнее...
А где можно прочитать о нововведениях с примерами, я использовал только <const>, видел упоминание о <clear>, но поиск по документации в архиве lua-5.4.6.tar.gz с сайта lua.org не находит ни <const> ни аналогичных образцов...
Почему в этой программке утекает память??
 
Цитата
TGB написал:
Неиспользуемым ссылкам надо присваивать nil.
Попробую присваивать ссылкам на таблицы nil, хотя, я не понимаю, что от этого изменится для сборщика мусора... Ссылке на таблицу можно присвоить nil, а потом можно ещё что-нибудь присвоить, а сборщик мусора не заметит, что было присвоено nil. А если переменная объявлена внутри блока, то после завершения блока она вроде бы должна сталь nil. А что, если будет опять передача управления в этот блок и опять эта переменная получит значение, это будет та же самая переменная, или на неё каждый раз будет выделятья память? Я этого не представляю. Каждый раз выделять память переменной в блоке, который может быть внутри цикла, - дорогое удовольствие с точки зрения быстродействия...

В прошлой версии скрипта эти таблицы передавались как параметры коллбэка, а таблица от getQuoteLevel2 была локальной переменной в OnQuote, поэтому ссылкам на эти таблицы я ничего не присваивал (а зачем?) Но память всё равно почему-то потихоньку утекала.
До каких пор живёт таблица, передаваемая функции?
 
Интересно: как можно проверить, что мой вариант скрипта, в котором я перенёс обработку стаканов и обезл. сделок в main, имеет смысл? Мне кажется, что добавилось лишней работы в потоке main с разбором очереди, а в потоке Квика работа уменьшилась неощутимо...
Страницы: 1 2 3 4 5 6 7 След.
Наверх