Как-то уже об этом писал... Есть строка mess (age), в которой коллбэки накапливают свой вывод, при превышении определённой длины строка записывается в файл. Потом обычно пишут mess='', чтобы сбросить длину строки в 0, но что в этом случае произойдёт? Создастся новая строка, или в структуре TString для этой строки её длина установится в 0? Я не вижу, где хранится число байтов, выделенных под строку, и как контролируется выход за её предел при дописывании к строке? Не хочется ненужного пересоздания строки и сборки мусора, а хочется просто зарезервировать под строку 10 Мб и использовать эту же память под строку постоянно. Зачем выметать сор из избы строки, если можно обойтись без этого? Как это всё оптимизировать и сделать, как в нормальных языках типа того же си?
Мне кажется, что ничего не случится, если извне (из длл) строка будет изменена, ведь, если строка не находится внутри таблицы, вычисление хеша от неё не нужно?
Serge123 написал: Есть строка mess (age), в которой коллбэки накапливают свой вывод, при превышении определённой длины строка записывается в файл.
Почему бы не записывать строку сразу в файл (в системе это буферизуется). Вы проверяли, сколько записей выполняется в файл за 1 секунду, если писать напрямую? Если вы это сделаете, то, возможно, удивитесь. Вообще то, если для вас важна эффективность, то имеет смысл, прежде чем заниматься оптимизацией, выяснять: а нужно ли это делать. Эффективнее всего выполняется то, что ничего не делает .
2.
Цитата
Serge123 написал: Мне кажется, что ничего не случится, если извне (из длл) строка будет изменена, ведь, если строка не находится внутри таблицы, вычисление хеша от неё не нужно?
Если нет желания заниматься длительной научно-исследовательской деятельностью, то для взаимодействия dll и Lua надо использовать только C API. ------ И «перегруженный» анекдот про чукчу: Чукча и геолог ловят рыбу зимой на льду. Геолог приехал на рыбалку на снегоходе, а чукча пришел на лыжах. Вдруг видят направляющегося к ним голодного белого медведя. Ружья нет. Чукча хватает лыжи и начинает их надевать. Геолог: - Бесполезно. Все равно ты не сможешь бежать быстрее медведя. - А мне и не надо бежать быстрее медведя. Мне достаточно того, что медведь сюда добежит раньше, чем ты заведешь свой быстро бегающий снегоход.
И всё-таки, я на этом форуме несколько раз видел, что людям издавна не хватает скорости (и для них это "жизненно важно"), а наращивание числа ядер и повышение тактовой частоты мало что не даёт, вот ещё пример такой темы: https://forum.quik.ru/forum10/topic3872/
А геологам просто надо держать свои снегоходы заведёнными.
Тут дело не в том, что есть запись на диск, а в том, что за 1 мкс десятки раз может выполняться оператор
Код
mess = mess .. <строка от коллбэка>
что будет приводить к созданию новой строки и переписыванию в неё содержимое старой, которую должен убрать сборщик мусора. И ЦП будет занят этой бесполезной издевательской работой. Я считаю, что в этом причина торможения.
Можно найти, что эта тема (чудовищная конкатенация строк в Луа) волнует народ в районе англоязычного stackoverflow, а здесь создатель Луа предлагает такую полумеру: https://www.lua.org/pil/11.6.html
Serge123 написал: Тут дело не в том, что есть запись на диск, а в том, что за 1 мкс десятки раз может выполняться оператор
Где вы обнаружили коллбеки QUIK, вызываемые десятки раз за 1 мкс? Не знаю, будет ли для вас это существенно, но одна из моих практических профессиональных специализаций: параллельное программирование и разработка систем реального времени. Возможно я ошибаюсь, но у меня возникло представление, что вы пытаетесь бороться с привидениями, многие из которых у вас не материализуются .
TGB написал: Этот коллбек я до сих пор не использовал.
Тогда посмотрите на кусочек от вывода моего Луа скрипта, который обрабатывал OnAllTrade от 4 января 2023 г.:
Скрытый текст
TRMK 18:45:26.000085 216.96 2 S TRMK 18:45:26.000085 216.96 8 S TRMK 18:45:26.000085 216.96 2 S TRMK 18:45:26.000085 216.96 18 S TRMK 18:45:26.000085 216.96 51 S TRMK 18:45:26.000085 216.96 9 S TRMK 18:45:26.000085 216.96 4 S TRMK 18:45:26.000085 216.96 1 S TRMK 18:45:26.000085 216.96 47 B
Он записывал из таблицы, переданной ему, тикер, время, цену, количество лотов и направление сделки. И таких строк с тем же самым тикером и временем набралось 58. И это только по одному тикеру, а ещё работал обработчик OnQuote, который в этот же файл выводил содержимое стаканов. Вот ещё кусочек из того же файла, со стаканами:
Не очень понятно зачем это делать через объединение строк. У меня такие потоки для каждой новой записи просто пишутся в файл через f:write(str..'\n')
Плюс организован счетчик добавленных строк. Когда их больше порога, скажем 100, сбрасываем на диск f:flush()
И не очень понятно зачем это делать в колбеке OnAllTrade, загружая поток терминала. Да, конечно, так можно, но если скрипт запускается в середине торгового дня, да и просто перезапускается, то необходимо сканировать таблицу и записывать в файл пропущенные записи. Раз так, то проще сделать так и для новых записей.
Serge123 написал: Тогда посмотрите на кусочек от вывода моего Луа скрипта, который обрабатывал OnAllTrade от 4 января 2023 г.:
Я согласен с тем, что написал Nikolay. Но если вы хотите разобраться с тем как вызываются коллбеки OnAllTrade реально, то в ваш вывод нужно добавить колонку времен вызова этого коллбека (используя функцию QLua os.sysdate() с детализацией до микросекунд).
Когда я это делал, то только начал писать на Луа, не знал, что мне нужно делать, и какая дорога к деньгам более прямая. Просто хотел накопить таких файлов и попробовать найти закономерности взлёта цены. И у меня околонаучный склад ума, как у киплинговского слонёнка: хочется копать вглубь и искать там золотые самородки. До сих пор ничего роботоподобного не сделал... На этом форуме могут до кровохарканья обсуждать двойные и тройные очереди, показывать загадочные картинки, от которых рябит в глазах, но ничего действительно полезного не скажут.
Serge123 написал: Когда я это делал, то только начал писать на Луа, не знал, что мне нужно делать, и какая дорога к деньгам более прямая. Просто хотел накопить таких файлов и попробовать найти закономерности взлёта цены. И у меня околонаучный склад ума, как у киплинговского слонёнка: хочется копать вглубь и искать там золотые самородки. До сих пор ничего роботоподобного не сделал... На этом форуме могут до кровохарканья обсуждать двойные и тройные очереди, показывать загадочные картинки, от которых рябит в глазах, но ничего действительно полезного не скажут.
В этом нет ничего странного. Количественный анализ ленты сделок - это обычная практика, особенно вместе с анализом стакана DOM. Правда, конечно, это обычно не записывают в линейный файл, а используют базы данных. Квик позволяет это делать без всяких скриптов, достаточно настроить выгрузку через ODBC из таблицы. База данных позволит строить аккумуляцию, агреггацию, фильтрацию и т.д. Причем делать это быстро.
Serge123 написал: хочется копать вглубь и искать там золотые самородки. До сих пор ничего роботоподобного не сделал...
Прежде чем копать, наверное, стоит выбрать место для копания. То есть, сначала поторговать вручную, чтобы понять что это такое, но без фанатизма, чтобы не слить весь ваш депозит. При этом надо понимать, что реально работающую стратегию, стабильно, без провалов, приносящую доход хотя бы в 20% (в текущий момент) на годовом периоде, вам никто не предложит. Подумайте, зачем банкам бегать за клиентами с предложениями кредитов под 15% если на фондовом рынке можно заработать 20%. Фондовый рынок, локально, это игра с "псевдо-нулевой" суммой (деньги на нем не создаются а перераспределяются) и если какая то стратегия оказывается выигрышной, а затем получает широкое распространение, то она перестает работать. После некоторого периода ручной торговли сделайте простого робота исключительно на QLua, который смог бы вас заменить, а также торговать на истории. И только после этого начните поиск своей стратегии и оптимизацию того, что имеет смысл оптимизировать.
2.
Цитата
Serge123 написал: На этом форуме могут до кровохарканья обсуждать двойные и тройные очереди, показывать загадочные картинки, от которых рябит в глазах, но ничего действительно полезного не скажут.
Не согласен (частично). Конечно, на форуме много флуда, но тот же Nikolay написал вам практически все об обработке обезличенных сделок.
Serge123 написал: Как-то уже об этом писал... Есть строка mess (age), в которой коллбэки накапливают свой вывод, при превышении определённой длины строка записывается в файл. Потом обычно пишут mess='', чтобы сбросить длину строки в 0, но что в этом случае произойдёт? Создастся новая строка, или в структуре TString для этой строки её длина установится в 0? Я не вижу, где хранится число байтов, выделенных под строку, и как контролируется выход за её предел при дописывании к строке? Не хочется ненужного пересоздания строки и сборки мусора, а хочется просто зарезервировать под строку 10 Мб и использовать эту же память под строку постоянно. Зачем выметать сор из избы строки, если можно обойтись без этого? Как это всё оптимизировать и сделать, как в нормальных языках типа того же си?
Если Вы это сообщение выводите в файл, то пишите сразу в файл. куски сообщения. Каждый новый кусок добавится в конец файла В итоге Вам не надо наращивать строки.
nikolz написал: Если Вы это сообщение выводите в файл, то пишите сразу в файл. куски сообщения. Каждый новый кусок добавится в конец файлаВ итоге Вам не надо наращивать строки.
nikolz писатель? Зачем вы пишите, то что было уже написано два раза?: 1)
Цитата
TGB написал: Почему бы не записывать строку сразу в файл (в системе это буферизуется). Вы проверяли, сколько записей выполняется в файл за 1 секунду, если писать напрямую? Если вы это сделаете, то, возможно, удивитесь.
2)
Цитата
Nikolay написал: У меня такие потоки для каждой новой записи просто пишутся в файл черезf:write(str..'\n')
nikolz написал: Если Вы это сообщение выводите в файл, то пишите сразу в файл. куски сообщения. Каждый новый кусок добавится в конец файлаВ итоге Вам не надо наращивать строки.
nikolz писатель? Зачем вы пишите, то что было уже написано два раза?: 1)
Цитата
TGB написал: Почему бы не записывать строку сразу в файл (в системе это буферизуется). Вы проверяли, сколько записей выполняется в файл за 1 секунду, если писать напрямую? Если вы это сделаете, то, возможно, удивитесь.
2)
Цитата
Nikolay написал: У меня такие потоки для каждой новой записи просто пишутся в файл черезf:write(str..'\n')
TGB написал: При этом надо понимать, что реально работающую стратегию, стабильно, без провалов, приносящую доход хотя бы в 20% (в текущий момент) на годовом периоде, вам никто не предложит.
Я безо всякой "стратегии" как раз этим давно занимаюсь, акциями металлами я уже давно не торгую и уже отвык от этих стрёмных активов. Я ещё в октябре "силовым методом" получил статус квала и получаю взаймы от брокера столько, что можно купить квартирку в Москве (но, правда, не для всех активов). Проблема, как успеть продать лишнее по цене на шаг выше, а не по цене покупки...
Ближайшая задача слегка автоматизировать эту торговлю, чтобы не щёлкать в бешеном темпе по 5-ти стаканам, когда "шара попёрла"...
Кстати, я вчера день потратил на выяснение возможности повторного использования строки и выяснил, что это невозможно, т.к. Луа при малейшей попытке конкатенации моментально отправляет эту строку в мусор, пусть даже её длина равна 0 (очевидно, проверок не делается). Поэтому, надо либо держать строки в массиве и использовать concat, либо в длл.
Судя по тому, что вы всегда цитируете сообщения полностью (даже самые длинные), вы, наверное, спамер. Но нельзя исключать с учетом качества выдаваемого вами текста, что вы полуинтеллектуальный робот-спамер .
Судя по тому, что вы всегда цитируете сообщения полностью (даже самые длинные), вы, наверное, спамер. Но нельзя исключать с учетом качества выдаваемого вами текста, что вы полуинтеллектуальный робот-спамер :: .
Вы любитель ярлыков? ---------------------- вас так колебет что я повторно написал то, что Вы написали выше? -------------------
Судя по тому, что вы всегда цитируете сообщения полностью (даже самые длинные), вы, наверное, спамер. Но нельзя исключать с учетом качества выдаваемого вами текста, что вы полуинтеллектуальный робот-спамер :: .
TGB написал: Почему бы не записывать строку сразу в файл (в системе это буферизуется). Вы проверяли, сколько записей выполняется в файл за 1 секунду, если писать напрямую? Если вы это сделаете, то, возможно, удивитесь.
Я кэш буферам виндовс уже давно не удивляюсь, на диске тоже что-то похожее есть... Если писать с буферизацией, то сначала кусочки будут переписываться из памяти в память, а потом на диск, а если я сам буду писать без буферизации, то, как я надеюсь, винда будет писать сразу на диск. Хотя, в принципе, не факт, что это будет быстрее, тут опять нужны эксперименты (за которые денег не дают).