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

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

Страницы: Пред. 1 2 3 4 5 6 7 8 9 След.
Почему в этой программке утекает память??
 
Цитата
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 с разбором очереди, а в потоке Квика работа уменьшилась неощутимо...
Почему в этой программке утекает память??
 
Цитата
TGB написал:
Утечка есть.
Спасибо, интересно... А до вер. 5.4.1 этой ошибки не было?
Я подозреваю, что утечка памяти имеется не только при работе с файлами: как я вчера писал в другой ветке, мой скрипт по записи в файл содержимого стаканов и обезл. сделок потихоньку увеличивает занятую память, хотя в это время нет работы с файлом и я присваиваю false ссылкам на таблицы...
339 сделок по одному тикеру в течение 1 мкс
 
Цитата
nikolz написал:
Т е Ваши 339 это в 40 раз быстрее, чем реально достигнуто на уровне ядра системы на бирже
Может быть, дело было в том, что кто-то сделал крупную заявку по рыночной цене, а с другой стороны сервер просто пособирал лимитные заявки на эту сумму, и это можно сделать намного быстрее?

Иначе получается, что переданное время сервера биржи не соответствует его реальным часам. Напр., чтобы не тормозить с обработкой заявок, сервер не для каждой сделки опрашивает показания часов?
До каких пор живёт таблица, передаваемая функции?
 
Работает, но память, занимаемая скриптом, понемногу растёт, хотя, я после обработки в main таблиц из очереди записываю на место ссылок на них false.

И на мой сегодняшний вопрос в https://forum.quik.ru/forum10/topic8600/ так никто и не ответил, видно, не знают, что сказать...  :what:  
До каких пор живёт таблица, передаваемая функции?
 
Цитата
funduk написал:
Объекты живут, пока на них есть ссылки.
Похоже, что всё хорошо: переделал скрипт, чтобы он обрабатывал очередь от коллбэков в main, всё работает.
До каких пор живёт таблица, передаваемая функции?
 
Смутно помнится, в документации на lua.org я видел, что жизнь таблицы из параметров функции гарантируется до выхода из этой функции (т.е. до выхода из OnAllTrade). Какая-то ерунда пока получается с этим переносом обработки таблиц в поток main...
До каких пор живёт таблица, передаваемая функции?
 
Пытаюсь перенести обработку OnQuote и OnAllTrade в поток main. C OnAllTrade приходит ссылка на таблицу alltrade:
Код
function OnAllTrade(alltrade)
Сама таблица alltrade находится в стеке вызова этого коллбэка (очевидно, в стеке тоже ссылка, а сама таблица ещё где-нибудь?)

Если я эту ссылку на alltrade помещу в очередь и выйду из OnAllTrade, то не получится ли так, что после выхода из OnAllTrade эта таблица окажется мусором?

Аналогичный вопрос с OnQuote, которая вызывает getQuoteLevel2 и помещает возвращаемую ей таблицу (ссылку на неё) в ту же очередь для обработки в main.

Мне что, перед выходом из этих функций отключать сборку мусора, а после обработки всей очереди в main опять включать??
339 сделок по одному тикеру в течение 1 мкс
 
Цитата
nikolz написал:
Сервер не может провести 339 заявок за 1 мкс.
В 1-м моём сообщении речь шла о сделках. Ошибочно сделки перетекли в заявки...
Почему в этой программке утекает память??
 
С каждой записью в файл утекает ~ 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
339 сделок по одному тикеру в течение 1 мкс
 
Цитата
paluke написал:
339 разных заявок в стакане кто-то собрал одной крупной встречной заявкой.
А, ясно, почему такая высокая скорость. А если бы мелкие заявки собирали мелкими, то сервер не успел бы за 1 мкс провести все 339 сделок и образовалась бы очередь?
339 сделок по одному тикеру в течение 1 мкс
 
Цитата
nikolz написал:
Можете показать фрагмент этих сделок?
Это конфиденциальная информация. :cool:  
339 сделок по одному тикеру в течение 1 мкс
 
Сегодня наблюдал сабж по некоторой акции на мосбирже с пом. моего скрипта с OnAllTrade. При этом время сделки было то же самое по самую микросекунду. Это произошло сразу после смены цен покупки/продажи. Как такое возможно? Действительно ли эти 339 сделок произошли менее, чем за 1 мкс?

Можно ли где-то получить общее представление о том, как организованы торги на мосбирже и какие там характеристики у серверов (какая ОС, память, ЦП, диски, пропускной канал, ...)? Т.е. как бы совершить виртуальный тур по бирже. Примерно, как в видео на ютюбе о работе tsmc, где клепают лучшие ЦП.
Альтернатива CanSell/CanBuy
 
Из аналогичных функций есть ещё
getBuySellInfoEx
CalcBuySell
Утечка памяти в обработчике SetTableNotificationCallback, Функция обратного вызова обработчика событий пользовательской таблицы не освобождает память между вызовами
 
Цитата
Nikolay написал:
Это тоже лучше делать в main.
Мне желательно знать, когда было изменение в стакане, напр., чтобы знать, где я стою в очереди на сделки. Мне кажется, getQuoteLevel2 работает быстро, т.к. эту информацию даёт Квик, который уже получил её с сервера брокера.
К сожалению, квиковцы так и не сделали, чтобы можно было получать через OnQuote или хотя бы getQuoteLevel2 время с сервера биржи, в которое произошло изменение в стакане.

А что же с моим вопросом в #7?
Утечка памяти в обработчике SetTableNotificationCallback, Функция обратного вызова обработчика событий пользовательской таблицы не освобождает память между вызовами
 
У меня в связи с выносом обработки в main вопрос: напр., я хочу вынести из OnQuote разбор стакана в main, OnQuote будет вызывать getQuoteLevel2 и запоминать результат в циклический массив, а main будет брать его оттуда по текущему индексу, обрабатывать и освобождать память под эту табличку, которую получила через OnQuote от getQuoteLevel2. Не хочется использовать медленные sinsert и sremove. Можно ли сделать такую схему, чтобы не было конфликтов в связи с параллельным использованием данных между потоком main и потоком коллбэков?
Время начала приёма заявок на вечерней сессии
 
Кто знает, сабж для всех инструментов один? Такое впечатление, что нет, сегодня в моём инструменте, по-моему, заявки начали принимать раньше 19:00:01. Возможно, чтобы свои люди, кому хотелось очень продать, встали в очередь пораньше.

Говорят, продают, чтобы купить татнефть(?)
Сортировка в таблице quik
 
Вот описание SetCell, может, пригодится:

Функция задает значение для ячейки в строке с ключом key, кодом колонки code в таблице t_id. Параметр text задает строковое представление значение параметра value. Параметр value необязательный и по умолчанию равен 0. Для столбцов со строковыми типами данных параметр value не задается. Если параметр value не задан для ячеек всех остальных типов, то по столбцам, содержащим такие ячейки, не будет корректно работать сортировка, фильтрация и условное форматирование (см. Приложение 2). Функция возвращает true в случае успешного завершения, иначе – false.

Формат вызова:
BOOLEAN SetCell(NUMBER t_id, NUMBER key, NUMBER code, STRING text, NUMBER value)
Как в текстовом редакторе Far сворачивать (collapse) функции?
 
Чтобы от текста для кода функции оставался один заголовой функции.
Наверно, должен быть такой плагин, не могу найти...
Пример передачи управления из коллбэка в другой поток
 
Хочу посмотреть пример dll на C, которая обрабатывает коллбэк (напр., OnAllTrade) и для ускорения работы передаёт обработку коллбэка в заранее созданный повторно используемый поток и сразу делает выход. Примеры на C++ не очень интересуют...

И ещё подскажите, в каком потоке работает сборщик мусора? В main, в Квике или в своём собственном? И этот сборщик существует для каждого скрипта свой?
Проверка на nil
 
А может быть такое, что Квик что-то меняет в своей таблице, а скрипт в это время читает это поле?
Помню, в районе quik2dde.ru упоминаемый мною kalikazandr писал, что такое возможно, якобы, даже неполный кусок изменяемой Квиком строки можно прочитать. Или это байки алготрейдеров?
Есть ли оптимизация при конкатенации строк?
 
Ничего не понятно, но всё так, как надо.  :smile:

Где-то в Интернете есть онлайн сервисы, на которых вводишь код на разных языках и смотришь скомпилированный код. Возможно, так можно увидеть через байт-код Луа, как фрагменты компилируются.

А я вчера много времени потратил на выяснение: будет ли ускорение от такой оптимизации в OnAllTrade и в OnQuote, где вычисляется символьное время сделки/изменения в стакане для вывода типа
Код
UWGN 18:49:59.388251 47.4 482 S
IRKT 18:48:33.469798 bids=20 85.45/1806 85.40/56 85.35/6 85.20/163 85.15/4 85.05/12 85.00/36 84.90/28 84.85/11 84.80/3 84.60/2 84.50/99 84.40/3 84.30/2 84.25/6 84.20/10 84.15/7 84.10/43 84.05/129 84.00/482 offers=3 85.20/15 85.40/13 85.45/512
Часы и минуты меняются редко, цена и количество акций в стакане по нелучшим ценам тоже: что, если запоминать эти значения в строках, и если они не изменились, вставлять закэшированные?
Мерял время выполнения этих коллбэков через os.sysdate().mcs, получал 0. Снизил частоту ЦП до 800 МГц, внутри коллбэка сделал цикл на 10 повторов, опять 0. Как-то не верится в такое: слишком быстро. А если повтор цикла увеличить, то выскакивают цифры ~ 5000 мкс, 10000, 15500. Про 15500 я знаю, что это квант времени для работы потока. Поэтому я так и не понял, есть ли от этого ускорение. Ведь в этом случае этой оптимизации придётся делать проверки, что время не поменялось, запоминать новое время, конкатенировать строки... В общем, НИР/ОКР ерундой прозанимался... :what:
Есть ли оптимизация при конкатенации строк?
 
Кто-нибудь знает, при нескольких конкатенациях:
Код
str1 = 'b'
str = str .. 'a' .. str1 .. str1
str будет 3 раза удаляться и пересоздаваться, или будет какая-то оптимизация этого присваивания?
Если бы я был архитектором QUIK, Что стоило бы изменить в QUIK по-крупному
 
Если скрипту давать работать с 10% от депозита, то получится 37% годовых грязными, или 32% чистыми. Если вместо воды пить шампанское, получается не так уж и много...

Когда-то давно в телеграм канале один старый трейдер советовал брать и держать акции сберика, когда одна стоила 132 р., потом когда 137 р., 142 р., т.к. идёт долгострочный тренд с прицелом на ист. максимум. Если бы я послушал его, то сейчас без всяких "ботов" и "стратегий" имел бы 100% годовых чистыми...

Подозреваю, что если бы я подписался на платный канал к.э.н. с птичьей фамилией из Владивостока, который следит за фондовым рынком, то было бы примерно то же...
Повторное использование строки
 
Цитата
TGB написал:
Почему бы не записывать строку сразу в файл (в системе это буферизуется). Вы проверяли, сколько записей выполняется в файл за 1 секунду, если писать напрямую? Если вы это сделаете, то, возможно, удивитесь.
Я кэш буферам виндовс уже давно не удивляюсь, на диске тоже что-то похожее есть... Если писать с буферизацией, то сначала кусочки будут переписываться из памяти в память, а потом на диск, а если я сам буду писать без буферизации, то, как я надеюсь, винда будет писать сразу на диск. Хотя, в принципе, не факт, что это будет быстрее, тут опять нужны эксперименты (за которые денег не дают).
Повторное использование строки
 
Цитата
TGB написал:
При этом надо понимать, что реально работающую стратегию, стабильно, без провалов, приносящую доход хотя бы в 20% (в текущий момент) на годовом периоде, вам никто не предложит.
Я безо всякой "стратегии" как раз этим давно занимаюсь, акциями металлами я уже давно не торгую и уже отвык от этих стрёмных активов. Я ещё в октябре "силовым методом" получил статус квала и получаю взаймы от брокера столько, что можно купить квартирку в Москве (но, правда, не для всех активов). Проблема, как успеть продать лишнее по цене на шаг выше, а не по цене покупки...

Ближайшая задача слегка автоматизировать эту торговлю, чтобы не щёлкать в бешеном темпе по 5-ти стаканам, когда "шара попёрла"...

Кстати, я вчера день потратил на выяснение возможности повторного использования строки и выяснил, что это невозможно, т.к. Луа при малейшей попытке конкатенации моментально отправляет эту строку в мусор, пусть даже её длина равна 0 (очевидно, проверок не делается). Поэтому, надо либо держать строки в массиве и использовать concat, либо в длл.
Повторное использование строки
 
Когда я это делал, то только начал писать на Луа, не знал, что мне нужно делать, и какая дорога к деньгам более прямая. Просто хотел накопить таких файлов и попробовать найти закономерности взлёта цены. И у меня околонаучный склад ума, как у киплинговского слонёнка: хочется копать вглубь и искать там золотые самородки. До сих пор ничего роботоподобного не сделал...
На этом форуме могут до кровохарканья обсуждать двойные и тройные очереди, показывать загадочные картинки, от которых рябит в глазах, но ничего действительно полезного не скажут.
Повторное использование строки
 
Цитата
TGB написал:
Этот коллбек я до сих пор не использовал.
Тогда посмотрите на кусочек от вывода моего Луа скрипта, который обрабатывал OnAllTrade от 4 января 2023 г.:
Скрытый текст
Он записывал из таблицы, переданной ему, тикер, время, цену, количество лотов и направление сделки. И таких строк с тем же самым тикером и временем набралось 58. И это только по одному тикеру, а ещё работал обработчик OnQuote, который в этот же файл выводил содержимое стаканов.
Вот ещё кусочек из того же файла, со стаканами:
Скрытый текст
Повторное использование строки
 
Цитата
TGB написал:
Где вы обнаружили коллбеки QUIK, вызываемые десятки раз за 1 мкс?
В OnAllTrade видел: время на сервере биржи с точностью 1 мкс не меняется, а в файл записалось больше 64 сделок...
Повторное использование строки
 
Можно найти, что эта тема (чудовищная конкатенация строк в Луа) волнует народ в районе англоязычного stackoverflow, а здесь создатель Луа предлагает такую полумеру: https://www.lua.org/pil/11.6.html
Повторное использование строки
 
И да, ваш перегруженный вариант анекдота некорректен: ведь я с самого начала играл на стороне чукчи...
Повторное использование строки
 
Тут дело не в том, что есть запись на диск, а в том, что за 1 мкс десятки раз может выполняться оператор
Код
mess = mess .. <строка от коллбэка>
что будет приводить к созданию новой строки и переписыванию в неё содержимое старой, которую должен убрать сборщик мусора. И ЦП будет занят этой бесполезной издевательской работой. Я считаю, что в этом причина торможения.
Повторное использование строки
 
И всё-таки, я на этом форуме несколько раз видел, что людям издавна не хватает скорости (и для них это "жизненно важно"), а наращивание числа ядер и повышение тактовой частоты мало что не даёт, вот ещё пример такой темы: https://forum.quik.ru/forum10/topic3872/

А геологам просто надо держать свои снегоходы заведёнными. :smile:
Повторное использование строки
 
Мне кажется, что ничего не случится, если извне (из длл) строка будет изменена, ведь, если строка не находится внутри таблицы, вычисление хеша от неё не нужно?
Повторное использование строки
 
Кто-то предлагал вместо наращивания строки запоминать каждый вывод коллбэка в строку таблицы t, а потом делать
Код
s = table.concat(t)
Но это тоже дурацкий костыль для обхода неизменяемости строк Луа... Чувствую, что можно сделать, как я хотел в #1...
Звук через mciSendString и MessageBeep
 
Вопрос, почему mciSendString в консольной программе не выдаёт звук, так и остался открытым...
Как вы боретесь с описками в именах переменных?
 
Не нашёл нормального "линтера", а условный оператор это не совсем то и громоздко...
Страницы: Пред. 1 2 3 4 5 6 7 8 9 След.
Наверх