Самое слабое место QLUA

Страницы: 1
RSS
Самое слабое место QLUA
 
Известно, что колбеки в QLUA  блокируют основной поток терминала QUIK.
Решение изначально было спорное, но в ту пору попытка переубедить разработчиков в их ошибке была безрезультатна.
-----------------------
Как мера, якобы устраняющая данную проблему, по задумке разработчика QLUA  был введен еще один поток для  функции main.
-----------------------
Поэтому Всем известна рекомендация разработчиков делать минимальные вычисления в колбеках и выполнять основные расчеты в функции main.
==================
Однако, это кажущееся ускорение вычислений легко можно свести к нулю, что уверен и делается большинством  программистов роботов на QLUA.
===================
Рассказываю в чем фишка.
================
Экспериментируя с реализацией пула потоков,  обнаружил, что потоки, использующие область глобальных переменных,
а также функция main  на самом деле не работают независимо от колбеков, а тоже останавливаются на время их работы.
Очевидно, это связано с блокировкой области глобальных переменных при работе колбеков.
====================
В итоге, если у Вас в функции main используются глобальные переменные, а это, в том числе , источники данных,
то параллельная работа функции main не получится.
------------------
В итоге поток Main будет останавливаться вместе с основным потоком терминала и Ваш робот на QLUA будет фактически
работать в одном потоке с остановками на каждом колбеке.
==========================
Прикольно,  но есть решение, которое позволяет:
во-первых, полностью убрать из QLUA эти монстры-колбеки, останавливающие основной поток и функцию main в указанных выше случаях.
во-вторых, не останавливать основной поток  вообще для передачи данных в другие потоки, которых может быть любое число.
=========================
я сомневаюсь, что разработчики когда-нибудь решат это сделать, так как им платят брокеры, а брокерам это до лампочки.
----------------------------
Поэтому могу лишь рекомендовать писателям роботов свести к минимуму использование глобальных переменных в функции main.
 
Nikolz,  используйте классы в луа стиле. Все получится само собой.  
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Дали игрушку для идиотов - "потоки" называется. После чего это тупорылое стадо, выковыривающее проблемы на ровном месте, получило широкое поле для словесного поноса с гнутыми пальцами. Любому дебилу в XX веке было очевидно, что в прерываниях ВСЕГДА следует делать минимальные вычисления - просто потому, что это прерывания. Любому дебилу было понятно, что пытаться заниматься "ускорением вычислений" в интерпретаторе есть Бред Сивой Кобылы. Любому дебилу было ясно, что при организации параллельной работы нужно, чтобы каждый из параллельно выполняющихся процессов был предварительно ИДЕАЛЬНО вылизан. Любому дебилу было известно, что глобальные переменные НИЧЕМ не отличаются от локальных. Любому дебилу должно быть доступно, что этот самый любой дебил может САМОСТОЯТЕЛЬНО "полностью убрать из QLUA эти монстры-колбеки", что можно ВООБЩЕ НЕ ПЕРЕДАВАТЬ данные в другие потоки, которых у дебилов "может быть любое число", а у нормальных людей это "любое число" равно нулю.

О! Это правильно! Я как раз и "свёл к минимуму использование глобальных переменных в функции main". Как я уже писал, их там всего-то тысяч сто. Ну, может, двести, но вряд ли больше. А вот классов как раз нет ни одного. Ни "в луа стиле", ни  в "си стиле" - нигде. Нет, не было и не будет.
 
Пнх
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Цитата
s_mike@rambler.ru написал:
Nikolz,  используйте классы в луа стиле. Все получится само собой.  

Полагаю Вы либо не поняли, либо ошибаетесь.
---------------
поясню на примере.
В функции main делаем цикл чтения свечей и замеряем время .
примерно так:
Код
      nklib.startA();
      while count>=i do
      nklib.startB();
       O=ds:O(i); H=ds:H(i); L=ds:L(i); C=ds:C(i);   V=ds:V(i) Ti=ds:T(i)
      x=nklib.stopB();
      i=i+1;
      m1=m1+1;
      tx[i]={O,H,L,C,V,Ti}
      end
   x2=nklib.stopA();
Log:write(tostring(O)..","..tostring(H)..","..tostring(L)..","..tostring(C).."/"..tostring(m1)..","..tostring(0.1*x2).." "..tsoc[m].."\n");Log:flush()               --
В колбеке oпParam ставим цикл записи данных в таблицу
примерно так:
Код
function OnParam (c,s)  for m=1,10000 do t_[14]={c,s}; end
ncb=14; ESet(event);  end -- изменение текущих параметров
После этого делаем три пуска программы.
1. без цикла 2. с циклом до 10 и 3. с циклом до 10000
-------------------  
Что мы ожидаем получить:
Если колбеки не влияют на функцию main то время получения свечей должно быть примерно одинаковым для одинакового числа свечей.
=====================  
Вот что получили
1.136.34,136.34,136.31,136.31/828,2511.1 SBER
2.136.3,136.3,136.29,136.29/829,6201.2 GAZP
3.136.27,136.27,136.26,136.26/830,27710.4 GAZP
=============  
Как видно время работы колбека влияет на время потока MAIN .  
без  цикла = 2511
с циклом 10 = 6200
с циклом 10000= 27710
==================
Никакие пляски с бубном в написании классов Вам ничего не дадут.
так как классы это всего-навсего массив в котором есть указатели на функции и данные.
==============  
а данная проблема связана с блокировкой  глобального стека виртуальной машины луа.
об этом я и рассказал ранее в этой теме.
Страницы: 1
Читают тему
Наверх