Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 12.05.2020
12.02.2026 13:20:29
Цитата
Nikolay написал: Когда я говорил о двойной очереди, я говорил именно о двух очередях.
Из написанного вами о двойной очереди (по сути реализующей одну) я не понял между какими функциональностями робота они могут использоваться и что при этом не обеспечивается в QLua, выложенным мной давно известным вариантом?
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 12.05.2020
09.02.2026 22:46:27
Цитата
VPM написал: Ну так это же просто двойная очередь, с которой я разбирался и только ленивый меня "по столу носом не возил".
Эта очередь разбиралась пользователем Старатель около 4-х лет назад. "Все украли до нас" .
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 12.05.2020
09.02.2026 22:41:39
Цитата
VPM написал: Более медленный вариант, чем скажем кольцевой буфер? Можете архитектуру привести или пример?
Не надо. Большинству пользователям достаточно использовать приведенный простой вариант, по эффективности мало отличающийся от вашего кольцевого буфера, который я видел. Но кто хочет может использовать и ваш.
Не приходит полная версия OnTrade
Пользователь
Сообщений: Регистрация: 12.05.2020
09.02.2026 22:27:45
Цитата
User12501 написал: Таким образом, до начала проверок и основного кода, ВСЕ trd сохраняются в текстовый файл.
1. Всю обработку вы делаете в служебном потоке коллбека (отличным от потока main). Этот поток в QUIK один и он обслуживает все запущенные скрипты QUIK. Когда он занят вашей обработкой он перестает выполнять свои служебные функции, в том числе, обработку вновь возникающих данных по сделкам. Если нет служебной очереди внутри QUIK, то возможны потери возникающих данных. В вашем варианте желательно как можно быстрее выполнять коллбек, например, записывая trd в очередь между коллбеком и потоком main (со sleep(50) ), в котором выполнять остальную обработку таблицы trd. Вариант реализации очереди выложен мной в соседней ветке пользователя VPM. 2. Если вам нужны данные по сделкам, то их можно получать готовыми из таблицы QUIK trade с помощью функции getItem. Зачем вы отрабатываете "сырые" коллбеки OnTrade?
Не видя вашего кода, сложно что-то сказать, но попробуйте сделать sleep(50) и посмотрите что будет. С задержкой 585000 ваш код в main практически отключен. Это так вами задумано?
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 12.05.2020
09.02.2026 19:36:26
Цитата
VPM написал: А задача стоит, приврать систему если не в «надежную» то, в предсказуемо безопасную и рассуждая о ней как о risk - engine, а не просто коде? Что думаете не возможно?
Возможно:
Цитата
TGB написал: можно создавать скрипты работающие месяцами без перезапусков до очередного обновления windows.
Это не теоретическое предположение, а существующие реализации. Но их основа, по возможности, простые решения с учетом сферы их применения.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 12.05.2020
09.02.2026 19:20:52
Цитата
Nikolay написал: И даже в рамках одной очереди, лучше использовать две, разбивая их на четные и нечетные. И писать, читать поочередно.Записал в четную, потом в нечетную, потом четную, нечетную.Читать нечетная, потом четная и т.д.Это частично может помочь избежать блокировок. Или просто случайным образом выбирать какую очередь использовать первую.
По этой части есть возражение. Можно делать проще, используя только одну очередь, реализованную таким образом, что в ней невозможны блокировки, если она используется только между двумя потоками (main и потоком коллбеков). Варианты реализации такой очереди на форуме выкладывались не один раз, но так как реализация короткая, то я повторюсь:
Код
---- Функции работы с очередями --
--- При использовании между потоком колбеков и потоком main очереди потокобезопасные. ---
--- Создать очередь
function QueueNew()
return {first = 1, last = 0 }
end
--- Записать в очередь --
function QueuePush(self, v)
if v == nil then error('!!! Ошибка. Параметр v функции QueuePush nil') end
local last = self.last + 1
self[last] = v
self.last = last
return last - self.first + 1 -- количество элементов в очереди ---
end
--- Читать очередь --
function QueuePop(self)
local first = self.first
if first > self.last then return nil end
local v, v1 = self[first], self[first + 1]
self.first = first + 1
self[first] = nil
v1 = type (v1) == 'string' and #v1 or 0
return v, v1 -- v1 -длина следующего элемента (если строка) ---
end
-- Текущий размер очереди ---
function QueueSize(self)
return self.last - self.first + 1
end
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 12.05.2020
09.02.2026 13:07:27
Цитата
VPM написал: Проверка подхода, надёжной архитектуры: "FSM + события терминала как единственный источник истины", приводит к такому количеству ситуаций, при которых сервис если не падает, то надежным точно не назовёшь.
Кто вам сказал, что эта архитектура надежная? Зачем заниматься событиями QUIK, когда для торговли нужно знать состояние своего счета и какую то "картину" рынка? Зачем возиться с корутинами, если все можно сделать проще используя только функции? Вы легких путей не ищете . Как и любая готовая программа (в том числе наши собственные) QUIK несовершенен и у него есть недостатки и ошибки, но в нем, в текущей момент, можно создавать скрипты работающие месяцами без перезапусков до очередного обновления windows.
onstop и колбек пользовательского окна
Пользователь
Сообщений: Регистрация: 12.05.2020
07.02.2026 19:36:11
Цитата
tohoki написал: Когда пользователь закрывает терминал при запущенном скрипте, завершать работу скрипта не нужно, она должна продолжаться автоматом при следующем запуске терминала.
Код
while _RUN_ do
---Тело основного цикла скрипта --
end
if TBL_QUIK then -- Если используются таблицы QUIK
-- #### Задержка sleep нужна чтобы установился признак запуска скрипта при перезапуске QUIK.
-- Иначе при перезапуске QUIK не будет перезапущен скрипт.--
-- При нормальном завершении QUIK, если есть таблицы QUIK, они удаляются (и вызываются коллбеки QTABLE_CLOSE)
-- Если при этом нет задержки, то скрипт завершается и не выставляется признак необходимости его перезапуска
-- при запуске QUIK. Признак TBL_QUIK устанавливается в основной пользовательской таблице QUIK.
-- Длительность задержки выбрана экспериментально.
sleep(1000)
end
При запусках коллбеков не восстанавливается состояние скрипта по сборке мусора (QUIK 12.2.1.2)
Пользователь
Сообщений: Регистрация: 12.05.2020
04.02.2026 17:59:20
Цитата
Йцукен написал: Можете привести пример кода, где отключение сборщика мусора увеличит его выполнение?А то у меня наблюдается ровно обратная ситуация.
1.
Цитата
TGB написал: разработчики QUIK перед выполнением любого коллбека отключают сбор мусора, если он был включен, а после выполнения коллбека, включают, если сборка мусора была до выполнения скрипта.
2.
Цитата
TGB написал: Надо ли это делать и когда и в какие интервалы, каждый решает для себя.
Для себя я не вижу необходимости "дергать" сборку мусора. В начале main выполняю: collectgarbage ('setpause', 200) -- сборка мусора после увеличения памяти скрипта на 100% после очередной сборки. И все. У меня сборка мусора возникает с интервалом ~15 сек. и длится < 1 млс.
При запусках коллбеков не восстанавливается состояние скрипта по сборке мусора (QUIK 12.2.1.2)
Сборка мусора выполняется в том же потоке, что и код пользователя и при этом код пользователя приостанавливается на время сбора мусора. У кого то из пользователей могут быть участки скрипта критичные по времени выполнения, на которых они имеют возможность отключать, но потом восстанавливать сборку мусора. Надо ли это делать и когда и в какие интервалы, каждый решает для себя. Например, разработчики QUIK перед выполнением любого коллбека отключают сбор мусора, если он был включен, а после выполнения коллбека, включают, если сборка мусора была до выполнения скрипта. Надо понимать, что при отключении сбора мусора начинает непрерывно расти объем оперативной памяти скрипта. Включение сбора мусора возвращает прежний режим управления памятью скрипта.
При запусках коллбеков не восстанавливается состояние скрипта по сборке мусора (QUIK 12.2.1.2)
Пользователь
Сообщений: Регистрация: 12.05.2020
26.01.2026 14:03:00
Цитата
Йцукен написал: В каком потоке это целесообразно делать: в OnCleanUp или в main?
В main. Разработчики специально отключают мусорщик перед запуском коллбеков, чтобы те быстрее выполнялись. Это и все детали обработки коллбеков описаны в комментариях данной ветки.
Извечный вопрос: повторные вызовы OnTrade, Даже при заявке на одну акцию
Какие скоростные алгоритмы? Когда есть ограничение архитектуры QUIK. Факторами возможных задержек в нем являются <Реализация скрипта> -> <Реализация QUIK> -> <Используемая аппаратура ПК> -> <Канал связи с брокером> -> <Сервер брокера> -> -> <Канал связи брокера с биржей> -> <Биржа>.
Извечный вопрос: повторные вызовы OnTrade, Даже при заявке на одну акцию
Пользователь
Сообщений: Регистрация: 12.05.2020
10.01.2026 16:24:45
Цитата
Йцукен написал: Думаю такой подход сложнее, чем обработка колбеков.
Обработка перезапусков скрипта по любой неконтролируемой вами причине у вас не предусмотрена? Пока он перезапускается заявки на бирже могут быть выполнены, а коллбеки пропущены. Вы предполагаете что и коллбеки в работающем скрипте не теряются?
Извечный вопрос: повторные вызовы OnTrade, Даже при заявке на одну акцию
Пользователь
Сообщений: Регистрация: 12.05.2020
10.01.2026 12:51:49
Цитата
VPM написал: И это еще не вся проблематика, ведь нужно данные периодически синхронизировать с данными QUIK.
Зачем синхронизировать с данными QUIK, когда можно их использовать всегда? Зачем обрабатывать "сырые" коллбеки, когда можно проверять циклически, по изменению их размеров, нужные вам таблицы QUIK (таблицы заявок, стоп-заявок, сделок и т.д.)? Вы же в своих стратегиях, наверное, учитываете состояние вашего портфеля, а не занимаетесь подсчетом коллбеков . Коллбеки имеет смысл использовать только там, где без них не обойтись (например, OnTransReply, в которых может быть информация о причине невыполнения транзакции).
Если бы я был архитектором QUIK, Что стоило бы изменить в QUIK по-крупному
Пользователь
Сообщений: Регистрация: 12.05.2020
26.12.2025 10:11:53
Цитата
Oleg Kuzembaev написал: В вашем случае транзакция успешно доходит до сервера и не отвергается им, однако не отправляется дальше в ТС из-за установленных брокером ограничений на количество транзакций в секунду
Ответ понятен. Спасибо. Я предполагал, что контроль трафика делается в клиенте (QUIK). Это было бы, наверное, более эффективно: 1) ближе к месту возникновения ситуации (более быстрая реакция на ситуацию); 2) меньше трафик между клиентом и сервером ; 3) разгрузка сервера от функции, перенесенной в клиент. --- Вообще, в клиент-серверной архитектуре, являющейся распределенной, те функции сервера, которые можно, желательно реализовывать в клиенте.
Если бы я был архитектором QUIK, Что стоило бы изменить в QUIK по-крупному
Пользователь
Сообщений: Регистрация: 12.05.2020
24.12.2025 12:09:12
В QUIK 12.8.2.9 (а может быть и более старых версиях - не проверял), при массовой подаче 100 заявок, появляется сообщение QUIK: "Превышено максимальное количество транзакций 50 в интервале 1 сек.". При этом, первые 50 заявок выставляются, а остальное игнорируется без выдачи текста ошибки выполнения транзакции в функции sendTransaction. Текст ошибки выполнения транзакции в данной ситуации надо выдавать.
Если бы я был архитектором QUIK, Что стоило бы изменить в QUIK по-крупному
Пользователь
Сообщений: Регистрация: 12.05.2020
22.12.2025 18:34:28
Цитата
TGB написал: Ни одного технического вопроса по почте мне решить не удалось.
Относительно данного инцидента это не так. На посланные дампы разработчики ответили оперативно. После чего выяснилось, что дампы возникли из-за сторонней dll (пакет IUP), используемой в другом моем запущенном скрипте. При «откате» на более старую версию IUP, дампы исчезли.
При смене инструмента графика в Lua индикаторе OnDestroy() не вызывается
Если бы я был архитектором QUIK, Что стоило бы изменить в QUIK по-крупному
Пользователь
Сообщений: Регистрация: 12.05.2020
02.12.2025 20:54:00
Цитата
nikolz написал: Из своего опыта замечу, что долго грузится в основном по причине работы скриптов и индикаторов на Lua на истории
Время загрузки QUIK я проверял на реальном брокере без открытия графиков и без таблиц.
nikolz зачем вы работаете на форуме "прокладкой" между комментариями пользователей?
Если бы я был архитектором QUIK, Что стоило бы изменить в QUIK по-крупному
Пользователь
Сообщений: Регистрация: 12.05.2020
02.12.2025 18:34:24
Я в публичку пишу потому, что общение с поддержкой по почте оказалось сугубо отрицательным (исключая организационные вопросы с Алексеем). Ни одного технического вопроса по почте мне решить не удалось.
"Никогда не было и вот опять" 02.12.25 QUIK 12.8.1.6 брокер ВТБ QUIK падает сразу после:
Код
KW 02.12.25 10:01:00:071 -> Подана начальная лимитная заявка открытия позиции. TRADER.SetOrder
KW 02.12.25 10:01:07:168 -> Создана позиция на акцию MTLR
Заявка при этом была создана. Дампа от самого QUIK нет.
Есть дамп QUIK от W11 (интересное выделено ####):
Код
Version=1
EventType=BEX64
EventTime=134091324829545188
ReportType=2
Consent=1
UploadTime=134091324839947229
ReportStatus=268435456
ReportIdentifier=f78c1db2-991c-48e7-b3aa-345bbeae0654
IntegratorReportIdentifier=ddcd0da6-12c1-4cf9-be3a-ed050ce1a7bc
Wow64Host=34404
NsAppName=info.exe
OriginalFilename=INFO.EXE
AppSessionGuid=0000f9ac-0001-001e-4462-e0473c60dc01
TargetAppId=W:000672777e56bdcba4ff36fdbc37cc2c8d7200001904!0000d0c4dc424c674b736b0abeeba3e877466abdb072!info.exe
TargetAppVer=2025//11//19:13:06:13!1188a81!info.exe
BootId=4294967295
TargetAsId=74913
UserImpactVector=269484848
IsFatal=1
Response.BucketId=eb2cc38200ec50eaebef38537bcd66cf
Response.BucketTable=5
Response.LegacyBucketId=2012889489668400847
Response.type=4
Sig[0].Name=Имя приложения
Sig[0].Value=info.exe
Sig[1].Name=Версия приложения
Sig[1].Value=12.8.1.6 -- #### QUIK
Sig[2].Name=Отметка времени приложения
Sig[2].Value=691dc0c5
Sig[3].Name=Имя модуля с ошибкой
Sig[3].Value=lua54.dll -- #### lua54.dll (разработка от ARQA)
Sig[4].Name=Версия модуля с ошибкой
Sig[4].Value=4.6.3.1 -- #### ??
Sig[5].Name=Отметка времени модуля с ошибкой
Sig[5].Value=68db6225
Sig[6].Name=Смещение исключения
Sig[6].Value=00000000000452a8
Sig[7].Name=Код исключения
Sig[7].Value=c0000409 -- #### Код исключения c0000409
Sig[8].Name=Данные исключения
Sig[8].Value=0000000000000007
DynamicSig[1].Name=Версия ОС
DynamicSig[1].Value=10.0.26200.2.0.0.256.48
DynamicSig[2].Name=Код языка
DynamicSig[2].Value=1049
DynamicSig[22].Name=Дополнительные сведения 1
DynamicSig[22].Value=5399
DynamicSig[23].Name=Дополнительные сведения 2
DynamicSig[23].Value=53994b242e91f2f520fb924ad8209cd4
DynamicSig[24].Name=Дополнительные сведения 3
DynamicSig[24].Value=f682
DynamicSig[25].Name=Дополнительные сведения 4
DynamicSig[25].Value=f68274b370b0a8397490f9d1d1f9fd15
UI[2]=C:\QUIK_VTB\info.exe
LoadedModule[0]=C:\QUIK_VTB\info.exe
LoadedModule[1]=C:\WINDOWS\SYSTEM32\ntdll.dll
LoadedModule[2]=C:\WINDOWS\System32\KERNEL32.DLL
LoadedModule[3]=C:\WINDOWS\System32\KERNELBASE.dll
...
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 12.05.2020
22.11.2025 11:27:18
Цитата
nikolz написал: Поэтому привел этот вариант ему уже лет пятнадцать.
Вы, мягко выражаясь, очень наивны, если думаете, что кому-то непонятно как и когда появился ваш код. Я выложил свой код 18.11.25. Вы его прочитали и до 21.11.25 тужились как бы его "переплюнуть". Ну и что вы написали (читаем отзывы пользователей)? Свой "пятнадцатилетний" код вы до сих пор правите на форуме "Обмен опытом".
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 12.05.2020
18.11.2025 20:09:02
Цитата
VPM написал: Переписал с помощью корутин, здесь их применение наиболее показательно.
Это можно сделать короче:
Код
RUN = true
function main()
-- Функции для асинхронного запроса свечей ---
-- 1. Массовый запрос свечей BulkRequestCandles.
-- Параметр: таблица {{class_code, sec_code, interval}}
-- Результат: {{class_code, sec_code, interval, ds}}
local BulkRequestCandles = function(par)
for i = 1, #par do
par[i].ds = CreateDataSource(par[i].class_code, par[i].sec_code, par[i].interval)
end
end
----------------------------------------
-- 2. Проверка запроса свечей CheckingCandleRequest.
-- Параметр: таблица {{class_code, sec_code, interval, ds}}
-- Результат в таблице парамктров : {{class_code, sec_code, interval, ds, ok}}
-- Значения ok: true - данные начали поступать; nil данные еще не поступили;
-- false - ошибка в параметрах запроса
-- Знвчение функции: количеситво источников еще ожидающих данные --
local CheckingCandleRequest = function(par)
local N = #par
local ds
for i = 1, #par do
ds = par[i].ds
if type(ds) == 'string' then -- обнаруженная ранее ошибка в параметрах запроса
N = N - 1
else
if par[i].ok == nil then -- еще не дождались данных
if ds == nil then -- обнаружена ошибка
par[i].ds = ' *** Ошибка в параметрах запроса'
par[i].ok = false
else
-- проверка поступления данных
if ds:Size() > 0 then -- есть данные
par[i].ok = true
N = N - 1
end
end
else
N = N - 1
end
end
end
return N
end
-------------------------------------------------
local sec_list = {}
sec_list[#sec_list+1] = {class_code = 'QJSIM', sec_code = 'SBER', interval = 1}
sec_list[#sec_list+1] = {class_code = 'QJSIM', sec_code = 'SBER', interval = 2}
sec_list[#sec_list+1] = {class_code = 'QJSIM', sec_code = 'SBER', interval = 5}
sec_list[#sec_list+1] = {class_code = 'QJSIM', sec_code = 'SBER', interval = 10}
sec_list[#sec_list+1] = {class_code = 'QJSIM', sec_code = 'SBER', interval = 20}
sec_list[#sec_list+1] = {class_code = 'QJSIM', sec_code = 'GAZP', interval = 10}
sec_list[#sec_list+1] = {class_code = 'QJSIM', sec_code = 'GAZP', interval = 2}
sec_list[#sec_list+1] = {class_code = 'QJSIM', sec_code = 'GAZP', interval = 5}
sec_list[#sec_list+1] = {class_code = 'QJSIM', sec_code = 'LKOH', interval = 5}
sec_list[#sec_list+1] = {class_code = 'QJSIM', sec_code = 'FEES', interval = 5}
sec_list[#sec_list+1] = {class_code = 'SPBFUT', sec_code = 'SiZ5', interval = 5}
sec_list[#sec_list+1] = {class_code = 'SPBFUT', sec_code = 'RIZ5', interval = 5}
sec_list[#sec_list+1] = {class_code = 'SPBFUT', sec_code = 'RIZ5', interval = 15}
sec_list[#sec_list+1] = {class_code = 'SPBFUT', sec_code = 'SRZ5', interval = 30}
BulkRequestCandles(sec_list)
--------------
local DS = false
while RUN do
-- Проверка поступления свечей (без блокирования цикла обработки)
if CheckingCandleRequest(sec_list) == 0 and not DS then
DS = true
-- Отладочная печать --
for i = 1, #sec_list do
if sec_list[i].ok == true then
message(sec_list[i].sec_code ..' ds:size() = ' .. sec_list[i].ds:Size()
..' interval = ' .. sec_list[i].interval)
else -- Ошибка задания параметров
message(sec_list[i].sec_code..' interval = ' .. sec_list[i].interval
.. sec_list[i].ds )
end
end
end
-- Выполнение заданий скрипта --
sleep (100)
end
end
function OnStop(signal)
RUN = false
return 5000
end
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 12.05.2020
17.11.2025 16:27:10
Цитата
Nikolay написал: Закажете сразу, да. Но выйдете из метода только после ожидания.
Не обязательно написанное мной реализовывать в одном методе. Метод1:
Цитата
TGB написал: Параметром при этом может быть таблица со списком class_code, sec_code, tf. В цикле запрашиваются ds[i],
Метод2:
Цитата
TGB написал: в цикле выполняется проверки поступления данных (как это делается в выложенной функции) и выдается результат в виде таблицы параметра с добавленным полем ds.
И все делается, как вы описали, без блокировки.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 12.05.2020
17.11.2025 15:18:51
Цитата
Nikolay написал: Просто к слову - это блокирующая реализация. По опыту, данные могут приходить долго.
Я написал как запрашивать сразу много тикеров, хоть 1000:
Цитата
TGB написал: Ее легко изменить для запроса данных по многим тикерам: Параметром при этом может быть таблица со списком class_code, sec_code, tf. В цикле запрашиваются ds[i], а затем в цикле выполняется проверки поступления данных (как это делается в выложенной функции) и выдается результат в виде таблицы параметра с добавленным полем ds.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 12.05.2020
17.11.2025 14:31:22
Цитата
VPM написал: А как же проверить? Убедиться что все работает?
Функция запроса данных свечей по тикеру с учетом возможных задержек:
Ее легко изменить для запроса данных по многим тикерам: Параметром при этом может быть таблица со списком class_code, sec_code, tf. В цикле запрашиваются ds[i], а затем в цикле выполняется проверки поступления данных (как это делается в выложенной функции) и выдается результат в виде таблицы параметра с добавленным полем ds.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 12.05.2020
06.11.2025 09:54:02
Цитата
VPM написал: TGB , Ну вот, Можете же, нормально изъясняться в пределах общения, без излишней надменности.
Вы почитали историю? Там есть ответы на все ваши (характерные для начинающих) вопросы. Похоже, нет.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 12.05.2020
06.11.2025 09:43:13
Цитата
VPM написал: Это — мощный объектно-ориентированный фреймворк для рыночных данных на Lua, для QUIK.
Не буду утверждать точно (в отличие от вас я всегда сомневаюсь ), но мне кажется, что это ваши очередные иллюзии.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 12.05.2020
06.11.2025 09:27:37
VPM, и все таки мне интересно, вы понимаете, что, если корутина, при своем вызове выполняет, пусть 50 простых (не циклических) операций (эквивалентных по затратам процессорного времени ~2 вызовам пустых функций), то КПД использования процессорного времени вашего ПК: 25 / 125 = 20 %. Вы понимаете, что ресурс процессорного времени является общим? И если вы его расходуете в своем скрипте, то медленнее выполняются функции QUIK. Покажите, где у вас корутина в цикле выполняет > 20 простых операций. Вы же "печетесь":
Цитата
VPM написал: Вы можете показать оптимальный подход в квик, для получения и обработки оперативных данных, именно оперативных?
Вы понимаете, термин оптимальный? По простому, лучше не бывает. В каких условиях (ограничениях)? Зачем вы пишите о том, чего не понимаете?
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 12.05.2020
06.11.2025 08:43:50
Цитата
VPM написал: вы обрабатываете события последовательно перебираете очередь или есть приоритеты, если есть то чем обосновываете?
Nikolay вам объяснил, что не надо обрабатывать события. Зачем вам изучать жизнь событий? Когда для принятия решений достаточно (наряду с определением текущего состояния вашего счета, индикаторами принятия решений): определить как и когда выполняются ваши заявки. Все это можно увидеть в таблицах состояния QUIK (orders, stop_orders и т.д.), которые вы можете опрашивать циклически. Это вы можете делать в том порядке, который вам нужен в вашей стратегии торгов. Единственный коллбек, который имеет смысл обрабатывать (с учетом того, что он может потеряться) это OnTransReply, так как в нем может быть информация о причине невыполнения вашей транзакции. Все остальные коллбеки - от "лукавого". Нужно понимать что "реактивность" (задержка выполнения команд) QLua ~1- 60 сек. Все это не однократно обсуждалось на этом форуме: читайте историю (все украли до нас ).
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 12.05.2020
05.11.2025 13:16:56
Цитата
VPM написал: Можно делать yield-циклы с sleep(1000) без потери отзывчивости терминала.
А тогда почему бы не sleep(10000)? Сделайте у себя и не забудьте потом рассказать об успехах торговли роботом. Терминал у вас точно будет отзывчатым. Вообще, я не стал бы вас комментировать, но на форуме могут быть дети , в вы такое несете.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
В ~100 раз. Вы философ . 2. У вас есть понятие, что при использовании корутин надо синхронизироваться, если в них используются общие изменяемые данные? То есть следить за тем, чтобы данные недоделанные в одной корутине не использовались в другой. Вы когда-нибудь занимались параллельным программированием?
Если бы я был архитектором QUIK, Что стоило бы изменить в QUIK по-крупному
Пользователь
Сообщений: Регистрация: 12.05.2020
31.10.2025 09:41:14
Свежее свидетельство долгого восстановления взаимодействия рабочего места QUIK с сервером:
Цитата
Nikolay написал: При этом данные после такой чистки загружаются минуты.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
По вашим же тестам накладные расходы на вызов корутин в 97.33 раз больше, чем на вызов функций (coroutine=584.000 мс , func=6.000 мс ). Чтобы для вас было наглядно, при всяком вызове корутины, прежде чем она начнет что-то делать, делается 97 пустых вызовов функций.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 12.05.2020
28.10.2025 22:29:29
Цитата
nikolz написал: сделал прикольный тест на оценку быстродействия корутин.
Вы обнаружили существенную деградацию эффективности реализации корутин в Lua 5.4.1. Причем при выполнении модифицированного мною вашего теста она больше, чем вы пишите: накладные расходы на вызов корутин больше по сравнению с вызовом функции ~150 раз. В Lua 5.1 эта разница была ~4 раза. Кому интересно, можно проверить в QUIK 8.4.1. Код теста:
Код
function main()
local N =100000
local function foo ()
local yield = coroutine.yield
while 1 do
yield()
end
end
local function foo1 () return end
-----
local out = 'Результат теста: количество вызовов = ' .. N .. ', время вызова сопрограммы '
local resume = coroutine.resume
local co = coroutine.create(foo)
local TT1 = os.clock()
for i =1, N do resume(co) end
TT1 = (os.clock() - TT1) * 1000
out = out .. TT1 .. ' млс.'
-- message('coroutine = ' .. (os.clock() - TT) * 1000)
local TT2 = os.clock()
for i =1, N do foo1(10) end
TT2 = (os.clock() - TT2) * 1000
-- message('function = '.. (os.clock() - TT) * 1000)
out = out .. ', функции ' .. TT2 .. ' млс. T1/T2 = ' .. TT1/TT2
message(out)
end
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
DestroyTable (и Clear) закрывает скрипт вместо таблицы, Тема описана в Названии и в Тексте сообщения
Пользователь
Сообщений: Регистрация: 12.05.2020
14.10.2025 08:08:47
Цитата
paluke написал: Не только DestroyTable(), любые операции с таблицей не выполняются.
Цитата
TGB написал: Работа с таблицами QUIK выполняется в служебном потоке, отличном от main. В том же, в котором выполняется OnStop. И пока выполняется OnStop никакие операции с таблицами QUIK не возможны (поток работы с таблицами занят OnStop ).
Если бы я был архитектором QUIK, Что стоило бы изменить в QUIK по-крупному
Пользователь
Сообщений: Регистрация: 12.05.2020
13.10.2025 19:13:30
Дополнительно для анализа долгого запуска QUIK: 1) 2) 3)
Если бы я был архитектором QUIK, Что стоило бы изменить в QUIK по-крупному
Пользователь
Сообщений: Регистрация: 12.05.2020
13.10.2025 16:53:28
Цитата
Oleg Kuzembaev написал: Ранее уже ответили вам письмом на почту.
Здравствуйте. У меня в почте письма нет. Пришлите, пожалуйста повторно.
DestroyTable (и Clear) закрывает скрипт вместо таблицы, Тема описана в Названии и в Тексте сообщения
Пользователь
Сообщений: Регистрация: 12.05.2020
13.10.2025 16:14:37
Цитата
nikolz написал: Если он вызывается в main то вызов это и есть исполнение.
nikolz писатель ? Читайте:
Цитата
TGB написал: она не лезет в таблицы QUIK, а создает коллбек закрытия таблицы, который обрабатывается в потоке терминала,
Если бы я был архитектором QUIK, Что стоило бы изменить в QUIK по-крупному
Пользователь
Сообщений: Регистрация: 12.05.2020
12.10.2025 09:17:59
Цитата
TGB написал: 1) При проверке многократной (> 8 раз) остановки/запуска скрипта, в котором используется сторонний графический пакет IUP, QUIK (версия 12.6.1.2, Lua 5.4), после разного количества экспериментов, в моменты останова/запуска, падает: Дамп info_dmp_20251007_150748.dmp вышлю почтой.
На это нет ответа. ---- Предложения: 1) После завершения OnStop не обрабатывать только коллбеки, зарегистрированные в main. Коллбеки создаваемые в main продолжать отрабатывать (смотрите ветку . 2) Реализовать/проверить сихронизацию основного потока QUIK с потоком main при его остановки (не обращаться из основного потока к данным завершенного потока).
DestroyTable (и Clear) закрывает скрипт вместо таблицы, Тема описана в Названии и в Тексте сообщения
Зачем полагать, когда можно проверить. Переставьте DestroyTable в OnStop.
2.
Цитата
nikolz написал: Функция DestroyTable в данном примере вызывается в потоке Main.
Вы точно знаете как устроена DestroyTable? Не точно, но скорее всего, это реализовано следующим образом. При том, что DestroyTable вызывается в main, она не лезет в таблицы QUIK, а создает коллбек закрытия таблицы, который обрабатывается в потоке терминала, но он занят более интересным делом : остановкой скрипта (удаляет поток main и перестает обрабатывать коллбеки, созданные в нем, так как исчезнет контекст их выполнения).
DestroyTable (и Clear) закрывает скрипт вместо таблицы, Тема описана в Названии и в Тексте сообщения
Пользователь
Сообщений: Регистрация: 12.05.2020
11.10.2025 19:01:44
Цитата
Ростислав Дм. Кудряшов написал: В каком потоке управления выполняется вызов функции DestroyTable()
Работа с таблицами QUIK выполняется в служебном потоке, отличном от main. В том же, в котором выполняется OnStop. И пока выполняется OnStop никакие операции с таблицами QUIK не возможны (поток работы с таблицами занят OnStop ). OnStop в любом случае завершает скрипт, поэтому DestroyTable не выполнена и созданная в скрипте таблица существует после завершения скрипта. Если что то надо делать с таблицами по кнопке завершить, то это надо делать в функции OnStop.
DestroyTable (и Clear) закрывает скрипт вместо таблицы, Тема описана в Названии и в Тексте сообщения