Почему в этой программке утекает память??

Страницы: 1 2 След.
RSS
Почему в этой программке утекает память??
 
С каждой записью в файл утекает ~ 50 байтов памяти, а почему она не собирается сборщиком мусора??
Код
local mess = 'abc'

local function toFile()
 local lf=io.open('srrhb346fhs', 'ab')
 lf:write(mess)
 lf:close()
end

function main()
 for i = 1, 20 do
  toFile()
  sleep(1000)
 end
end
 
Цитата
Serge123 написал:
С каждой записью в файл утекает ~ 50 байтов памяти, а почему она не собирается сборщиком мусора??
  Утечка есть. Это ошибка разработчика языка Lua 5.4.1 при реализации стандартных функций io.  Файлы это не тип данных Lua и сборщиком мусора они не обрабатываются, поэтому и требуется функция close (в которой похоже есть ошибка).
 
Цитата
TGB написал:
Утечка есть.
Спасибо, интересно... А до вер. 5.4.1 этой ошибки не было?
Я подозреваю, что утечка памяти имеется не только при работе с файлами: как я вчера писал в другой ветке, мой скрипт по записи в файл содержимого стаканов и обезл. сделок потихоньку увеличивает занятую память, хотя в это время нет работы с файлом и я присваиваю false ссылкам на таблицы...
 
Цитата
Serge123 написал:
я присваиваю false ссылкам на таблицы
  Неиспользуемым ссылкам надо присваивать nil.
 
Цитата
TGB написал:
Неиспользуемым ссылкам надо присваивать nil.
Попробую присваивать ссылкам на таблицы nil, хотя, я не понимаю, что от этого изменится для сборщика мусора... Ссылке на таблицу можно присвоить nil, а потом можно ещё что-нибудь присвоить, а сборщик мусора не заметит, что было присвоено nil. А если переменная объявлена внутри блока, то после завершения блока она вроде бы должна сталь nil. А что, если будет опять передача управления в этот блок и опять эта переменная получит значение, это будет та же самая переменная, или на неё каждый раз будет выделятья память? Я этого не представляю. Каждый раз выделять память переменной в блоке, который может быть внутри цикла, - дорогое удовольствие с точки зрения быстродействия...

В прошлой версии скрипта эти таблицы передавались как параметры коллбэка, а таблица от getQuoteLevel2 была локальной переменной в OnQuote, поэтому ссылкам на эти таблицы я ничего не присваивал (а зачем?) Но память всё равно почему-то потихоньку утекала.
 
Проверьте с новой нотацией <close>, что была введена в lua 5.4

local f <close> = assert(io.open(file, "ab"))

При это руками закрывать файл уже не надо.
 
Цитата
Nikolay написал:
Проверьте с новой нотацией  , что была введена в lua 5.4
Проверил, память утекает раза в 2 сильнее...
А где можно прочитать о нововведениях с примерами, я использовал только <const>, видел упоминание о <clear>, но поиск по документации в архиве lua-5.4.6.tar.gz с сайта lua.org не находит ни <const> ни аналогичных образцов...
 
Цитата
Serge123 написал:
С каждой записью в файл утекает ~ 50 байтов памяти, а почему она не собирается сборщиком мусора??
Код
попробуйте так:
Код
 function   main ()
  for  i  =   1 ,  20   do   toFile()   sleep ( 1000 )  end 
collectgarbage("collect")
 end   
 
collectgarbage("collect") помогает, даже слишком: в момент запуска в окне "Доступные скрипты" показывается, что занято скриптом 36.53 Кб, потом память, как и раньше, растёт, а в конце, после вызова collectgarbage, она становится 35.43 Кб. Чтобы это увидеть, я после collectgarbage вставил sleep(1000). Но остаётся вопрос: почему сборщик мусора не освобождает память во время работы цикла??

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

Насколько я понимаю, сборку мусора вроде бы надо делать так: в структуре каждого объекта ставят счётчик ссылок на него, тогда сборщик мусора просто просматривает эту информацию и бысто освобождает память под объекты со счётчиками ссылок == 0. Но в Lua, похоже, сборщик мусора просматривает вообще всё, что попало и смотрит, есть ли там ссылки на какие-то объекты. А если в программе имеется таблица из миллиона таблиц, тогда что делать сборщику мусора, кроме как тормозить программу?
 
Документацию не пробовали почитать? https://www.lua.org/manual/5.4/manual.html#2.5
 
Цитата
Note that the time when the collector can be sure that an object is dead may not coincide with the programmer's expectations.
 
Цитата
Serge123 написал:
сборщик мусора в настоящее время используется во многих языках. И основное отличие - алгоритм  самой сборки и определение момента сборки.
Если кратко, то в луа сборщик контролирует скорость выделение памяти и ее увеличение и в зависимости от этого начинает утилизацию.
У вас память растет медленно и мало. Нет смысла запускать сборщик, так как он будет тормозить VMLua.
Если памяти на компе достаточно, то его даже вообще отключают.
Вы можете поиграть с настройками и подобрать нужный для вас режим сборки.
 
Serge123,
Чтобы не гонять постоянно сборщик, я создаю таблицы требуемого размера изначально и потом не уничтожаю их.
В результате сборщику просто нечего делать.
 
Цитата
nikolz написал:
У вас память растет медленно и мало. Нет смысла запускать сборщик, так как он будет тормозить VMLua.
В принципе, ясно. Тогда, получается, что у меня память не утекает? Надо попробовать запустить сборщик мусора явно и посмотреть, сколько памяти освободится.

Я сегодня ещё подумал, что м.б. дело ещё в том, что сейчас у меня ПК с 2-мя ядрами, поэтому ядра всё время заняты и переключаются для выполнения разных потоков. А поток сборщика мусора, как я понимаю, имеет наинизший приоритет, поэтому до его выполнения на этом моём ПК дело не доходит.
 
Цитата
Serge123 написал:
sleep ( 1000 )
Нет, ядра у Вас не сильно заняты. Вы можете это увидеть в диспетчере задач.
--------------------
У Вас в main используется sleep(1000) т е Вы останавливаете поток Main на 1 секунду.
В винде квант, который выделяется задаче составляет 15 ms.
У Вас VMLua в потоке работает  1 квант из 60, т е примерно 2% доступного времени.  
 
Цитата
Serge123 написал:
В принципе, ясно. Тогда, получается, что у меня память не утекает? Надо попробовать запустить сборщик мусора явно и посмотреть, сколько памяти освободится.
   Возможно я ошибаюсь, но вашей целью является получение прибыли на фондовом рынке. А если это так, то тестирование Qlua - это потеря вашего времени.
   Я понимаю, что вы по своей натуре перфекционист (все должно быть понятно и идеально), но вам приходится жить в этом неидеальном мире и поэтому, как мне кажется, стоит "забить" на его несовершенство. Среда, в которой вы реализуете свои алгоритмы несовершенна, но этим стоит заниматься только тогда, когда это вам мешает конкретно.  Иначе вы будете решать чужие задачи (вроде отладки Lua).
 
Цитата
TGB написал:
Возможно я ошибаюсь, но вашей целью является получение прибыли на фондовом рынке.
Спасибо, что напомнили, а то я в перфекционистско-программистском угаре действительно часто об этом забываю...

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

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

Перед началом работы я в диспетчере задач на всякий случай ставлю процессу info.exe высокий приоритет. Но каких-то изменений в связи с этим я не заметил.
 
Цитата
Serge123 написал:
И ещё я вижу торможение, когда окно "Доступные скрипты" располагаю поверх стаканов. В этом случае хорошо видно, что циферки занятости памяти напротив скрипта перерисовываются не мгновенно. Хотя, GPU в диспетчере тоже простаивает, как и CPU. Поэтому я не знаю, как объяснить это торможение.
   Натуру не исправить  :smile: .
 
Цитата
Serge123 написал:
В диспетчере задач занятость CPU показывает 4-12% (память занята на ~40%), во время сделки занятость CPU подскакивает до 23%, (при свёрнутом окне Квика 13%), но, когда идёт много моих сделок, я ясно вижу торможение, возможно, в связи с проигрыванием короткого звука для каждой сделки. В это время слышны только звуки, содержимое окон сделок и заявок не обновляется, щелчки по стаканам для выставления заявок не отрабатываются по несколько секунд. Иногда приходится завершать скрипт, который записывает в файл стаканы и все сделки по инструменту.
При обработке многих сделок сразу подвисание на 2-3 секунды это нормально. Это и от звука, и от версии Квика, и от процессора зависит, от всего, короче. Такие зависания - обычное дело, а вы ещё и стаканы в файл записываете. Главное, что всё срабатывает, а отображение на экране и работа контролов GUI вторично.
 
Цитата
Serge123 написал:
Спасибо, что напомнили, а то я в перфекционистско-программистском угаре действительно часто об этом забываю...

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

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

Перед началом работы я в диспетчере задач на всякий случай ставлю процессу info.exe высокий приоритет. Но каких-то изменений в связи с этим я не заметил.
Это не очень нормальное поведение. У меня бывает до 1000 транзакций. Каких-то особых "зависаний" не наблюдается. Впрочем, если Вы активно используете основной поток терминала, т.е. производите действия в колбеках, то вполне возможно, что так и будет. Я придерживаюсь мнения, что колбек это событие, которое необходимо обрабатывать в потоке main скрипта. Кроме как записать в очередь тип события в колбеке ничего не делается. Что касается железа, то я уже лет 15 не работал на машинах где было меньше 16-32 гб и 4 ядер, так что не знаю как терминал реагирует на слабое железо.

Также писал скрипт для проверки возможности записи слепка стакана в базу данных, а второй скрипт из базы уже читал и выводил в окно этот стакан. Тоже как-то все работало корректно, без особых притормаживаний.

Правда для светлой темы было такое - https://forum.quik.ru/messages/forum10/message46407/topic3777/#message46407. Ошибку, ниже в той ветке, обещали исправить. Давно не проверял починили ли, т.к. использую все тот же костыль для светлой темы.
 
Цитата
Serge123 написал:

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

Перед началом работы я в диспетчере задач на всякий случай ставлю процессу info.exe высокий приоритет. Но каких-то изменений в связи с этим я не заметил.
Сказать, что конкретно у Вас тормозит не делая лог файлы не реально.
------------------  
Могу лишь рассказать результаты моих тестов, которые указывают на то, что КВИК может работать очень быстро.
Я выкладывал результаты КРАШ теста, который делал на демо сервере.
В тесте я принимал инструменты по колбеку onParam и выставлял на принятый инструмент заявку на покупку в очередь,
После подтверждения регистрации заявки на сервере, я отменял ее.
В результате 4 часового теста было выставлено и снято  более 200 тысяч заявок (это 400 тысяч транзакций) по 200 инструментам.
Никаких тормозов я не заметил.
Терминал тратил на отправку очередной транзакции не более 0.1 ms.
-----------------  
После этого теста получил предупреждение от разработчиков, чтобы больше так не грузил их сервер.
------------------------  
Поэтому полагаю у Вас может быть либо проблема с Вашим скриптом, либо с Вашим брокером.
Сделайте вывод в лог файл  в колбеке и в main и сделайте анализ задержек.  
 
Serge123

Возможно Вы знаете, но причина тормозов при отправке заявки может быть из-за  алгоритма Нэгла.
Я его отключал на своем ПК.
 
Цитата
nikolz написал:
Возможно Вы знаете, но причина тормозов при отправке заявки может быть из-за  алгоритма Нэгла.
Я попробовал его отключить, но Квик начал очень сильно тормозить, занятость ЦП 82%, только и делал, что крутил бублик вместо курсора мыши, я не смог ничего сделать. Поэтому отключение этого алгоритма не для этого 2-ядерного ПК. Попробую на другом ПК.
 
Цитата
Nikolay написал:
 Это не очень нормальное поведение. У меня бывает до 1000 транзакций. Каких-то особых "зависаний" не наблюдается.

Цитата
nikolz написал:
В результате 4 часового теста было выставлено и снято  более 200 тысяч заявок (это 400 тысяч транзакций) по 200 инструментам.
Никаких тормозов я не заметил.
Как я понял, он про сделки писал, а не про транзакции. На транзакциях у меня тоже не наблюдается задержек, а когда много сделок приходит разом, бывает что бублик 2-3 секунды крутится, особенно, если в этот момент пытаешься в Квике что-то делать. При этом в лог всё в нормальное время пишется без особых задержек, так что я не думаю, что здесь проблема из-за интернета. Для процессора на 4ГГц будет задержка в 1-1,5 секунды в подобной ситуации и на неё внимание просто не обращают. Прямая зависимость времени зависания от количества поступивших на обработку записей в таблицу сделок и частоты процессора. Сергей не написал какое количество записей в таблицу сделок пришло, какой у него проц по частоте и сколько зависание в секундах длилось, а так по его описанию у меня тоже бывают такие моменты, но 2-3 секунды это не проблема, конечно.
 
Цитата
Игорь М написал:
Цитата
Nikolay написал:
 Это не очень нормальное поведение. У меня бывает до 1000 транзакций. Каких-то особых "зависаний" не наблюдается.

Цитата
nikolz написал:
В результате 4 часового теста было выставлено и снято  более 200 тысяч заявок (это 400 тысяч транзакций) по 200 инструментам.
Никаких тормозов я не заметил.
Как я понял, он про сделки писал, а не про транзакции. На транзакциях у меня тоже не наблюдается задержек, а когда много сделок приходит разом, бывает что бублик 2-3 секунды крутится, особенно, если в этот момент пытаешься в Квике что-то делать. При этом в лог всё в нормальное время пишется без особых задержек, так что я не думаю, что здесь проблема из-за интернета. Для процессора на 4ГГц будет задержка в 1-1,5 секунды в подобной ситуации и на неё внимание просто не обращают. Прямая зависимость времени зависания от количества поступивших на обработку записей в таблицу сделок и частоты процессора. Сергей не написал какое количество записей в таблицу сделок пришло, какой у него проц по частоте и сколько зависание в секундах длилось, а так по его описанию у меня тоже бывают такие моменты, но 2-3 секунды это не проблема, конечно.
В моем тесте использовался колбек опParam , а это и есть сообщения, которые отображаются в ТТП. Там не только сделки, но и любые изменения по инструменту. Тест выставлял заявки по инструменту, по которому совершена сделка.  Снимал заявку, когда она зарегистрирована сервером, т е выставлена в стакан.
Тормоз 2-3 секунды наблюдается в КВИКЕ, если много окон и других приложений открыто. Я такое наблюдал давно на одноядерном компе по XP.
------------------
Можно увидеть это вечером, когда мало сделок или на неликвиде..
---------------
Но что конкретно происходит без логов сказать точно невозможно.  
 
Цитата
Serge123 написал:
Цитата
nikolz написал:
Возможно Вы знаете, но причина тормозов при отправке заявки может быть из-за  алгоритма Нэгла.
Я попробовал его отключить, но Квик начал очень сильно тормозить, занятость ЦП 82%, только и делал, что крутил бублик вместо курсора мыши, я не смог ничего сделать. Поэтому отключение этого алгоритма не для этого 2-ядерного ПК. Попробую на другом ПК.
Если правильно отключаете, то этого быть не может даже теоретически.
алгоритм не связан с числом ядер. Он просто не отсылает Ваши пакеты в интернет пока они не станут большими или не пройдет достаточно много времени. Если Вы ничего не посылаете, то нет никакой разницы включен он или нет.
 
Serge123,
Я отключал этот алгоритм даже на одноядерной машине.
 
Цитата
nikolz написал:
Если правильно отключаете, то этого быть не может даже теоретически.
Я отключал, как здесь написано:
https://vk.com/@scum_survival-algoritm-neigla
 
Вкратце:

Вызвать regedit, перейти в ветку
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\P­arameters\Interfaces\
и далее зайти в подветку, где есть параметр DhcpIPAddress, который равен моему IP.
Добавить/изменить 2 параметра (вначале их там нет):
DWORD 32 бита TcpAckFrequency и TCPNoDelay со значением 1.
Для его восстановления надо установить эти 2 параметра в 0.
Для вступления в силу изменённых параметров надо перезагрузить ПК.
 
Цитата
Serge123 написал:
Вкратце:

Вызвать regedit, перейти в ветку
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\P­ ­arameters\Interfaces\
и далее зайти в подветку, где есть параметр DhcpIPAddress, который равен моему IP.
Добавить/изменить 2 параметра (вначале их там нет):
DWORD 32 бита TcpAckFrequency и TCPNoDelay со значением 1.
Для его восстановления надо установить эти 2 параметра в 0.
Для вступления в силу изменённых параметров надо перезагрузить ПК.
вроде все так.
Этот алгоритм с давних времен отключают для игр по интернету.
-----------------------
проверил ничего не виснет.
 
Цитата
nikolz написал:
 В моем тесте использовался колбек опParam , а это и есть сообщения, которые отображаются в ТТП. Там не только сделки, но и любые изменения по инструменту. Тест выставлял заявки по инструменту, по которому совершена сделка.  Снимал заявку, когда она зарегистрирована сервером, т е выставлена в стакан.
Тормоз 2-3 секунды наблюдается в КВИКЕ, если много окон и других приложений открыто. Я такое наблюдал давно на одноядерном компе по XP.
------------------
Можно увидеть это вечером, когда мало сделок или на неликвиде..
---------------
Но что конкретно происходит без логов сказать точно невозможно.  
Видимо, тут и есть недопонимание. Я писал про сделки совершенные мной лично и таблицу сделок в режиме их прихода. Когда их разом приходит много, бывают (не всегда) зависания по 2-3 секунды (окна и прочее у меня всегда одни и те же). Поэтому ваш тест не показателен, он про другое. Предполагаю, что Сергей описывал ситуацию зависания при приходе его личных сделок ("когда идёт много моих сделок, я ясно вижу торможение") , хотя конкретики мало дал. Отключать алгоритм Нейгла ему смысла нет. Его никто не отключает и у всех всё работает, значит, не в нём дело. Вы первый человек на моей памяти, который его отключал.
 
Цитата
Игорь М написал:
Предполагаю, что Сергей описывал ситуацию зависания при приходе его личных сделок ("когда идёт много моих сделок, я ясно вижу торможение") , хотя конкретики мало дал. Отключать алгоритм Нейгла ему смысла нет. Его никто не отключает и у всех всё работает, значит, не в нём дело.
Точно, я даже предположил, что особенно на задержку влияют звуковые сигналы.
Какая нужна конкретика?
Где-то до октября 2023 я и в утреннюю и в вечернюю сессии удачно выставлял заявки с пом. скрипта, иногда даже видел по содержимому стаканов в файле, что я в очереди первый. Первым быть не всегда хорошо, потому что во время премаркета бывает в сумме крупная встречная заявка, за это снимают деньги. Но потом перестало получаться попадать в начало очереди на вечерней сессии (а утром по-прежнему всё ОК). Такое впечатление, что мосбиржа вечером варьирует время начала приёма заявок в пределах 2 секунд. То ли вечером возникли какие-то задержки (в том числе с получением ответов от сервера на заявки). Поэтому я и решил попробовать вечером отключить алгоритм Нейгла, но от этого получился полный затык в работе Квика.
 
Цитата
Serge123 написал:
Какая нужна конкретика?
Если вы на открытии сделки совершаете, то помимо непосредственно ваших сделок ещё и большой поток информации в эти моменты приходит, поэтому Квик это тяжело переваривает. А, вообще, нужно знать время, когда зависание происходит, количество сделок (строк в таблице сделок (собственных)), частоту процессора, что ещё одновременно работает и т.п., и, главное, сколько сама задержка длится.
 
Цитата
Игорь М написал:
Цитата
nikolz написал:
 В моем тесте использовался колбек опParam , а это и есть сообщения, которые отображаются в ТТП. Там не только сделки, но и любые изменения по инструменту. Тест выставлял заявки по инструменту, по которому совершена сделка.  Снимал заявку, когда она зарегистрирована сервером, т е выставлена в стакан.
Тормоз 2-3 секунды наблюдается в КВИКЕ, если много окон и других приложений открыто. Я такое наблюдал давно на одноядерном компе по XP.
------------------
Можно увидеть это вечером, когда мало сделок или на неликвиде..
---------------
Но что конкретно происходит без логов сказать точно невозможно.  
Видимо, тут и есть недопонимание. Я писал про сделки совершенные мной лично и таблицу сделок в режиме их прихода. Когда их разом приходит много, бывают (не всегда) зависания по 2-3 секунды (окна и прочее у меня всегда одни и те же). Поэтому ваш тест не показателен, он про другое. Предполагаю, что Сергей описывал ситуацию зависания при приходе его личных сделок ("когда идёт много моих сделок, я ясно вижу торможение") , хотя конкретики мало дал. Отключать алгоритм Нейгла ему смысла нет. Его никто не отключает и у всех всё работает, значит, не в нём дело. Вы первый человек на моей памяти, который его отключал.
Предположу следующее.
Зависит от того каким образом обрабатывать таблицы сделок и заявок.
В моем  случае в таблице заявок в конце теста было 200 000 строк, но я обрабатываю колбеки до появления соответствующих изменений в таблицах.
Поэтому  я не лезу в эти таблицы.
Если туда ходить, то задержки существенно увеличиваются.
-------------------
Кроме того, у меня нет sleep. Поэтому задержка на обработку любого колбека не более 0.1 ms.
Это на порядки меньше чем задержка со sleep.
 
Цитата
Serge123 написал:
Цитата
Игорь М написал:
Предполагаю, что Сергей описывал ситуацию зависания при приходе его личных сделок ("когда идёт много моих сделок, я ясно вижу торможение") , хотя конкретики мало дал. Отключать алгоритм Нейгла ему смысла нет. Его никто не отключает и у всех всё работает, значит, не в нём дело.
Точно, я даже предположил, что особенно на задержку влияют звуковые сигналы.
Какая нужна конкретика?
Где-то до октября 2023 я и в утреннюю и в вечернюю сессии удачно выставлял заявки с пом. скрипта, иногда даже видел по содержимому стаканов в файле, что я в очереди первый. Первым быть не всегда хорошо, потому что во время премаркета бывает в сумме крупная встречная заявка, за это снимают деньги. Но потом перестало получаться попадать в начало очереди на вечерней сессии (а утром по-прежнему всё ОК). Такое впечатление, что мосбиржа вечером варьирует время начала приёма заявок в пределах 2 секунд. То ли вечером возникли какие-то задержки (в том числе с получением ответов от сервера на заявки). Поэтому я и решил попробовать вечером отключить алгоритм Нейгла, но от этого получился полный затык в работе Квика.
Попробуйте вывести в лог файл время прихода колбеков OnTransReply  и OnOrder и сравните с временем регистрации сделки из таблицы сделок.
Если выложите эти времена, то можно будет что-то конкретное сказать.  
 
Цитата
Игорь М написал:
Если вы на открытии сделки совершаете, то помимо непосредственно ваших сделок ещё и большой поток информации в эти моменты приходит, поэтому Квик это тяжело переваривает.
Да, я видел, что причина торможения во время моих сделок в том, что иногда почему-то идёт большое число мелких сделок, напр., десятки сделок по 1 акции. Я так и не могу понять, зачем кто-то выставляет заявки по одной акции, как будто кто-то отлаживает свою программу или что-то тестирует. Если нет потока мелких сделок, то торможения нет.
 
Цитата
Serge123 написал:
Цитата
Игорь М написал:
Если вы на открытии сделки совершаете, то помимо непосредственно ваших сделок ещё и большой поток информации в эти моменты приходит, поэтому Квик это тяжело переваривает.
Да, я видел, что причина торможения во время моих сделок в том, что иногда почему-то идёт большое число мелких сделок, напр., десятки сделок по 1 акции. Я так и не могу понять, зачем кто-то выставляет заявки по одной акции, как будто кто-то отлаживает свою программу или что-то тестирует. Если нет потока мелких сделок, то торможения нет.
По одной заявке выставляют HFT роботы, скальперы и ММ.
 
Serge123,
Если хотите определить причину, то
запишите в лог значения времени :
время выставления заявки скриптом,
время колбек транзакции
время колбека заявки
время колбека сделки
-----------------  
По этим данным Вы увидите что тормозит.
-----------------  
Относительно тормоза при проигрывании музыки
Специально для вас выкладывал исходник с асинхронным проигрыванием. Чтобы не ждать, надо в нем установить второй параметр 0.
 
Цитата
nikolz написал:
По одной заявке выставляют HFT роботы, скальперы и ММ.
А какой смысл это делать на дешёвом инструменте с шагом цены ноль целых шиш десятых копейки?
 
Цитата
nikolz написал:
Кроме того, у меня нет sleep. Поэтому задержка на обработку любого колбека не более 0.1 ms. Это на порядки меньше чем задержка со sleep.
Здесь я не понял, о каком sleep идёт речь. У меня в скрипте sleep(10) используется один раз в main в цикле обработки очереди от коллбэков. В Lua по-моему нельзя прервать паузу, если в мой массив (очередь) коллбэк что-то записал.
 
Цитата
Serge123 написал:
Цитата
nikolz написал:
Кроме того, у меня нет sleep. Поэтому задержка на обработку любого колбека не более 0.1 ms. Это на порядки меньше чем задержка со sleep.
Здесь я не понял, о каком sleep идёт речь. У меня в скрипте sleep(10) используется один раз в main в цикле обработки очереди от коллбэков. В Lua по-моему нельзя прервать паузу, если в мой массив (очередь) коллбэк что-то записал.
Да именно sleep в main.  Когда очередь  main остановится на указанное время.
Все это время колбеки будут забивать очередь и даже для sleep(10) .
Но при sleep(10) будет пустая трата времени ядра.
Посмотрите сколько у вас будет загрузка процессора, если sleep(10) или sleep(1000).  
-------------------------
Вместо sleep ставим wait в  и создаем event.
в итоге main  просыпается сразу по срабатыванию колбека и спит произвольное время, если сигналов нет.
Пустой траты времени нет совсем. И main реагирует на колбек примерно в 100 раз быстрее.
-------------  
Кроме того, с помощью wait можно реализовать дополнительно запуск main по таймеру.
---------------
Например, делал так:
--------------------
main запускается колбеками, но не реже 1 раз в секунду(10 секунд).
 
пардон, печатка:
Да именно sleep в main.  Когда очередь  пустая, то main остановится на указанное время.
 
Цитата
nikolz написал:
Вместо sleep ставим wait в  и создаем event.
Я ничего не слышал об этих функциях, нужен пример использования в Lua.
 
https://lua.org/manual/5.4/
Где тут wait и event? Я о таких тайных заклинаниях ничего не знаю...
 
Видимо, имелось в виду, что длл получает инфо, что коллбэк что-то записал в очередь, и длл запускает main, которая всё остальное время спит. Или что-то подобное.
 
Цитата
Serge123 написал:
https://lua.org/manual/5.4/
Где тут wait и event? Я о таких тайных заклинаниях ничего не знаю...
Где-то пролетала ссылка на библиотечку w32 для lua. Там есть CreateEvent / WaitForSingleObject. Надо попробовать, должно работать...
 
Цитата
Serge123 написал:
Видимо, имелось в виду, что длл получает инфо, что коллбэк что-то записал в очередь, и длл запускает main, которая всё остальное время спит. Или что-то подобное.
Если не ошибаюсь, Вы осваиваете написание dll для луа.
Вроде бы уже выкладывал исходник для event и wait
-----------------
Можете взять  библиотеку w32 для Lua:

https://quik2dde.ru/viewforum.php?id=15

https://github.com/javalikescript/lua-win32
 
 
Цитата
nikolz написал:
Можете взять  библиотеку w32 для Lua:
А какие функции из неё нужны для данного случая? И чтобы они работали как можно быстрее?
Цитата
nikolz написал:
Если не ошибаюсь, Вы осваиваете написание dll для луа.
Осваиваю, но в других темах форума. А в этой теме я осваиваю Луа скрипты.  :smile:  
 
Цитата
Serge123 написал:
Цитата
nikolz написал:
По одной заявке выставляют HFT роботы, скальперы и ММ.
А какой смысл это делать на дешёвом инструменте с шагом цены ноль целых шиш десятых копейки?
Тут дело в округлении... https://roem.ru/12-08-2021/286525/tinkoff-cents/
Вот продали вы один лот ценой 1.3862, а получили 1.39 из-за округления. А можно можно купить сразу два лота по той же цене за 2.77. То есть продали два раза по одному, купили сразу два - заработали копейку. Сумеете купить пятьсот заявок по два лота и потом продать тысячу по одному - плюс 5 рублей. С теми объемами торгов, которые там есть - можно и много больше. Вопрос только в том, когда брокер скажет "ай ай ай".
 
А, да, еще надо чтобы брокер считал свою комиссию не с каждой сделки, а как процент от дневного оборота. Вроде есть такие. А биржевая комиссия с мейкера не берется.
Страницы: 1 2 След.
Читают тему
Наверх