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

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

Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 16 След.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
Nikolay написал:
Когда я говорил о двойной очереди, я говорил именно о двух очередях.
    Из написанного вами о двойной очереди (по сути реализующей одну) я не понял между какими функциональностями робота они могут использоваться и что при этом не обеспечивается в QLua, выложенным мной давно известным вариантом?
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
VPM написал:
Ну так это же просто двойная очередь, с которой я разбирался и только ленивый меня "по столу носом не возил".
    Эта очередь разбиралась пользователем Старатель около 4-х лет назад. "Все украли до нас" :smile: .
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
VPM написал:
Более медленный вариант, чем скажем кольцевой буфер? Можете архитектуру привести или пример?
     Не надо. Большинству пользователям достаточно использовать приведенный простой вариант, по эффективности мало отличающийся от вашего кольцевого буфера, который я видел. Но кто хочет может использовать и ваш.
Не приходит полная версия OnTrade
 
Цитата
User12501 написал:
Таким образом, до начала проверок и основного кода, ВСЕ trd сохраняются в текстовый файл.
   1. Всю обработку вы делаете в служебном потоке коллбека (отличным от потока main). Этот поток в QUIK один и он обслуживает все запущенные скрипты QUIK. Когда он занят вашей обработкой он перестает выполнять свои служебные функции, в том числе, обработку вновь возникающих данных по сделкам. Если нет служебной очереди внутри QUIK, то возможны потери возникающих данных. В вашем варианте желательно как можно быстрее выполнять коллбек, например, записывая trd в очередь между коллбеком и потоком main (со sleep(50) ), в котором выполнять остальную обработку таблицы trd. Вариант реализации очереди выложен мной в соседней ветке пользователя VPM.
   2. Если вам нужны данные по сделкам, то их можно получать готовыми из таблицы QUIK trade с помощью функции getItem. Зачем вы отрабатываете "сырые" коллбеки OnTrade?
Не приходит полная версия OnTrade
 
Цитата
User12501 написал:
Да. Примерно 10 минут.
   Не видя вашего кода, сложно что-то сказать, но попробуйте сделать  sleep(50)  и посмотрите что будет.
С задержкой 585000 ваш код в main практически отключен. Это так вами задумано?
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
VPM написал:
А задача стоит, приврать систему если не в «надежную» то, в предсказуемо безопасную и рассуждая о ней как о risk - engine, а не просто коде? Что думаете не возможно?
     Возможно:
Цитата
TGB написал:
можно создавать скрипты работающие месяцами без перезапусков до очередного обновления windows.
    Это не теоретическое предположение, а существующие реализации. Но их основа, по возможности, простые решения с учетом сферы их применения.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
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), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
VPM написал:
Проверка подхода, надёжной архитектуры: "FSM + события терминала как единственный источник истины",  приводит к такому количеству ситуаций, при которых сервис если не падает, то надежным точно не назовёшь.
   Кто вам сказал, что эта архитектура надежная? Зачем заниматься событиями QUIK, когда для торговли нужно знать состояние своего счета и какую то "картину" рынка? Зачем возиться с корутинами, если все можно сделать проще используя только функции?
   Вы легких путей не ищете :smile: .
   Как и любая готовая программа (в том числе наши собственные) QUIK несовершенен и у него есть недостатки и ошибки, но в нем, в текущей момент, можно создавать скрипты работающие месяцами без перезапусков до очередного обновления windows.
onstop и колбек пользовательского окна
 
Цитата
tohoki написал:
Когда пользователь закрывает терминал при запущенном скрипте, завершать работу скрипта не нужно, она должна продолжаться автоматом при следующем запуске терминала.
Код
while _RUN_ do
    ---Тело основного цикла скрипта --
end
if  TBL_QUIK then  -- Если используются таблицы QUIK
     -- #### Задержка sleep нужна чтобы установился признак запуска скрипта при перезапуске QUIK. 
     -- Иначе при перезапуске QUIK не будет перезапущен скрипт.--
     -- При нормальном завершении QUIK, если есть таблицы QUIK, они удаляются (и вызываются коллбеки QTABLE_CLOSE)
     -- Если при этом нет задержки, то скрипт завершается и не выставляется признак необходимости его перезапуска
     -- при запуске QUIK. Признак TBL_QUIK  устанавливается в основной пользовательской таблице QUIK. 
     -- Длительность задержки выбрана экспериментально.
     sleep(1000) 
end 

Не приходит полная версия OnTrade
 
Цитата
User12501 написал:
585 секунд
  У вас sleep(585000)???
При запусках коллбеков не восстанавливается состояние скрипта по сборке мусора (QUIK 12.2.1.2)
 
Цитата
Йцукен написал:
Можете привести пример кода, где отключение сборщика мусора увеличит его выполнение?А то у меня наблюдается ровно обратная ситуация.
    1.
Цитата
TGB написал:
разработчики QUIK перед выполнением любого коллбека отключают сбор мусора, если  он был включен, а после выполнения коллбека, включают, если сборка мусора была до выполнения скрипта.
    2.
Цитата
TGB написал:
Надо ли это делать и когда и в какие интервалы, каждый решает для себя.
    Для себя я не вижу необходимости "дергать" сборку мусора. В начале main выполняю:  collectgarbage ('setpause', 200)  -- сборка мусора после увеличения памяти скрипта на 100% после очередной сборки. И все.   У меня сборка мусора возникает с интервалом ~15 сек. и длится < 1 млс.
При запусках коллбеков не восстанавливается состояние скрипта по сборке мусора (QUIK 12.2.1.2)
 
Цитата
Йцукен написал:
Можно. А зачем?
     Сборка мусора выполняется в том же потоке, что и код пользователя и при этом код пользователя приостанавливается на время сбора мусора. У кого то из пользователей могут быть участки скрипта критичные по времени выполнения, на которых они имеют возможность отключать, но потом восстанавливать сборку мусора. Надо ли это делать и когда и в какие интервалы, каждый решает для себя. Например, разработчики QUIK перед выполнением любого коллбека отключают сбор мусора, если  он был включен, а после выполнения коллбека, включают, если сборка мусора была до выполнения скрипта. Надо понимать, что при отключении сбора мусора начинает непрерывно расти объем оперативной памяти скрипта. Включение сбора мусора возвращает прежний режим управления памятью скрипта.
При запусках коллбеков не восстанавливается состояние скрипта по сборке мусора (QUIK 12.2.1.2)
 
Цитата
Йцукен написал:
В каком потоке это целесообразно делать: в OnCleanUp или в main?
   В main.
   Разработчики специально отключают мусорщик перед запуском коллбеков, чтобы те быстрее выполнялись. Это и все детали обработки коллбеков описаны в комментариях данной ветки.
Извечный вопрос: повторные вызовы OnTrade, Даже при заявке на одну акцию
 
Цитата
VPM написал:
особенно в скоростных алгоритмах
   Какие скоростные алгоритмы? Когда есть ограничение архитектуры QUIK. Факторами возможных задержек в нем являются <Реализация скрипта>  ->  <Реализация QUIK>  ->  <Используемая аппаратура ПК>  -> <Канал связи с брокером> -> <Сервер брокера> ->  -> <Канал связи брокера с биржей> -> <Биржа>.
Извечный вопрос: повторные вызовы OnTrade, Даже при заявке на одну акцию
 
Цитата
Йцукен написал:
Думаю такой подход сложнее, чем обработка колбеков.
   Обработка перезапусков скрипта по любой неконтролируемой вами причине у вас не предусмотрена? Пока он перезапускается заявки на бирже могут быть выполнены, а коллбеки пропущены.  Вы предполагаете что и коллбеки в работающем скрипте не теряются?
Извечный вопрос: повторные вызовы OnTrade, Даже при заявке на одну акцию
 
Цитата
VPM написал:
И это еще не вся проблематика, ведь нужно данные периодически синхронизировать с данными QUIK.
   Зачем синхронизировать с данными QUIK, когда можно их использовать всегда? Зачем обрабатывать "сырые" коллбеки, когда можно проверять циклически, по изменению их размеров, нужные вам таблицы QUIK (таблицы заявок, стоп-заявок, сделок и т.д.)? Вы же в своих стратегиях, наверное, учитываете состояние вашего портфеля, а не занимаетесь подсчетом коллбеков :smile: .  Коллбеки имеет смысл использовать только там, где без них не обойтись (например, OnTransReply, в которых может быть информация о причине невыполнения транзакции).
Если бы я был архитектором QUIK, Что стоило бы изменить в QUIK по-крупному
 
Цитата
Oleg Kuzembaev написал:
В вашем случае транзакция успешно доходит до сервера и не отвергается им, однако не отправляется дальше в ТС из-за установленных брокером ограничений на количество транзакций в секунду
     Ответ понятен. Спасибо.
   Я предполагал, что контроль трафика делается в клиенте (QUIK). Это было бы, наверное, более эффективно:
1) ближе к месту возникновения ситуации (более быстрая реакция на ситуацию);
2) меньше трафик между клиентом и сервером ;
3) разгрузка сервера от функции, перенесенной в клиент.
---
 Вообще, в клиент-серверной архитектуре, являющейся распределенной, те функции сервера, которые можно, желательно реализовывать в клиенте.
Если бы я был архитектором QUIK, Что стоило бы изменить в QUIK по-крупному
 
В QUIK 12.8.2.9 (а может быть и более старых версиях - не проверял), при массовой подаче 100 заявок, появляется сообщение QUIK:
"Превышено максимальное количество транзакций 50 в интервале 1 сек.".  При этом, первые 50 заявок выставляются, а остальное игнорируется без выдачи текста ошибки выполнения транзакции в функции sendTransaction. Текст ошибки выполнения транзакции в данной ситуации надо выдавать.
Если бы я был архитектором QUIK, Что стоило бы изменить в QUIK по-крупному
 
Цитата
TGB написал:
Ни одного технического вопроса по почте мне решить не удалось.
  Относительно данного инцидента это не так. На посланные дампы разработчики ответили оперативно.
  После чего выяснилось, что дампы возникли из-за сторонней dll (пакет IUP), используемой в другом моем запущенном скрипте. При «откате» на более старую версию  IUP, дампы исчезли.
При смене инструмента графика в Lua индикаторе OnDestroy() не вызывается
 
1.
Цитата
Бес Паники написал:
io.close(logFile)
   После закрытия файла logFile не nil.  Добавить logFile = nil

2. При смене инструмента вызывается OnChangeSettings().
   В теле этой функции можно вызвать getDataSourceInfo() для определения инструмента.

3. Изменения интервалов можно "ловить" в OnCalculate.
CreateDataSource
 
Цитата
Сергей Че написал:
Сколько потоков создаст функция CreateDataSource()?
    Вы, наверное, хотели спросить: сколько хранилищ свечей создаст функция CreateDataSource()?
Ответ: одно.
Если бы я был архитектором QUIK, Что стоило бы изменить в QUIK по-крупному
 
Цитата
nikolz написал:
TGB  , Вы мудак?
   Нет.
Но вы не ответили на мой вопрос.
Если бы я был архитектором QUIK, Что стоило бы изменить в QUIK по-крупному
 
Цитата
nikolz написал:
Из своего опыта замечу, что долго грузится в основном по причине работы скриптов и индикаторов на Lua на истории
  Время загрузки QUIK я проверял на реальном  брокере без открытия графиков и без таблиц.  

nikolz зачем вы работаете на форуме "прокладкой" между комментариями пользователей?
Если бы я был архитектором QUIK, Что стоило бы изменить в QUIK по-крупному
 
Я в публичку пишу потому, что общение с поддержкой по почте оказалось сугубо отрицательным (исключая организационные вопросы с Алексеем).
Ни одного технического вопроса по почте мне решить не удалось.

"Никогда не было и вот опять"
        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), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
nikolz написал:
Поэтому привел этот вариант ему уже лет пятнадцать.  
   Вы, мягко выражаясь, очень наивны, если  думаете, что кому-то непонятно как и когда появился ваш код.
Я выложил свой код 18.11.25. Вы его прочитали и до 21.11.25 тужились как бы его "переплюнуть". Ну и что вы написали (читаем отзывы пользователей)? Свой "пятнадцатилетний" код вы до сих пор правите на форуме "Обмен опытом".
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
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), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
Nikolay написал:
Закажете сразу, да. Но выйдете из метода только после ожидания.
 Не обязательно написанное мной реализовывать в одном методе.
   Метод1:
Цитата
TGB написал:
 Параметром при этом может быть таблица со списком class_code, sec_code, tf.   В цикле запрашиваются ds[i],
  Метод2:
Цитата
TGB написал:
в цикле выполняется проверки поступления данных (как это делается в выложенной функции) и выдается результат в виде таблицы параметра с добавленным полем ds.
 И все делается, как вы описали, без блокировки.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
Nikolay написал:
Просто к слову - это блокирующая реализация. По опыту, данные могут приходить долго.
   Я написал как запрашивать сразу много тикеров, хоть 1000:
Цитата
TGB написал:
Ее легко изменить для запроса данных по многим тикерам:   Параметром при этом может быть таблица со списком class_code, sec_code, tf.   В цикле запрашиваются ds[i], а затем в цикле выполняется проверки поступления данных (как это делается в выложенной функции) и выдается результат в виде таблицы параметра с добавленным полем ds.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
VPM написал:
А как же проверить? Убедиться что все работает?
   Функция запроса данных свечей по тикеру с учетом возможных задержек:
https://forum.quik.ru/messages/forum10/message79730/topic9273/#message79730
 Ее легко изменить для запроса данных по многим тикерам:
  Параметром при этом может быть таблица со списком class_code, sec_code, tf.
  В цикле запрашиваются ds[i], а затем в цикле выполняется проверки поступления данных (как это делается в выложенной функции) и выдается результат в виде таблицы параметра с добавленным полем ds.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
VPM написал:
TGB ,  Ну вот, Можете же, нормально изъясняться в пределах общения, без излишней надменности.  
    Вы почитали историю? Там есть ответы на все ваши (характерные для начинающих) вопросы. Похоже, нет.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
VPM написал:
Это — мощный объектно-ориентированный фреймворк для рыночных данных на Lua, для QUIK.
  Не буду утверждать точно (в отличие от вас я всегда сомневаюсь :smile: ), но мне кажется, что это ваши очередные иллюзии.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
VPM,  и все таки мне интересно, вы понимаете, что, если корутина, при своем вызове выполняет, пусть 50 простых (не циклических)  операций (эквивалентных по затратам процессорного времени ~2 вызовам пустых функций), то КПД использования процессорного времени вашего ПК: 25 / 125 = 20 %.  Вы понимаете, что ресурс процессорного времени является общим? И если вы его расходуете в своем скрипте, то медленнее выполняются функции QUIK.
   Покажите, где у вас корутина в цикле выполняет > 20 простых операций. Вы же "печетесь":
Цитата
VPM написал:
Вы можете показать оптимальный подход в квик, для получения и обработки оперативных данных, именно оперативных?
   Вы понимаете, термин оптимальный? По простому, лучше не бывает. В каких условиях (ограничениях)?
  Зачем вы пишите о том, чего не понимаете?
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
VPM написал:
вы обрабатываете события последовательно перебираете очередь или есть приоритеты, если есть то чем обосновываете?
   Nikolay вам объяснил, что не надо обрабатывать события. Зачем вам изучать жизнь событий? Когда для принятия решений достаточно (наряду с определением текущего состояния вашего счета, индикаторами принятия решений): определить как и когда выполняются ваши заявки. Все это можно увидеть в таблицах состояния QUIK (orders, stop_orders и т.д.), которые вы можете опрашивать циклически. Это вы можете делать в том порядке, который вам нужен в вашей стратегии торгов. Единственный коллбек, который имеет смысл обрабатывать (с учетом того, что он может потеряться) это OnTransReply, так как в нем может быть информация о причине невыполнения вашей транзакции. Все остальные коллбеки - от "лукавого". Нужно понимать что "реактивность" (задержка выполнения команд) QLua ~1- 60 сек.  
  Все это не однократно обсуждалось на этом форуме: читайте историю (все украли до нас :smile: ).
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
VPM написал:
Можно делать yield-циклы с sleep(1000) без потери отзывчивости терминала.
  А тогда почему бы не sleep(10000)?  Сделайте у себя и не забудьте потом рассказать об успехах торговли роботом. Терминал у вас точно будет отзывчатым.
  Вообще, я не стал бы вас комментировать, но на форуме могут быть дети :smile:, в вы такое несете.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
VPM написал:
а у меня старенький 13 летний
 Зачем же вы его мучаете тяжелыми корутинами :smile: ? Когда можно легко обойтись легкими функциями. Вам же Nikolay все объяснил.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
1.  
Цитата
VPM написал:
чуть больше
  В ~100 раз.  Вы философ :smile: .
2. У вас есть понятие, что при использовании корутин надо синхронизироваться, если в них используются общие изменяемые данные? То есть следить за тем, чтобы данные недоделанные в одной корутине не использовались в другой. Вы когда-нибудь занимались параллельным программированием?
Если бы я был архитектором QUIK, Что стоило бы изменить в QUIK по-крупному
 
Свежее свидетельство долгого восстановления взаимодействия рабочего места QUIK с сервером:
https://forum.quik.ru/messages/forum10/message79914/topic9201/#message79914
Цитата
Nikolay написал:
При этом данные после такой чистки загружаются минуты.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
Nikolay написал:
Полная аналогия.
  С довесочком:
 1. Программировать корутины сложнее.
 2.
Цитата
VPM написал:
1   1   29.10.2025   10:31:19   Скрипт запущен. Идёт фоновое измерение производительности...
2   1   29.10.2025   10:31:20   Фон: N=100000, coroutine=584.000 мс (c=100000), func=6.000 мс (f=100000), T1/T2=97.33
 По вашим же тестам накладные расходы на вызов корутин в 97.33 раз больше, чем на вызов функций (coroutine=584.000 мс , func=6.000 мс ). Чтобы для вас было наглядно, при всяком вызове корутины, прежде чем она начнет что-то делать, делается 97 пустых вызовов функций.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
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), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
nikolz написал:
  «Баба-яга против!» :smile:
                        Мультфильм
DestroyTable (и Clear) закрывает скрипт вместо таблицы, Тема описана в Названии и в Тексте сообщения
 
Цитата
paluke написал:
Не только DestroyTable(), любые операции с таблицей не выполняются.
   
Цитата
TGB написал:
Работа с таблицами QUIK выполняется в служебном потоке, отличном от main. В том же, в котором выполняется OnStop. И пока выполняется  OnStop никакие операции с таблицами QUIK не возможны (поток работы с таблицами занят OnStop ).
Если бы я был архитектором QUIK, Что стоило бы изменить в QUIK по-крупному
 
Дополнительно для анализа долгого запуска QUIK:
    1)   https://forum.quik.ru/forum1/topic8621/
    2)   https://forum.quik.ru/forum13/topic7561/
    3)   https://forum.quik.ru/forum1/topic3248/
Если бы я был архитектором QUIK, Что стоило бы изменить в QUIK по-крупному
 
Цитата
Oleg Kuzembaev написал:
Ранее уже ответили вам письмом на почту.
  Здравствуйте. У меня в почте письма нет. Пришлите, пожалуйста повторно.
DestroyTable (и Clear) закрывает скрипт вместо таблицы, Тема описана в Названии и в Тексте сообщения
 
Цитата
nikolz написал:
Если он вызывается в main то вызов это и есть исполнение.
   nikolz писатель  :smile: ?
 Читайте:
Цитата
TGB написал:
она не лезет в таблицы QUIK, а создает коллбек закрытия таблицы, который обрабатывается  в потоке терминала,
Если бы я был архитектором QUIK, Что стоило бы изменить в QUIK по-крупному
 
Цитата
TGB написал:
1) При проверке многократной (> 8 раз) остановки/запуска скрипта, в котором используется сторонний графический пакет IUP, QUIK (версия 12.6.1.2, Lua 5.4), после разного количества экспериментов, в моменты останова/запуска, падает:           Дамп info_dmp_20251007_150748.dmp вышлю почтой.
   На это нет ответа.
----
   Предложения:
     1) После завершения OnStop не обрабатывать только коллбеки, зарегистрированные в main. Коллбеки
       создаваемые в main продолжать отрабатывать (смотрите ветку https://forum.quik.ru/messages/forum10/message79751/topic9265/#message79751).
     2) Реализовать/проверить сихронизацию основного потока QUIK с потоком main при его остановки
     (не обращаться из основного потока к данным завершенного потока).
DestroyTable (и Clear) закрывает скрипт вместо таблицы, Тема описана в Названии и в Тексте сообщения
 
1.
Цитата
nikolz написал:
Полагаю, что не так.
   Зачем полагать, когда можно проверить. Переставьте DestroyTable в OnStop.

2.
Цитата
nikolz написал:
Функция  DestroyTable  в данном примере вызывается в потоке Main.
  Вы точно знаете как устроена DestroyTable?
    Не точно, но скорее всего, это реализовано следующим образом.
    При том, что DestroyTable вызывается в main, она не лезет в таблицы QUIK, а создает коллбек закрытия таблицы, который обрабатывается  в потоке терминала, но он занят более интересным делом  :smile: : остановкой скрипта (удаляет поток main и перестает обрабатывать коллбеки, созданные в нем, так как исчезнет контекст их выполнения).
DestroyTable (и Clear) закрывает скрипт вместо таблицы, Тема описана в Названии и в Тексте сообщения
 
Цитата
Ростислав Дм. Кудряшов написал:
В каком потоке  управления выполняется вызов функции DestroyTable()
  Работа с таблицами QUIK выполняется в служебном потоке, отличном от main. В том же, в котором выполняется OnStop. И пока выполняется  OnStop никакие операции с таблицами QUIK не возможны (поток работы с таблицами занят OnStop ). OnStop в любом случае завершает скрипт, поэтому DestroyTable не выполнена и созданная в скрипте таблица существует после завершения скрипта.
  Если что то надо делать с таблицами по кнопке завершить, то это надо делать в функции OnStop.
DestroyTable (и Clear) закрывает скрипт вместо таблицы, Тема описана в Названии и в Тексте сообщения
 
Цитата
Ростислав Дм. Кудряшов написал:
Версия Quik 12.5.0.20. Код скрипта
   В скрипте реализовано его закрытие при закрытии таблицы:
Цитата
Ростислав Дм. Кудряшов написал:
while not IsWindowClosed (t_id) do
Будет выход из цикла и функции main при закрытии таблицы и это правильно.  
 В данном случае ошибки в Qlua нет.
Если бы я был архитектором QUIK, Что стоило бы изменить в QUIK по-крупному
 
Цитата
Oleg Kuzembaev написал:
В таком случае, пришлите нам архив вашего Рабочего места QUIK на почту поддержки
  Посылал на ваше имя последние настройки QUIK, с которыми проверял длительность его перезапуска.
Если бы я был архитектором QUIK, Что стоило бы изменить в QUIK по-крупному
 
Цитата
Oleg Kuzembaev написал:
В таком случае, пожалуйста, конкретизируйте в чем именно ваш вопрос/пожелание к будущим версиям терминала?
   Пожелание относительно длительности запуска/перезапуска QUIK на работающем ПК с характеристиками 8 ядер, 4 Ггц, память 32 Гб, диск SSD:  <= 3 сек.
Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 16 След.
Наверх