[BUG] Повышенная загрузка CPU при большом количестве функций в скрипте
Пользователь
Сообщений: Регистрация: 21.08.2015
12.02.2022 11:26:47
Цитата
TGB написал: Зачем весь гемморой, перечисленный в пункте1?
Тут ответ по форуму распределен в виде 1000 веток, где у одних мусор НЕ собирается, у других собирается прям из под рук, третьим самим неясно ничего, но они тоже за какую-нибудь движуху. Причем все это в каком-то митинговом тоне и на пределе нервов, с заламыванием рук и криками "немедленно". Потом, правда, большинство репортеров куда-то исчезает, а намоленные улучшения остаются и накапливаются. Мой любимый пример с фильтрами на ТВС. Наклянчили, сломали десятилетиями как часы работавшую схему. Ау, ребята, шо там, скока трафика наэкономили, больше ли, чем создали разговорами?
Цитата
Владимир написал: Реальный вызов OnParam идёт по совершенно другим алгоритмам, которые, скорее всего, очень сильно отличаются от такого вызова.
Ну, я малость поизучал, что там в реальности, совсем чуть-чуть. Показал один аспект, а вообще думаю, что с показываниями надо подзавязывать, бессмысленно. Чтобы связать кусок сорца и наблюдаемое поведение со стороны скрипта, нужен еще хороший пласт понимания, что между, а с этим туго, вакуум заполняется выдуманными теориями, в итоге вместо "прояснил" получается "запутал".
[BUG] Повышенная загрузка CPU при большом количестве функций в скрипте
Пользователь
Сообщений: Регистрация: 21.08.2015
12.02.2022 01:08:05
Цитата
Владимир написал: Какая с него польза, кроме оверхеда?
Мне, выходит, сейчас придется выступить в роли адвоката сборщиков мусора, кои я сам терпеть не люблю ) Не, не буду )
Пошла волна, что, мол, все беды от того, что арка перед вызовом колбека отключает сборку мусора, а после - включает. Наблюдение мое было, но вот уже на это списали все беды квика и айти отрасли в целом. Что наблюдать печально, а мои призывы охладить этосамое игнорируются. Вот пришлось показать, что не все беды от этого, и вообще не от этого, и что тупой isConnected из одной инструкции дает почти тот же оверхед, что и новоназначенные враги квика. А миллионные циклы - чтобы вся эта шняга хоть бы сотню миллисекунд длилась, а то ж ее никаким таймером не выловишь.
[BUG] Повышенная загрузка CPU при большом количестве функций в скрипте
Пользователь
Сообщений: Регистрация: 21.08.2015
11.02.2022 22:22:55
Цитата
TGB написал: И не тратит на это никаких вычислительных ресурсов?
Тратит, но не на каждом колбеке. По моим наблюдениям, не чаще раза в секунду, если его не подталкивать.
[BUG] Повышенная загрузка CPU при большом количестве функций в скрипте
Пользователь
Сообщений: Регистрация: 21.08.2015
11.02.2022 21:54:00
Цитата
TGB написал: Вы обратили внимание на то, как меняется память при запуске вашего теста: до ~ 150 000 кб в конце теста.?
Конечно. Поскольку я своим глазам доверяю (а шага сборки после колбека я в упор не углядел), то я склонен считать,что это к делу отношения не имеет. Квик как-то там прибирается и молодец и флаг ему в руки. Как показывает тест выше, достаточно выключения/включения сборки, чтобы воспроизвести наблюдаемое поведение. Но это еще не все. Эти вызовы - сишные, поэтому их надо сравнить с просто пустыми сишными вызовами. Наиболее близко к этому - вызвать isConnected. И, чтобы два раза не вставать, сравним еще со случаем форсированного переключения потока в тех же местах. Тест и результат ниже. Как видите, дополнительная нагрузка на вызов от приостановки сборщика находится где-то между двумя пустыми сишными вызовами и двумя переключениями потока и не зависит от числа глобальных переменных. Поэтому, я считаю, вопрос об отключении сборщика (мной же поднятый) можно опустить обратно, это здесь влияет мало. Обнаруженная Старателем зависимость оверхеда от числа объявленных переменных растет откуда-то из другого места. Возможно, тоже как-то со сборкой связанного, но не так прямолинейно.
Код
local run = true
local nnn = 5000000
function OnStop()
run = false
end
function OnParam(cls, sec)
local str = cls or '' .. sec or ''
end
function main()
message('TEST running, wait a bit')
sleep(1000)
local t1 = os.clock() * 1000
for i = 1, nnn do
OnParam('TQBR', 'SBER')
end
t1 = os.clock() * 1000 - t1
local t2 = os.clock() * 1000
for i = 1, nnn do
collectgarbage('stop')
OnParam('TQBR', 'SBER')
collectgarbage('restart')
end
t2 = os.clock() * 1000 - t2
local t2x = os.clock() * 1000
for i = 1, nnn do
local _ = isConnected()
OnParam('TQBR', 'SBER')
_ = isConnected()
end
t2x = os.clock() * 1000 - t2x
local t2y = os.clock() * 1000
for i = 1, nnn do
sleep(0)
OnParam('TQBR', 'SBER')
sleep(0)
end
t2y = os.clock() * 1000 - t2y
for i = 1, 1000000 do
_G['var' .. i] = { _ = i}
end
local t3 = os.clock() * 1000
for i = 1, nnn do
OnParam('TQBR', 'SBER')
end
t3 = os.clock() * 1000 - t3
local t3x = os.clock() * 1000
for i = 1, nnn do
local _ = isConnected()
OnParam('TQBR', 'SBER')
_ = isConnected()
end
t3x = os.clock() * 1000 - t3x
local t3y = os.clock() * 1000
for i = 1, nnn do
sleep(0)
OnParam('TQBR', 'SBER')
sleep(0)
end
t3y = os.clock() * 1000 - t3y
local t4 = os.clock() * 1000
for i = 1, nnn do
collectgarbage('stop')
OnParam('TQBR', 'SBER')
collectgarbage('restart')
end
t4 = os.clock() * 1000 - t4
message('TEST RESULT:' ..
'\n gc always on, no globals: ' .. t1 ..
'\n gc stopped, no globals: ' .. t2 ..
'\n gc always on, no globals, c-calls: ' .. t2x ..
'\n gc always on, no globals, sleeps: ' .. t2y ..
'\n gc always on, many globals: ' .. t3 ..
'\n gc always on, many globals, c-calls: ' .. t3x ..
'\n gc always on, many globals, sleeps: ' .. t3y ..
'\n gc stopped, many globals: ' .. t4)
end
[BUG] Повышенная загрузка CPU при большом количестве функций в скрипте
Пользователь
Сообщений: Регистрация: 21.08.2015
11.02.2022 18:25:40
Вот другой тест, без лишних предположений.
Код
function OnParam(cls, sec)
local str = cls or '' .. sec or ''
end
function main()
message('TEST running, wait a bit')
sleep(1000)
local t1 = os.clock() * 1000
for i = 1, 1000000 do
OnParam('TQBR', 'SBER')
end
t1 = os.clock() * 1000 - t1
local t2 = os.clock() * 1000
for i = 1, 1000000 do
collectgarbage('stop')
OnParam('TQBR', 'SBER')
collectgarbage('restart')
end
t2 = os.clock() * 1000 - t2
for i = 1, 1000000 do
_G['var' .. i] = { _ = i}
end
local t3 = os.clock() * 1000
for i = 1, 1000000 do
OnParam('TQBR', 'SBER')
end
t3 = os.clock() * 1000 - t3
local t4 = os.clock() * 1000
for i = 1, 1000000 do
collectgarbage('stop')
OnParam('TQBR', 'SBER')
collectgarbage('restart')
end
t4 = os.clock() * 1000 - t4
message('TEST RESULT:' ..
'\n gc always on, no globals: ' .. t1 ..
'\n gc stopped, no globals: ' .. t2 ..
'\n gc always on, many globals: ' .. t3 ..
'\n gc stopped, many globals: ' .. t4)
end
Вывод: просто отключение/включение сборщика увеличивает оверхед на вызов в 4 и более раз, шаг тут не нужен. Довод "тогда почему память не растет" может иметь тысячу и один ответ, сомневаюсь, что сейчас арка побежит рассказывать о своих технических решениях.
[BUG] Повышенная загрузка CPU при большом количестве функций в скрипте
Пользователь
Сообщений: Регистрация: 21.08.2015
11.02.2022 13:47:58
Цитата
TGB написал: приведу код теста, в котором демонстрируется разница между вариантом с «дерганием» мусорщика в колбеках и вариантом, когда этого «дергания» нет
Попытку раскопать истину поддерживаю. Но зачем 'step' в цикле? Надо просто отключение-запуск и тогда будет примерно аналог того, что видим в коде арки. И вот насколько оверхед будет похож на оверхед в тестах Старателя, настолько можно будет предполагать, что дело именно в этом. А так получается, что тест доказывает, что сборка мусора занимает какой-то ресурс. Все это и без теста знали.
Как грамотно сделать функцию OnStop() последней в теле скрипта?, Скудное описание функции обратного вызова OnStop() в официальной документации
Пришлось гуглить, что это ) оказалось - не подключен. Ну да это и неважно.
Цитата
Владимир написал: А потому и логически, и физически, завершающие операции нужно бы делать именно в мейне, а в OnStop просто сбрасывать флаг бесконечного цикла.
В идеале да. Тут, как в сях иногда, без break переходим на следующий кейс:
Цитата
Старатель написал: Получается с той или иной долей вероятности можно налететь на такое при любом значении в return и даже без него?
Трудно сказать с уверенностью про все случаи. По логике, если TerminateThread не вызывается (т.е. когда WaitForSingleObject дождалась завершения мейна), все происходит как ожидалось. Ну с поправкой на то, что цикл сообщений стоит. Вообще я бы не так сделал, как сделано. Сейчас оно примерно так
Однако есть подозрение, что при закрытии квика с работающими скриптами они останавливаются в WM_DESTROY, и оттуда вот так выйти и ждать таймеров не выйдет, т.к. окно будет прибито виндой раньше, чем дождемся таймеров. В итоге, если все это верно, это улучшение потребует вообще весь квик переделывать, что вряд ли.
Цитата
Денис написал: Функции обратного вызова перестают работать после окончания работы функции OnStop() или после ее вызова?
Правильней будет сказать, что перестает работать скрипт. Колбеки не могут быть вызваны, пока окружающий OnStop код в квике не закончится, а когда он закончится - скрипта уже не существует. Пока обрабатывается OnStop (и любой другой колбек), другой колбек вызван быть не может. Мы так считаем, хотя Владимир вроде находил какой-то случай, когда колбек оказывался вложенным, но списали на случайный глюк.
Как грамотно сделать функцию OnStop() последней в теле скрипта?, Скудное описание функции обратного вызова OnStop() в официальной документации
Пользователь
Сообщений: Регистрация: 21.08.2015
06.02.2022 23:30:08
Владимир, тут речь именно про return 0 из OnStop, что форсирует прибитие мейна. Логически мы все делаем в OnStop, потом из него выходим и оставляем какой-то таймаут, чтобы мейн успел добежать до своего end, т.е. физически он свое "ничего" делает последним, а логически из ничего и выходит ничего.
Да, есть такое. Надеюсь, он не полезет квик хачить. Проблема не в том что не всхачит, а в том, что потом будет хачить до конца жизни каждую версию и все в рамках "гарантийного обслуживания", то есть даром.
Как грамотно сделать функцию OnStop() последней в теле скрипта?, Скудное описание функции обратного вызова OnStop() в официальной документации
Ага, я не заметил, return 0 надо убрать, выше написал почему, квик видит ноль и прибивает мейн немедленно, хотя тот уже и сам хотел завершиться.
Как грамотно сделать функцию OnStop() последней в теле скрипта?, Скудное описание функции обратного вызова OnStop() в официальной документации
Пользователь
Сообщений: Регистрация: 21.08.2015
06.02.2022 22:58:11
Денис, все же в мейне конец чуть иначе предполагался
Код
function main()
-- Открывается отладочный файл лога
File_Log_Debugger = io.open(File_Name_Log_Debugger, "w")
while not Stopped do
Flag_Svetofor = "Red"
if File_Log_Debugger and tostring(File_Log_Debugger) ~= "file (closed)" then
File_Log_Debugger:write("Тестовая строка\n")
File_Log_Debugger:flush()
end -- end if
sleep(1)
end -- end while конец обработки цикла ожидания робота выход по останову
Flag_Svetofor = "Green" -- вот сюда его родимого
end -- Конец функции main()
Как грамотно сделать функцию OnStop() последней в теле скрипта?, Скудное описание функции обратного вызова OnStop() в официальной документации
Пользователь
Сообщений: Регистрация: 21.08.2015
06.02.2022 22:52:58
Цитата
Старатель написал: Сначала скрипт штатно останавливается, при этом никаких ошибок не выдаёт.
Дело в том, что нештатно останавливается. Если OnStop возвращает 0, сразу за ней выполняется WaitForSingleObject(main, 0), возвращаясь немедленно из-за нулевого таймаута, и сразу же TerminateThread. Там потом еще уведомление главному окну посылается. Видимо, какие-то сопли после этого всего остаются.
Как грамотно сделать функцию OnStop() последней в теле скрипта?, Скудное описание функции обратного вызова OnStop() в официальной документации
Пользователь
Сообщений: Регистрация: 21.08.2015
06.02.2022 22:49:47
Цитата
Денис написал: Как посигналить? Если Stopped = true
Да, этот момент уже в коде присутствует и упомянут для полноты. Мониторить не в каждом, но при работе с окнами - да, попытка что-то сделать с окном из мейна, когда OnStop подвешен на цикле - дедлок. Строго говоря, даже проверка перед вызовом такой функции небезопасна, флаг может встать между проверкой и актуальным вызовом (хотя маловероятно).
Да, как по ссылке выше показывал. Это по сути спинлоки за отсутствием нормальной синхронизации в луа, мьютекса или семафора или хоть чего-нибудь.
Цитата
Денис написал: в то время, пока в основном потоке OnStop() подвешен на цикле со слипом - операторы main() в дополнительном потоке продолжают выполняться?
Да, но в силу устройства луа нужен какой-нибудь сишный вызов в цикле ожидания (в данном случае слип), иначе все встает.
А вообще я б лучше предложил сделать последним таки мейн, вот с этой всей синхронизацией на выходе, пусть вся логика отработает как требуется, в том числе последнее полезное действие в OnStop, но чтобы последнее слово было за мейном, даже просто голый return. Так надежнее, будет одна точка выхода на все случаи.
Как грамотно сделать функцию OnStop() последней в теле скрипта?, Скудное описание функции обратного вызова OnStop() в официальной документации
Пользователь
Сообщений: Регистрация: 21.08.2015
06.02.2022 21:57:46
Цитата
Денис написал: прямого ответа на свой вопрос еще не встречал
Словами кратко 1) из OnStop как-то посигнальте мейну, что пора завершаться 2) придержите OnStop с помощью цикла со слипом (обязательно со слипом), пока мейн не просигналит в ответ, что он вот-вот завершится 3) придержите OnStop еще чуть-чуть тем же способом, чтобы мейн точно уже завершился 4) вуаля, OnStop последний из могикан, мейна уже нет. Но убедитесь, что мейн не выбросит ошибки, пока OnStop его ждет, иначе как раз и получится описанная ситуация с зависанием всего.
Как считать данные из таблицы текущих торгов?
Пользователь
Сообщений: Регистрация: 21.08.2015
06.02.2022 21:26:37
Цитата
Владимир написал: не сможет реализовать ни один человек с планеты Земля
Чрезмерно категоричное утверждение. В конце концов, табличка квикова - это окно, у него есть определенный апи, и этот апи гораздо легче расковырять, чем можно было бы подумать. Другое дело, что я б попытался заказчика отговорить от такого решения, даже если ему бюджет девать некуда, бо оно требует ковыряния в кишках квика, а кишки квика имеют свойство неожиданно меняться в одной из новых версий. Но если он крайне желает хорошенько заплатить за приключения себе на копчик, то тксть любой каприз, с оговоркой, что на новую версию новый каприз будет за новый бюджет.
Как грамотно сделать функцию OnStop() последней в теле скрипта?, Скудное описание функции обратного вызова OnStop() в официальной документации
Пользователь
Сообщений: Регистрация: 21.08.2015
06.02.2022 21:18:17
Цитата
Денис написал: Вставьте в функцию main() оператор while true do end и никакого принудительного завершения не произойдет. QUIK повиснет намертво из-за бесконечного цикла в main()
А вставьте оператор while true do sleep(0) end и принудительное завершение таки произойдет. Чудеса да и только.
Цитата
Денис написал: поделится опытом использования в скриптах функции OnStop()
Уже , там дальше по ветке разбросано несколько вопросов-ответов, почему так и зачем так. И в целом можно по форуму поискать всякого разного, как там потоки переключаются и прочая. В частности, вышеименованные чудеса перестанут таковыми быть.
Агрегировать объемы по ценам
Пользователь
Сообщений: Регистрация: 21.08.2015
01.02.2022 18:36:30
Александр, это просто гистограмма, лежащая на боку. Режете диапазон цен на сколько-то кусков, по цене тика смотрите, в какой кусок он попал, и в этом куске добавляете объем тика.
Да, верно, в 6 раз. Но на 522%, первые 100% уже были на 0.018.
Медленный вывод в таблицы QLua через SetCell
Пользователь
Сообщений: Регистрация: 21.08.2015
31.01.2022 17:26:36
Цитата
Daniil Pozdnyakov написал: получили увеличение загрузки CPU лишь на 10%
Вообще-то на 522%. Или в пять раз. Была загрузка 0.018, стала 0.112, считаем 100 * (0.112 - 0.018) / 0.018 = 522.
Странный авто-масштаб свечного графика объёма
Пользователь
Сообщений: Регистрация: 21.08.2015
30.01.2022 16:30:21
Анекдот напомнило. Пациент: доктор, когда я делаю так (дотягивается левой пяткой до правого уха), у меня хрустит в спине, как быть? Доктор: не делайте так.
Свечи (и бары, кстати, тоже) - четырехмерные, объем - одномерный. Любопытно, что вы хотели увидеть в результате. Или, другими словами, чему должны быть равны OHLC для свечи, отображающей одно значение V.
Логика выставления и перевыставления алгозаявки
Пользователь
Сообщений: Регистрация: 21.08.2015
25.01.2022 19:20:08
Цитата
D7DSk написал: Цена аукциона закрытия была выше моей продажной.
Цена аукциона определяется после окончания аукциона. Т.е. когда вы (или сервер) увидели цену аукциона, на аукцион уже ничего выставить нельзя. Поэтому и получилось
Цитата
D7DSk написал: После аукциона закрытия связанная с алго лимитная заявка появилась в таблице заявок
Повторная подписка на свечи через CreateDataSource не работает на версии 9.2.3.15
Когда временно не нужны данные, можно на датасорце вызвать SetEmptyCallback, когда снова понадобились - SetUpdateCallback. Датасорец оставлять до закрытия скрипта или до когда уже точно больше не понадобится. Оно даже на баг не похоже, а больше похоже на защиту от желающих задудосить сервер.
Работа с метками, ошибки при закрытии/открытии программы Quik., Свои уровни на графике из файла.
Пользователь
Сообщений: Регистрация: 21.08.2015
21.01.2022 12:28:40
AndyWise, OnClose вызывается, скрипт даже файл создать успевает. Вариант засинхронизировать в обе стороны, как здесь, тоже ничего не дает. То есть завершается все точно в правильной последовательности (иначе зависло бы), но метка так и остается (про метку код убрал для простоты).
Код
local run = true
local running = true
function OnStop()
run = false
while running do sleep(50) end
running = true
end
function OnClose()
local f = io.open(getScriptPath() .. '\\HELLO.txt', 'w')
f:write('HELLO')
f:flush()
f:close()
run = false
while running do sleep(50) end
running = true
sleep(100)
end
function main()
while run do
sleep(100)
end
running = false
while not running do sleep(50) end
end
Работа с метками, ошибки при закрытии/открытии программы Quik., Свои уровни на графике из файла.
function OnInit()
IsRun = true; --Скрипт запущен!
IsStopped = false; --------------------------<
WrkDir = getScriptPath().."\\";
PicDir = WrkDir.."Lua_Pict\\";
...
end
2)
Код
function main()
...
DelAllLabels(GRAPF_ID);
IsStopped = true; ---------------------------<
end
3)
Код
function OnClose()
IsRun = false;
sleep(500); -- половина задержки мейна, потом начинаем поллинг
while not IsStopped do sleep(50) end;
end
Словами: в OnClose сбросить IsRun и не возвращаться из колбека, пока мейн не завершится как обычно. Но не наглухо колбек повесить, иначе мейн будет ждать и зависнем.
[BUG] Повышенная загрузка CPU при большом количестве функций в скрипте
и так далее на всю глубину стека вызовов. Идея в том, что эти все иф никогда не должны исполниться. Вообще. Поэтому их и не должно быть вообще, а должен быть блок try-catch, который работает безо всякого оверхеда на основном пути. То есть там нет ни одной ассемблерной инструкции, не говоря уже про аццкий иф, ломающий конвейер.
[BUG] Повышенная загрузка CPU при большом количестве функций в скрипте
А теперь проверил. Коллектор выключается на каждом OnParam и каждом OnAllTrade. Вариант "оно отключено и не влияет" отпал.
[BUG] Повышенная загрузка CPU при большом количестве функций в скрипте
Пользователь
Сообщений: Регистрация: 21.08.2015
21.01.2022 00:34:28
Цитата
TGB написал: надо убрать запуски мусорщика (lua_gc) в колбеках
Я позже с этим, запуска сборки как таковой там нет, это вызовы отключения/включения сборщика. Но при включении сборщика есть побочный эффект - сбрасывается переменная debt в стейте и, получается, на следующем шаге сборщику придется оценивать количество мусора заново (как минимум, а как максимум он еще и шаг сделает). Это совершенно недокументированная особенность луа, так что я б не стал арку в этом обвинять. И там есть некая переменная, уже аркина, которая неизвестно что содержит, я не проверял под отладкой. Возможно, даже этих отключений сборки не происходит, хотя, судя по наблюдаемому поведению, они таки есть.
Корреляция между интенсивностью биржевых торгов и проблемами на серверах брокеров
Вы можете позвонить брокеру и разместить заявку по телефону, у всех брокеров это есть.
Много лет этой фигней занимаюсь и всегда в самых интересных точках были глюки. Всегда. В совсем допотопные времена чудесным образом вырубался интернет (ага, весь). Часа на два. Потом это прошло, стал вырубаться квик и "вы уже работаете в системе" или что-нибудь подобное. Потом просто начинало все лагать на несколько минут, типа торгуй-торгуй, но наощупь. Брокеры были разные, рынки разные, депозиты разные, чудеса всегда были одни и те же. Откуда следует вывод, что никто вам не даст
Цитата
купить на падении, или завершить торговый цикл шорт
, так что идею порвать динозавров одним ловким движением надо сразу выбросить и не забивать себе голову. Не порвете, затопчут. Курочка по зернышку клюет (в хорошую погоду, добавлю я).
Корреляция между интенсивностью биржевых торгов и проблемами на серверах брокеров
Так-то почти все "такие знания" в брокерском договоре написаны, ничего в них нет ни удивительного, ни нового.
Цитата
ISINhere2001 написал: что может служить резервной системой?
Ыщо один брокер? Прямой доступ? Это все неудобно, дорого и не панацея. В целом у меня нет ответа. Точнее ответ есть в ортогональном направлении: ну лежит и лежит, потом поторгуем.
Корреляция между интенсивностью биржевых торгов и проблемами на серверах брокеров
Пользователь
Сообщений: Регистрация: 21.08.2015
20.01.2022 02:40:55
Цитата
D7DSk написал: следы размещения средств не спрятать.
А зачем их прятать-то. Что мешает банку А открыть брокерский счет банку Б и учитывать его на том же общем счете? Ничего. Что мешает банку Б натарить офз на все плечи? Ничего.
Корреляция между интенсивностью биржевых торгов и проблемами на серверах брокеров
Пользователь
Сообщений: Регистрация: 21.08.2015
20.01.2022 02:24:31
D7DSk, не сказано, что счет отдельный для каждого клиента. ,
Цитата
3.9. В случае если договором первичного брокера и последующего брокера не предусмотрен обособленный учет обязательств клиентов, то все обязательства, исполняемые за счет или в пользу разных клиентов последующего брокера учитываются солидарно на омнибусном счете внутреннего учета или на разделе этого счета (далее - учет обязательств на нетто-основе).
Т.е. по дефолту ваши денежки должны быть в общем котле, который учитывается "как целое" (а-ля неттинг). Хотя брокер ведет внутренний учет по каждому клиенту отдельно (и должен это делать). НКЦ тоже на нетто-основе считает. Ну и дальше дело техники.
Последний раз сталкивался - было 25к в месяц, но это давно, тогда на мамбе брали 60к в квартал плюс брокер накидывал свое. Сейчас оно в нкц переехало, там вроде как по формуле от остатка средств с отрицательной ставкой, но я так понимаю, что условного васю с десятью лямами туда и не подпустят.
Корреляция между интенсивностью биржевых торгов и проблемами на серверах брокеров
Пользователь
Сообщений: Регистрация: 21.08.2015
19.01.2022 22:22:52
Цитата
ISINhere2001 написал: что такое неразделенные счета ?
Это когда брокер бабло всех клиентов заносит на один счет и торгует с этого счета. В противоположность сегрегированному счету, где если лежит копейка, ее трогать нельзя, на неразделенном брокер может своободную копейку использовать по своему усмотрению, если это тксть не мешает основному процессу. Что и делается. Но иногда основной процесс неожиданно активизируется, а копейка где-то задействована и быстро ее не извлечь.
Цитата
ISINhere2001 написал: чтобы брокер смог продать купленное вчера-сегодня
Вы с брокером не торгуете, он сливаемое клиентами не выкупает, скорее всего просто зареповал "лишние" бумаги и разместил "лишние" деньги, а тут оно всем понадобилось вдруг. А вот маркетмейкеры могли накушаться, да. Но не в этот раз, думаю. Когда их сильно прижимает, "технический сбой" случается на самой бирже )
Корреляция между интенсивностью биржевых торгов и проблемами на серверах брокеров
Пользователь
Сообщений: Регистрация: 21.08.2015
19.01.2022 21:27:35
Цитата
ISINhere2001 написал: резкое увеличение объема торгов
Технически биржа может в разы большие объемы обработать. Тут скорее дело в том, что основная масса ритейла сидит на неразделенных счетах, и когда весь ритейл кидается торговать (особенно в одну сторону), у брокера внезапно заканчиваются лимиты (потому что он "лишнее" бабло давно уже разместил). Народ заявки шлет, лимита нет, куды деваться? А давайте сервера положим.
Обезличенные сделки в квике
Пользователь
Сообщений: Регистрация: 21.08.2015
19.01.2022 17:38:04
Цитата
ISINhere2001 написал: стирает таблицу обезличенных сделок и начинает заново ее загружать
Если стирает вообще все, это скорей всего означает, что подключается на другой сервер. Тогда в меню "соединения" поставить галку "использовать параметры последнего подключения".
не существует, график точечный. Его иногда (=всегда) рисуют линией для облегчения восприятия, не более. Можно говорить о конечных разностях только.
Цитата
NoneB написал: средние скользящие линии являются первыми производными
Не являются. Если бы являлись, интеграл скользящей средней давал бы график цены, а на практике он в небо улетит. И они не линии, они тоже точки, определенные только там, где определен график цены. И даже если эти точки соединить линиями, непрерывной функции не получится, а получится ломаная.
Объясните, пожалуйста, один момент в коде.
Пользователь
Сообщений: Регистрация: 21.08.2015
16.01.2022 02:33:39
Для простоты посмотрим на четырехбитные числа. Пусть есть сборник флагов flags = 0b0010 и нам надо проверить, установлен ли бит с индексом 1 (второй бит то есть). Мы берем единицу 0b0001, сдвигаем влево до позиции интересующего бита (в примере на 1 бит, получаем 0b0010) и выполняем побитовую операцию AND с флагами: 0b0010 AND 0b0010 = 0b0010, результат не равен нулю, то есть TRUE. А если бит 1 не установлен, а установлен другой какой-то, пусть нулевой, т.е. flags = 0b0001, наша операция даст 0b0001 AND 0b0010 = 0b0000, результат равен нулю, то есть FALSE. А при проверке нулевого бита код тот же, просто сдвиг на 0 позиций делает ничего.
Как получить значение параметра "дата торгов" из таблицы сделок?
Пользователь
Сообщений: Регистрация: 21.08.2015
16.01.2022 02:23:25
Цитата
meteop написал: параметр для конкретной сделки получить
Если любой ценой получить, то можно из таблицы обезличенных сделок свою сделку по номеру выудить. Я же предположил, что пока идентификатор сессии не сменится, не сменится и TRADEDATE, а когда сменится - будет очищена таблица сделок и как бы уже нечего и получать.
Как получить значение параметра "дата торгов" из таблицы сделок?
Установка QUIK на Linux под Wine, Проблемы с актуальными на сегодняшний день версиями
Пользователь
Сообщений: Регистрация: 21.08.2015
13.01.2022 16:29:16
Андрей, тут столько намешано, что получается каждое предложение отдельно правильное, а текст в целом - нет. Чтобы текст в целом обрел смысл, нужно отделить архитектуру процессора от операционной системы.
Если мы говорим об архитектуре. Байкал - это прекрасно и здорово, он вообще-то не сильно отличается от эпловского М1, например, назло врагам. Эльбрус - может быть сколько угодно прекрасным по задумке и реализации, это просто "нитакой как фсе", на котором мало что будет работать когда бы то ни было, а в режиме эмуляции интела он завсегда любому интелу проиграет в разы. Поэтому в гражданском обороте ему делать нечего и говорить о нем применительно к гражданским задачам незачем.
Поэтому, говоря об архитектуре, мы должны спросить арку: не пора ли (попробовать) собрать квик под арм-винду. И все.
Если мы говорим об операционной системе. Не буду говорить, что линукс устарел задолго до того, как юный билли гейтс решил приделать к досу окошки, это только к холивару приведет. Линукс просто другая операционная система, под которую надо писать другой квик. Вообще с нуля. Поэтому хайли лайкли этого никогда не случится.
Может кто уже мучился с лучшим BID, OFFER?!, Пытаюсь реализовать алгоритм выставления лучшими заявками...
Пользователь
Сообщений: Регистрация: 21.08.2015
13.01.2022 15:01:45
Цитата
Владимир написал: Мне брокер сказал, что если стоит "умный заказ", то все остальные настройки не имеют значения, я всё равно должен получать реальные данные.
Это по дизайну. На практике может "самопроизвольно" сброситься галка (настройки - заказ данных - текущие параметры, посмотрите, стоит ли галка на бид на этом инструменте).
Цитата
Владимир написал: цена выставлявшейся заявки тоже стояла, как вкопанная
Что как бы подтверждает предположение. Не стоял же этот бид пять часов, даже в неликвиде шевеление есть какое-то.
Не туда смотрите, это дотнет. Квик - суровый сишный продукт, там .
Может кто уже мучился с лучшим BID, OFFER?!, Пытаюсь реализовать алгоритм выставления лучшими заявками...
Пользователь
Сообщений: Регистрация: 21.08.2015
13.01.2022 14:27:23
Цитата
Владимир написал: реальный бид каждый раз запрашивался заново из ТТТ перед подачей заявки.
Если фильтр по инструменту слетел, там было все время одно и то же, все пять часов, хотя реальный бид упрыгал конечно далеко. А по другим инструментам все могло ехать и ехать как положено. Есть ли в логе цена выставлявшейся заявки? Она менялась?
А графики в Квике не настоящие!!!
Пользователь
Сообщений: Регистрация: 21.08.2015
13.01.2022 14:22:32
Александр, я говорю только о том, считать ли свечи на сайте биржи непогрешимым идеалом, и говорю что нет. В обсуждение по существу не хочу углубляться, бо сам признаю только ордерлог как единственный источник истины и что я там из него нагорожу и по какому алгоритму это мое дело, так что не мне здесь высказывать мнение, как должно быть.
Алгоритмы да, разные. В принципе есть куча точек, где построение свечек может разойтись, не только по времени. Например, цена закрытия это последняя сделка или официальная цена закрытия согласно методике ее расчета? Везде по-разному, и для разных задач разное нужно.
А графики в Квике не настоящие!!!
Пользователь
Сообщений: Регистрация: 21.08.2015
13.01.2022 13:33:39
Цитата
Александр написал: разве сайт биржи не является "эталоном" построения свечей
Неа. Тут как-то тема была "о несоответствии", так при разгребании по ордерлогу оказалось, что битая свеча была таки на сайте биржи, а не в квике.
Может кто уже мучился с лучшим BID, OFFER?!, Пытаюсь реализовать алгоритм выставления лучшими заявками...
Пользователь
Сообщений: Регистрация: 21.08.2015
13.01.2022 13:30:49
Цитата
Владимир написал: Выставляет заявку, и... BID стоит, как вкопанный, а мой придурок ставит, снимает, ставит, снимает... вот так пять часов и простоял!
Если заявка попала в стакан и там есть встречный бид, она не может не исполниться, это означало бы, что сломана биржа, что вряд ли. Поэтому либо заявка по факту выставлена не была, либо стоящий как вкопанный бид стоит только в воображении клиента (например, слетел фильтр на получение этого параметра), а реальный бид далеко ниже.
Цитата
Владимир написал: коллбек не может быть вызван, пока не завершено выполнение другого коллбека
Это проистекает из того, как квик обрабатывает очередь сообщений в основном потоке. Выбрал сообщение, дернул колбеки, обновил таблицы, пошел за следующим сообщением. Т.е. даже если что-то и приехало в процессе, квик этого пока не видит. Но есть теоретическое исключение: если внутри колбека идет работа с окном, И эта работа содержит некий модальный цикл сообщений, И одним из выбранных сообщений в этом цикле будет сообщение о приезде чего-то нового, обработка вновь приехавшего произойдет внутри колбека и, следовательно, увидим вложенный колбек. Модальные циклы в дизасме видел, пытался воспроизвести вложенный колбек - не удалось, сделал вывод, что на основных путях такого не бывает. Но если сильно постараться, то может и бывает. Есть также другое (более простое) объяснение: гонки в коде логирования.