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

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

Страницы: Пред. 1 ... 9 10 11 12 13 14 15 16 17 18 19 ... 80 След.
Предлагаю реализовать
 
это тоже не проблема.
Предлагаю реализовать
 
Цитата
Kolossi написал:
Никому такая реализация нахрен не нужна, что с ней не так?
Поясняю ...
1) Зачем загромождать робота функциями индикаторов, если есть внутренние в КВИКЕ.
2) Все что напишите на луа будет на порядок медленнее чем встроенные.
3) Написанные индикаторы сожрут память для их хранения и ее надо в 2 раза больше , чем для встроенных.
------------------  
У меня нет других проблем.
Но писать индикаторы на луа, которые уже написаны на СИ и встроены - это "производственный ан..изм."
Предлагаю реализовать
 
Цитата
Anton Belonogov написал:
nikolz, добрый день.

1) Вы можете загрузить Lua-скрипты индикаторов, аналогичных встроенным, с нашего сайта и вносить необходимые изменения в их код;
2) не совсем поняли, о каких идентификаторах идет речь. Просьба описать пожелание более подробно.
Не буду ругаться, но зачем давать очевидные советы.
----------------------
Я специально подчеркнул что речь о встроенных индикаторах.
Вам объяснить в чем разница?
Предлагаю реализовать
 
Добрый день,
Ув. разработчики
Предлагаю  реализовать возможность:
---------------------------
1) изменять параметры встроенных индикаторов   из скрипта индикатора.
-------------------------
2) устанавливать идентификатор индикатора из скрипта индикатора.
Индикаторы. OnCalculate. Количество полных проходов по всем свечам
 
Цитата
Nikolay написал:
Цитата
Anton Belonogov написал:
Илья ,

Действительно, в описанных Вами ситуациях вызов OnCalculate происходит дважды.
Мы исправим данную ошибку в одной из очередных версий ПО.
Это сейчас серьезно? Почему же все эти годы не исправлялось. Сообщения были об этом очень-очень давно.
Вполне серьезно. проблема была выявлена при появлении VMLua  в КВИКЕ.
Пришлось сделать костыли.
Более быстрый перебор ключ - значение в таблице
 
Цитата
Цитата
Serge123 написал:
Вот загадочное и интересное сообщение:  https://forum.quik.ru/messages/forum10/message34083/topic3921/#message34083
См. также typedef struct Table в  https://www.lua.org/source/5.1/lobject.h.html
Можно ли как-то получить адрес этой структуры таблицы в программе на Lua и C, чтобы, скажем, напрямую читать
TValue  *array;  /* array part */ ?
Т.е. в случае C минуя rawgeti и стек Lua?
Можно.  Делал это на 5.3.
таблица "depo_limits" . Что не так?
 
сейчас все нормально.
таблица "depo_limits" . Что не так?
 
Добрый день,
-----------------------
Проблема с чтением позиции по инструментам
----------------
В терминале позиция SBER есть  со сроком расчета T0 позиция 120


---------------
При чтении таблицы в скрипте
Код
local s="depo_limits";
local N1=getNumberOf(s)-1
for j=0,N1 do local x=getItem(s,j);
 if x and x.sec_code==sec then Qp=x.currentbal; jdep=j;
   Log:write(value2text(x,"depo=").."\n");Log:flush(); -- вывод в лог файл
   end;
end
есть только с limit_kind <0, естественно позиция НОЛЬ
Код
depo={
["trdaccid"]=NL0011100043,
["currentlimit"]=0.0,
["locked_buy"]=0.0,
["currentbal"]=0.0,
["limit_kind"]=-2000001,
["locked_buy_value"]=0.0,
["openlimit"]=0.0,
["openbal"]=0.0,
["awg_position_price"]=0.0,
["sec_code"]=SBER,
["locked_sell"]=0.0,
["wa_position_price"]=0.0,
["client_code"]=10326,
["wa_price_currency"]=SUR,
["locked_sell_value"]=0.0,
["firmid"]=NC0011100000}

версия 11.1.0.45
демо сервер.
----------------------------
Что не так?
Робот в виде скрипта индикатора
 
При запуске Квик работет в процессах , в приложениях его нет . В окне нет ., Кошмарит уже год , два .
 
Цитата
Александр Васильев написал:
конечно в 9.30
При запуске Квик работет в процессах , в приложениях его нет . В окне нет ., Кошмарит уже год , два .
 
Цитата
Александр Васильев написал:
Да как то , у вас таблица процессов , там нихера ничего сделать нельзя ,  а нет квика в приложениях , и фиг вы его увидите  .
Приложение QUIK называется info.exe
Робот в виде скрипта индикатора
 
Написал робота.
Получилось 180 строк, примерно 200 операторов.
---------------------
Робот позволяет написать правило для индикаторов на графике
и по сигналам этого правила покупает или продает  заданное количество.
При этом снимает заявки, если они не исполняются заданное время.
-------------------
Сейчас процесс отладки.
-----------------
Отладил режим советника.
Вот картинка сигналов робота. На графике два мувинга .

это основная часть робота-индикатора:
Код
paths = "D:/QUIK_SCRIPT/" -- путь к файлу nkbot24_func.luac
dofile(paths.."nkbot24_func.luac")

Settings.account=""; Settings.client=""; --вписать счет и клиент
Settings.Nind=2;
function OnCalculate(i)
   Hi,Li=H(i),L(i);
   if i==1 then _nkInit(); return end--инициализация
   _getI(i); --читаем значения индикаторов
   f=_cross(1,1,2,1,i);  -- сигнал пересечение линий индикаторов
   _torg(f,i); --выставляем заявки по пересечению
   return SE,BU;  -- отображаем сигналы в режиме советника
end

Хотел выложить nkbot24_func.luac, но форум не принимает такие файлы.
--------------
При запуске Квик работет в процессах , в приложениях его нет . В окне нет ., Кошмарит уже год , два .
 
Цитата
Александр Васильев написал:
Ну тогда внимательно читаем заголовок , в процессах квик есть , работает , а в приложениях его НЕТ ( не развернуть , не свернуть ) а из процесса его никак не выдернуть в окно . Смыл сообщения , я столько мучился и во на тебе , нашёл в 2016 году . А ведь всегда искал . А скрипт дело 10 е  пару дней  пока .
Ну внимательно читаем - написано на картинке Приложений(7)
седьмое- это КВИК.
Что не так,
Индикаторы. OnCalculate. Количество полных проходов по всем свечам
 
можно еще проще сделать:
Код
function OnCalculate(index)
 
  if index == 1 then
    
    _ds = getDataSourceInfo()
 --....
    
  end
  
  return 0
  
end 


вообще не определять, будет глобальным.
При запуске Квик работет в процессах , в приложениях его нет . В окне нет ., Кошмарит уже год , два .
 
Цитата
Александр Васильев написал:
отвечу на заголовок:
приложения - это процессы.
И КВИК там и работает.
Вот картинка диспетчера задач:  Читаем внимательно надписи вкладок и открытого окна

====================
Относительно ошибок при загрузке скрипта.
Уверен, что ошибки в Вашем скрипте.
Покажите Ваш скрипт, если хотите их иcправить.
Индикаторы. OnCalculate. Количество полных проходов по всем свечам
 
Цитата
Илья написал:
Есть ли вариант сохранения состояния расчета между вызовами OnCalculate?

Вчера пытался в таблицу Settings  добавить свою таблицу рассчитанных при первом проходе значений, чтобы при следующих просто из нее вытащить. Знаю, что в руководстве написано "Типы пользовательских параметров: числа и строки"
До перезапуска терминала (накидал скрипт, пока терминал работал), вроде, получилось: значения и сохранялись, и выбирались.
Но при последующем запуске терминала выводилась ошибка об отсутствии моей таблицы.
Хотел сделать через замыкание, но, опять же, где хранить этот объект?
Опишите переменную вне функции OnCalculate.  
Например, у Вас выше написано так:
Код
function OnCalculate(index)
  
  local _ds = nil
  
  if index == 1 then
    
    _ds = getDataSourceInfo()
 --....
    
  end
  
  return 0
  
end 

переменная _ds всегда затирается при входе в OnCalculate
чтобы этого не было сделайте так:
Код
local _ds;
function OnCalculate(index)
  if index == 1 then   
    _ds = getDataSourceInfo()
  --....
  end
 
  return 0
  
end
Робот в виде скрипта индикатора
 
Добрый  день,
Рассказываю, как просто сделать робота в виде скрипта индикатора.
Сначала картинка работы такого робота.


В чем достоинство такого робота по сравнению с роботом на основе колбеков.
Робот значительно проще написать
Он загружается на график торгуемого инструмента,
Если для реализации алгоритма торговли  достаточно встроенных в QUIK индикаторов,
то нет надобности их программировать.
----------------  
Пример варианта основного  фрагмента такого робота:
Код
name="nkbot24"
Settings={["Name"] =name,["line"] ={},["account"]="",["client"]="",["Q"]=1;["wt"]=1000,["short"]=0}
Settings.Nind=0;

paths = "D:/QUIK_SCRIPT/"
package.cpath =package.cpath ..";"..paths.."?.dll";
package.path =package.path..paths.."?.lua;"
fnlog=paths..name..".log"; Log=io.open(fnlog,"w")

loadfile(paths.."nkbot24_func.lua")

function nkbuy(i,f)
---алгоритм покупки
 -- f=cross(1,1,2,1,1);
return f;
end

function nksell(i,f)
--алгоритм продажи
-- f=cross(1,1,2,1,1);
return f;
end

function nobuy(i,f)
--фильтр покупки
return f;
end

function nosell(i,f)
--фильтр продажи
return f;
end

function OnCalculate(i)
   local i1=i-1;
   if i==1 then nkInit(); return end
   if i~=i_ then    getI()   end
   N,torder=order(N);    Q=depo();
   if #t==0 then
--      f,j=cross(1,1,2,1,5); --пересечение двух индикаторов
      if i~=i_ then torg(nkbuysel(i));end
      M=os.clock();
   else
      del_ord(M);
   end
   i_=i;
return M1,M2;
end
Продолжение вероятно следует...
Сдвиговые регистры, циклические массивы. Экономим память
 
чтобы массив был ограничен по размеру, его надо закольцевать.
Очевидно, Виктор  это не проходил.  
Сдвиговые регистры, циклические массивы. Экономим память
 
VPM,
Я ранее написал, что Ваш вариант - это недоделанный циклический массив, тест которого я привел вторым.
Рекомендую доделать, тогда будет работать , но чтение из него в луа, как тоже уже писал, медленнее чем из сдвигового.
Сдвиговые регистры, циклические массивы. Экономим память
 
VPM,
Можете пояснить,
как в вашем варианте прочитать весь массив с 1 по последний
и сколько времени на это уйдет по сравнению с чтением типа t[i]  где i от 1 до #t.
--------------
И для какой задачи Вы планируете его применять.
-------------
Я определил область применения моего варианта.
А как применять Вашу очередь?
Сдвиговые регистры, циклические массивы. Экономим память
 
VPM,
вот результаты  тестов:
это тест моих функций  сдвиговый  массив.
Код
local M=1000000
local t=newCA(1024)
for i=1, M do  setCA(t,i) end
count1 = collectgarbage("count") print("объем занятой памяти",count1//1);
--------------------------------
collectgarbage("collect") count1 = collectgarbage("count") print("объем занятой памяти после сборщика мусора",count1//1);

результат:
Код
>D:/lua53/lua53.exe -e "io.stdout:setvbuf 'no'" "Test_List.lua" 
объем занятой памяти   82.0
объем занятой памяти после сборщика мусора   76.0
>Exit code: 0
тест циклический массив:
Код
local M=10000000
local t=nk_newV(1024)
for i=1, M do  nk_push(t,i) end
count1 = collectgarbage("count") print("объем занятой памяти",count1//1);
collectgarbage("collect") count1 = collectgarbage("count") print("объем занятой памяти после сборщика мусора",count1//1);
результат:
Код
>D:/lua53/lua53.exe -e "io.stdout:setvbuf 'no'" "Test_List.lua" 
объем занятой памяти   97.0
объем занятой памяти после сборщика мусора   91.0
>Exit code: 0
тест для Вашей функции
Код
local M=10000000
local list=List.new()
local count1 = collectgarbage("count") print("начальный объем занятой памяти",count1//1);
--------------------------
for i=1, M do  List.pushlast(list,i)   end
collectgarbage("collect") count1 = collectgarbage("count")  print("объем занятой памяти после сборщика мусора",count1//1);
результат:
Код
>D:/lua53/lua53.exe -e "io.stdout:setvbuf 'no'" "Test_List.lua" 
начальный объем занятой памяти   65.0
объем занятой памяти после сборщика мусора   262203.0
>Exit code: 0
Какой еще тест сделать?
Уникальный номер заявки
 
Цитата
bespalex написал:
это конечно вариант, но мне он не нравится отсутствием изящества, громоздкостью что ли. Кроме того, как справедливо раньше вы подметили, при работе с питоном приходится экономить операции.
На эту проблему накладывается возможное отсутствие trans_id в сообщениях, который я поддерживаю уникальным на своей стороне. Городить два индекса совсем не хотелось.
И что делать, если order_num не приходит? Ждать? Сколько? получается заявка в неопределенном статусе может находиться неопределенное время.
Можете показать пример громоздкости или затрат на вычисления?
---------------------
Вся история предыдущих дней в худшем случае обрабатывается  один раз до начала торгов. в лучшем случае обрабатывается вчера.
Сдвиговые регистры, циклические массивы. Экономим память
 
Если Вы считаете, что Вы правы, то просто покажите свой тест и результаты и будет предмет обсуждения.
Пока же у Вас лишь программа и ваша вера, что она экономит память.
Сдвиговые регистры, циклические массивы. Экономим память
 
Если Вы считаете, то просто покажите свой тест и результаты и будет предмет обсуждения.
Пока же у Вас лишь программа и ваша вера, что она экономит память.
Сдвиговые регистры, циклические массивы. Экономим память
 
Цитата
VPM написал:
Вот из букваря:

 Стек   — это коллекция, элементы которой получают по принципу «последний вошел, первый вышел» (Last-In-First-Out или LIFO).
Это значит, что мы будем иметь доступ только к последнему добавленному элементу.

 Очереди     очень похожи на стеки. Они также не дают доступа к произвольному элементу, но, в отличие от стека, элементы кладутся (enqueue) и забираются (dequeue) с разных концов.
Такой метод называется «первый вошел, первый вышел» (First-In-First-Out или FIFO).
То есть забирать элементы из очереди мы будем в том же порядке, что и клали. Как реальная очередь или конвейер.

 Двусторонняя очередь   (Double-ended queue), или дек (Deque), расширяет поведение очереди.
В дек можно добавлять или удалять элементы как с начала, так и с конца очереди.
Такое поведение полезно во многих задачах, например, планирование выполнения потоков или реализация других структур данных.

Позже мы рассмотрим   вариант реализации стека с помощью двусторонней очереди  .
Будем считать, что у нас разные определения этих понятий.
------------------------------
Но это не важно.
Важно, что ваш вариант не работает.
Сдвиговые регистры, циклические массивы. Экономим память
 
Цитата
VPM написал:
nikolz,  Это я и хотел сравнить, сделать один размер массивов, один размер окна прогнать на скорость на память, на время исполнения?
Цитата
nikolz написал:
и еще...
ваша стек-очередь напоминает недоделанный циклический массив.
Если его доделать, то он будет делать ровно тоже самое, что и мой вариант сдвига массива выше.
--------------------
Циклический массив работает быстрее, чем сдвиг массива.
Но в луа из него медленнее брать данные.
Его интереснее делать на C и встраивать сразу в индикаторы и фильтры.
Но это уже другая тема.
Вы нем поняли. В вашем случае нельзя сделать размер постоянным.
Он будет лишь увеличиваться при записи в конец.  Но не будет уменьшаться.
----------------
Это я показал Вам в своем тесте.
Там в конце Ваша очередь-стек имеет ноль элементов , но размер памяти занятый массивом остался такой же как при записи миллиона элементов.
--------------------
В моем варианте Вы изначально фиксируете длину массива и она остается всегда такой же.
CalcBuySell. Что не так?
 
Владимир,
Вы прежде, чем писать херню, прочитали бы о чем тема.
-------------------------------
Специально для вас, поясняю.
Речь идет о работоспособности функций библиотеки QLUA,
а не о написании примитивных вычислений..
-------------------------------
Вы уже написали свой "гениальный" шедевр  очереди,
которая стек и которая лишь увеличивает размеры используемой памяти.
Но почему молчите о том что написали говно?
------------------
Если у Вас проблема с написанием таких программ,
то пишите конкретно вопрос, а не скулите.
--------------
Программатор Вы наш.
Сдвиговые регистры, циклические массивы. Экономим память
 
и еще...
ваша стек-очередь напоминает недоделанный циклический массив.
Если его доделать, то он будет делать ровно тоже самое, что и мой вариант сдвига массива выше.
--------------------
Циклический массив работает быстрее, чем сдвиг массива.
Но в луа из него медленнее брать данные.
Его интереснее делать на C и встраивать сразу в индикаторы и фильтры.
Но это уже другая тема.
Сдвиговые регистры, циклические массивы. Экономим память
 
Цитата
VPM,
Возможно я не понял, вопроса,
Но так как Вы возвращаетесь к этой идеи уже многократно, то поясню подробнее в чем у Вас ошибка.
---------------------
Во-первых, в терминологии.  
Вы уж не обижайтесь, но прежде, чем обсуждать надо быть уверенным ,
что мы с вами горшками называем горшки, а цветами -цветы.
------------------
Так вот,
Стек и очередь это две большие разницы.
Стек - это кипа - т е представьте кипу листов бумаги на столе. Вы положили лист сверху и взяли его.
--------------------
или еще пример стека - это обойма в автомате  патрон лежащий сверху выйдет первым.
-----------------
Т е принцип последним зашел -первым вышел.
-------------------------
Очередь  -это первый зашел и первым купил.
Наглядный пример - очередь в магазине за яйцами.
------------------------
Поэтому невозможно стек сделать из очереди.
Если конечно Вы не сторонник смотреть гланды через зад.
====================
Но это не главное.
========================
Давайте посмотрим на то как вы пытаетесь  уменьшить память, создав нечто,
в котором Вы синхронно выкидываете первый элемент и запихиваете последний.
----------------------------
Ничего это вам не напоминает? А посмотрите эту мою тему Про сдвиговые регистры.
Именно это и происходи в них.
--------------------
Но они реализуются методами, которые я описал выше.
===================
Если же Вы будете просто в массиве луа стирать первый элемент,
записывая туда nil и добавлять в конец новый, то массив будет увеличиваться на этот новый элемент.
----------------------------------------
В луа для хранения одного числа в таблице тратится 12 байт.
Когда Вы пишите nil в первый элемент, то память из под него не освобождается,
так как ее невозможно удалить из того блока памяти, который уже выделен для этого массива.  
-------------------
В лучшем случае освободится память на элемент массива, если он является тоже таблицей.
======================
вот ваш вариант.
Код
---- Операции вставки -- table.insert
function List.pushlast (list, value)   local last = list.last + 1;   list.last = last;   list[last] = value; end
---- Операции удаления -- table.remove
function List.popfirst (list)
  local first = list.first;  if first > list.last then   return nil   end
  local value = list[first]   list[first] = nil   list.first = first + 1  return value  end
list[last] = value;  -- этот оператор записывает в таблицу новое значение.
--------------------------------
При создании таблицы , ей выделяется место в оперативной памяти.  
----------------------------------
Если при записи нового значения места не хватает, то оно будет увеличено.
-----------------------
C точки зрения сборки мусора.
Объектом для сборки является вся таблица, а не отдельная ее ячейка.
================
Когда Вы в функции popfirst  делаете это:    list[first] = nil
то в ячейке таблицы в параметр тип элемента записывается ноль.
Но память для хранения этого типа и значения элемента не может быть освобождена,
так как она не является самостоятельным объектом. Это часть память таблицы.
=======================
Таким образом, в вашем варианте таблица может только увеличивать объем занимаемой памяти, но не уменьшать ее.
=========================
Уменьшать, можно лишь так, как я рассказал в этой теме.

Уникальный номер заявки
 
номер сделки и дата торгов
Уникальный номер заявки
 
Цитата
bespalex написал:
Уникальность номеров заявок order_num поддерживается только внутри одного торгового дня. Также как и trade_num для сделок.
Получается при использовании этих параметров в качестве индекса может возникнуть ситуация, что записи имеющиеся совпадут по индексу с новыми заявками и сделками дня, что может привести к труднопредсказуемым последствиям.
Использовать trans_id  в качестве уникального индекса тоже ненадежный способ, т.к. логика его передачи в сообщениях нестабильна. Также например случаются существенные задержки с поступлением OnTransReply и тогда невозможно отменить заявку, т.к. для этого необходим order_num, которого у нас еще может не быть.
Кто как решает эту проблему?
Внутри дня используем номе сделки
А между днями - дополнительно дату.
Устроит такое решение?
Сдвиговые регистры, циклические массивы. Экономим память
 
Цитата
VPM написал:
nikolz,  Вы можете сравнить это метод с
local lifo=List.new() List.pushlast(lifo,i) List.popfirst(lifo),
и где какой использовать лучше или предпочтительней
Я уже сравнивал и вам в вашей теме выложил результат.
Вы очевидно его не читали.
------------
Если кратко, то Ваш вариант ничего не экономит.
Вы посмотрите там результат работы сборщика и пояснение почему Вы заблуждаетесь с этим вариантом.
--------------------
Если будет непонятно, то поясню дополнительно.
Сдвиговые регистры, циклические массивы. Экономим память
 
Добрый день,
В этой теме я расскажу кратко что такое сдвиговые регистры и циклические массивы.
И покажу как на Lua  экономить память при создании роботов.
----------------------
При торговле на бирже приходит много информации, такой , как новости, результаты сделок, значения индикаторов, например свечей.
эта информация записывается в массивы и в файлы и может составлять очень большой объем.
------------------
Однако, при реальной торговле, для принятия решения, нет надобности не только во всей накопленной информации в файлах, но и порою нужна лишь информация за последние например 60 минут, свечей с интервалом 1 минута.
=================
Чтобы массивы с данными не разбухали до безумных размеров я реализую временное окно,
в пределах которого  храню текущую информацию.
-------------------
Например, храним только 1024 последних отсчета.
Для этого необходимо выделить массив всего в 1024 элемента.
Для каждого нового отсчета необходимо сдвинуть содержимое массив влево на один отсчет,
а в освободившейся место записать принятое значение.
--------------------
Возникает вопрос как реализовать этот сдвиг элементов массива, чтобы было быстро.
---------------------
Один из приемов - циклические массивы.
-------------------
В таком массиве элементы не двигаются, а двигается указатель на место удаляемого первого элемента .
Это же место является местом размещения принятого элемента.
---------------
Еще одним способом является использование многобитовых регистров процессора, с помощью которых можно реализовать многобитовые сдвиги данных за одну операцию.
===================
В луа есть операции сдвига >>m (<<m).
Они позволяют сдвинуть целое число на m разрядов влево ( вправо), что соответствует делению(умножению) этого числа на 2 в степени m.
Такая операция сдвига числа выполняется в регистре сдвига  ( в процессоре это АЛУ+регистры)
------------------
В современных процессорах Intel есть регистры в 256 бит (в последних 512 бит)
------------------------------
Так как число double занимает 64 бита, а long(integer в lua) 32 бита,
то с помощью этих регистров можно сдвигать не одно число, а массив из 4,8,16 чисел одной командой.
Для простоты будем называть эти регистры 256(512) ,битовыми тоже сдвиговыми регистрами.
------------------
Очевидно, что с помощью этих регистров можно сдвигать массивы чисел.
=======================
Если не использовать С for lua,
то в скрипте на луа можно реализовать два способа работы с такими временными окнами.
------------------------------
Либо циклический массив,
либо сдвиг элементов массива.
--------------------------------------
Так как данный ликбез в основном для начинающих,
то покажу наиболее простой способ, но при этом достаточно быстродействующий.
-------------------------------
Вот скрипт функций, которые реализуют механизм такого временного окна данных,
где N - размер временного окна
Код
local function newCA(N) local t={}; for j=1,N do t[j]=0; end; return t; end --вставка нового элемента
local function setCA(t,X) table.remove(t,1); t[#t+1]=X;  end --вставка нового элемента

Посмотрим, что сохраняется в таком массиве
Организуем цикл записи номеров отсчетов которые изменяются от 1 до M
и какие из отсчетов будут сохраняться в массиве фиксированной длины 32 элемента
Код
local M=1000000
local t=newCA(32)
for j=1,M do setCA(t,j)
print("j="..j..",t="..table.concat(t,","));
end
это содержимое массива на каждом цикле
Код
>D:/lua53/lua53.exe -e "io.stdout:setvbuf 'no'" "test_lines.lua" 
j=1,t=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
j=2,t=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2
j=3,t=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3
j=4,t=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,4
j=5,t=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,5
j=6,t=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,5,6
j=7,t=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,5,6,7
j=8,t=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,5,6,7,8
j=9,t=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,5,6,7,8,9
j=10,t=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,5,6,7,8,9,10
j=11,t=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,5,6,7,8,9,10,11
j=12,t=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,5,6,7,8,9,10,11,12
j=13,t=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,5,6,7,8,9,10,11,12,13
j=14,t=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14
j=15,t=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
j=16,t=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
j=17,t=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17
j=18,t=0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18
j=19,t=0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19
j=20,t=0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
j=21,t=0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21
j=22,t=0,0,0,0,0,0,0,0,0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22
j=23,t=0,0,0,0,0,0,0,0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23
j=24,t=0,0,0,0,0,0,0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24
j=25,t=0,0,0,0,0,0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25
j=26,t=0,0,0,0,0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26
j=27,t=0,0,0,0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27
j=28,t=0,0,0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28
j=29,t=0,0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29
j=30,t=0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30
j=31,t=0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
j=32,t=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32
j=33,t=2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33
j=34,t=3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34
j=35,t=4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35
j=36,t=5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36
j=37,t=6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37
j=38,t=7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38
j=39,t=8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39
j=40,t=9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40
j=41,t=10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41
j=42,t=11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42
j=43,t=12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43
j=44,t=13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44
j=45,t=14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45
j=46,t=15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46
j=47,t=16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47
j=48,t=17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48
j=49,t=18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49
j=50,t=19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50
j=51,t=20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51
j=52,t=21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52
j=53,t=22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53
j=54,t=23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54
j=55,t=24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55
j=56,t=25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56
j=57,t=26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57
j=58,t=27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58
j=59,t=28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59
j=60,t=29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60
j=61,t=30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61
j=62,t=31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62
j=63,t=32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63
j=64,t=33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64
j=65,t=34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65
j=66,t=35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66
j=67,t=36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67
j=68,t=37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68
j=69,t=38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69
j=70,t=39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70
j=71,t=40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71
j=72,t=41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72
j=73,t=42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73
j=74,t=43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74
j=75,t=44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75
j=76,t=45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76
j=77,t=46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77
j=78,t=47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78
j=79,t=48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79
j=80,t=49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80
j=81,t=50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81
j=82,t=51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82
j=83,t=52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83
j=84,t=53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84
j=85,t=54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85
j=86,t=55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86
j=87,t=56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87
j=88,t=57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88
j=89,t=58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89
j=90,t=59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90
j=91,t=60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91
j=92,t=61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92
j=93,t=62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93
j=94,t=63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94
j=95,t=64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95
j=96,t=65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96
j=97,t=66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97
j=98,t=67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98
j=99,t=68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99
j=100,t=69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100
j=101,t=70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101
j=102,t=71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102
j=103,t=72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103
j=104,t=73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104
j=105,t=74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105
j=106,t=75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106
j=107,t=76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107
j=108,t=77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108
j=109,t=78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109
j=110,t=79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110
j=111,t=80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111
j=112,t=81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112
j=113,t=82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113
j=114,t=83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114
j=115,t=84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115
j=116,t=85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116
j=117,t=86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117

Оценим быстродействие такого метода для массива в 1024 элемента
Код
local M=1000000
local t=newCA(1024)
--nklib.startA();
local tim=os.clock();
for j=1,M do setCA(t,j) end
--local tim=0.1*nklib.stopA()/M
tim=os.clock()-tim
print(1000000.*tim/M.." мкс" )
результат:
Код
>D:/lua53/lua53.exe -e "io.stdout:setvbuf 'no'" "test_lines.lua" 
10.099 мкс
>Exit code: 0

Т .е. на сохранение одного нового элемента в таком массиве затрачивается примерно 10 мкс.
---------------------
Таким образом, с помощью приведенных выше двух простых функций,
Вы можете  управлять расходом оперативной памяти в своем роботе,
исходя из требуемого временного окна обработки поступающих данных.
CalcBuySell. Что не так?
 
Сейчас все работает.
Мой робот
 
В этой теме
https://forum.quik.ru/forum17/topic8467/
я подробно рассказал как просто сделать  очередь событий в роботе и для чего это нужно.
При этом использование функции sleep  не приводит к потере событий на рынке.
-----------------------------
Однако, такое решение имеет недостаток в том, что ядро процессора простаивает, когда в очереди есть события.
-----------------------
Может показаться, что простаивание ядра на 10 ms это мелочь.
Но у нас ядро работает на частоте 3ГГц и более. За 10ms процессор может выполнить более 100 тысяч команд.
Стоит ли их терять?
---------------------  
Я использую другой способ остановки процессора на время отсутствия событий.
Рассказываю о нем лишь в самом упрощенном виде.
Кто пожелает его реализовать, рекомендую книгу Дж.Рихтера.
--------------------
Этот механизм можно реализовать на СИ.
Для этого создается специальный флаг, называемый event - событие.
Для обнаружения события используется функция ожидания события.
С учетом этого у меня колбеки записаны иначе, чем в указанной выше теме.
В них добавлена функция управления событием.
А в функцию main добавлена функция ожидания, которая дополнительно реализует функцию "сторожевого пса"
Вот фрагменты этих участков скрипта:
Код
function OnParam(c,s)   _N=_N+1; tpr[_N]={14,c,s};      nkevent.Set(event);end
Код
----
   local w=nkevent.wait(); --ждем события
   if w~=0 then  Log:write(w..",прошло 30 секунд\n"); Log:flush(); end
   while _N>0 do
----
CalcBuySell. Что не так?
 
Цитата
Игорь М написал:
Цитата
nikolz написал:
Функция выдает нули.  Что не так?
На реальном сервере функция работает.
Раньше и на демо работала.
CalcBuySell. Что не так?
 
Цитата
Kolossi написал:
Пардон, это я про то, что просто вывести message(tostring(qty).." "..tostring(com))
Цитата
Kolossi написал:
 local s=c..","..s..","..tostring(client)..","..tostring(price)..","..tostring(acc)..", qty="..tostring(qty);
так там так и стоим:
Код
", qty="..tostring(qty);
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
Glukator написал:
nikolz, объясняльщик ты х**в, понятие "сдвиговый регистр" пришло в ЦОС из схемотехники, где оно материализуется в виде законченного устройства, в виде микросхемы, естественно, с ограниченным числом ячеек. А "очередь" - понятие чисто алгоритмическое, подразумевающее добавление элементов с одного конца, а извлечение с другого, вот и все. И по барабану, с какого там конца программист индексы нумерует. И то, что ему захотелось длину очереди ограничить - с алгоритмической точки зрения тоже ниего не меняет, кто раньше вошел - тот раньше вышел. Называй как хочешь, суть не меняется. Терминологии он тут решил поучить, ага.
А ты тогда просто мудак.
Объясняю для тебя специально.
В цифровой обработке сигналов есть понятие элементы задержки. Эти понятия есть даже в ИИ. И это вполне алгоритмическое понятие в настоящее время, так как большинство разработчиков ИИ понятия не имеют о схемотехнике.  
Так вот , то что хочет автор этой темы реализуется не очередями и не стеками, а циклическими массивами.
-----------------------
Да и еще
Даже в луа есть операция сдвига вправо и влево - а это и есть сдвиговый регистр . можешь придумать другое название Мне по...
А то что Вы здесь херней занимаетесь это факт.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
TGB написал:
Написано:
Цитата
TGB написал:
При перезаписи, если нет других ссылок на область памяти, то она будет удалена (почищена) мусорщиком.
 Это значит, что память расти не будет.
Херня это  все
У вас очередь - это массив. Если в массиве хранятся числа, то для них не отводится дополнительной памяти.
Но даже если Вы храните указатель, то сам элемент массива останется в памяти. Запись nil - это запись 0 в тип элемента массива.
Элементы массива никуда не денутся пока Вы не уничтожите весь массив путем записи nil в его имя.  а не в его элементы.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
VPM,
Вам тут Виктор засрал мозги своей "гениальной" программой очереди.
Вот Вам тест, который доказывает, что ничего это творение не экономит.
Объясняю что делает тест.
Сначала в цикле загоняются push числа  в очередь и очередь увеличивается
Потом все числа выгоняются из очереди функцией pop и очередь становится вообще пустая
----------------
В процессе этого измеряем расход памяти до и после и запускаем сборщик чтобы собрать все что освободилось
вот сам тест:
Код
local M=10000000
local count1 = collectgarbage("count") -- получаем текущий размер памяти
print("начальный объем занятой памяти",count1);
--------------------------
local list=List.new()
for i=1, M do  List.pushlast(list,i) end
print("число элементов в очереди list после "..M.." циклов функции push="..#list)
local count1 = collectgarbage("count")
print("объем занятой памяти",count1);
--------------------------------
 for i=1, M do  List.popfirst(list) end
print("число элементов в очереди list после "..M.." циклов pop="..#list)
local count1 = collectgarbage("count")
print("объем занятой памяти после сборщика мусора",count1);
collectgarbage("collect")
local count1 = collectgarbage("count") -- получаем текущий размер памяти
print("объем занятой памяти после pop",count1);
------------------------------
collectgarbage("collect") -- выполняем сбор мусора
local count2 = collectgarbage("count") -- получаем размер памяти после сбора
print("объем занятой памяти после сборщика мусора",count1);

а это результат:
Код
>D:/lua53/lua53.exe -e "io.stdout:setvbuf 'no'" "Test_List.lua" 
начальный объем занятой памяти   63.69921875
число жлементов в очереди list после 10000000 циклов функции push=9999999
объем занятой памяти   262202.31738281
число элементов в очереди list после 10000000 циклов pop=0
объем занятой памяти после сборщика мусора   262202.51953125
объем занятой памяти после pop   262202.12792969
объем занятой памяти после сборщика мусора   262202.12792969
>Exit code: 0
Как видим, ничего не освободилось. НОЛЬ.
При этом элементов в очереди тоже ноль.
============================
Ты не поверь, Карл, такую чушь обсуждают целую неделю.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Учите терминологию, а не придумывайте  
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
В очереди нет синхронизации извлечения первого и добавления последнего.
Такая синхронизация в сдвиговых регистрах.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
опечатка ..
Если Вы будете удалять первый при добавлении последнего,
то это называется  СДВИГОВЫЙ РЕГИСТР, а не очередь.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Если Вы будете удалять первый при удалении последнего,
то это называется  СДВИГОВЫЙ РЕГИСТР, а не очередь.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Объясняю медленно  .
-----------------------
Для экономии памяти очередь вообще не причем.
В цифровой обработке сигналов нет даже такого понятия.
Для этой цели применяются сдвиговые регистры (массивы, вектора)
--------------------
Это КЛАССИКА в цифровой обработке  сигналов.
-------------------
Все фильтры и индикаторы строятся на циклических массивах.
------------------
 
CalcBuySell. Что не так?
 
Функция выдает нули.  Что не так?
-------------
Тест:
Код
function main()
   while fconnect do
      if getInfoParam("SERVERTIME") then fconnect=2;  end
      while fconnect==2 do
      c="QJSIM"; s="SBER"  client="10326"; acc="NL0011100043"; price=275.74;
      qty,com=CalcBuySell(c,s,client,acc,price,true,false);
      local s=c..","..s..","..tostring(client)..","..tostring(price)..","..tostring(acc)..", qty="..tostring(qty);
      message(s,1);
         sleep(10000); end
   end
end
function OnInit(pfile)    fconnect=isConnected(); end

Результат:

os.sysdate() . Что-то в ней не так..
 
Добрый день,
Вопрос к разработчикам
В документации на библиотеку QLua заявлено, что
os.sysdate() возвращает системное время с точность до микросекунды.
------------------------
Это означает, как я понимаю, что если я получу с помощью этой функции время в двух точках скрипта, то разница даст мне время исполнения этого участка с точностью до микросекунды.
------------------
Я написал такой тест:
Код
paths = "D:/nkarray/"
package.cpath =paths.."?.dll";
require "nkarray"
event=nkevent.Create("event");
---------------------
name="bot";  -- имя робота
path = "D:/QUIK_SCRIPT/nk_bot/"   --папка где разместим лог файл
Log=io.open(path..name..".log","w")   -- создаем лог файл для записи
------------
_N=0; _tN={};
----------------------
function main()
-----------------------
   while fconnect do
      if getInfoParam("SERVERTIME") then    fconnect=2;  end
------------------------------
      while fconnect==2 do
      w=nkevent.wait(event); --ждем события
         while _N>0 do
            t=_tN[_N]; _N=_N-1
   ----------------------
            tim2=0.1*nklib.stopA();
            T=os.sysdate();
            local _,_,_,t3=nkvm.D(); --HMS,YMD,dHMS,dt,ns
            t1=60.*(60.*T.hour+T.min)+T.sec+0.001*(T.ms+0.001*T.mcs);
            local x1=1000000.*(t1-t[1])//1;
            local x2=1000000.*(t3-t[2])//1;
            Log:write("os.sysdate OnParam(сек)="..t[1]..", os.sysdate main(сек)="..t1..",разность 1(мкс)=="..(t1-t[1]).."\n");Log:flush();
            Log:write("nkvm.D OnParam(мкс)="..t[2]..", nkvm.D main(мкс)="..t3..", разность 2(мкс)="..(t3-t[2]).."\n");Log:flush();
            Log:write("разность 3 по высокоточному таймеру OC(мкс)="..tim2.."\n\n");Log:flush();
         end
      end

   end
end
----------------------------
function OnInit(pfile)    fconnect=isConnected(); end
----------------
function OnParam(c,s)
local T=os.sysdate(); local tim=60.*(60.*T.hour+T.min)+T.sec+0.001*(T.ms+0.001*T.mcs)
nklib.startA();   local _,_,_,tim1=nkvm.D();    _N=_N+1; _tN[_N]={tim,tim1};
nkevent.Set(event);
end
В котором я замеряю системное время в колбеке on Param  в строке
Код
local T=os.sysdate(); local tim=60.*(60.*T.hour+T.min)+T.sec+0.001*(T.ms+0.001*T.mcs)

и передаю его в функцию main
в функции main я снова получаю системное время в строках
Код
T=os.sysdate();

t1=60.*(60.*T.hour+T.min)+T.sec+0.001*(T.ms+0.001*T.mcs);

вычисляю разность этих показаний в строке
Код
local x1=1000000.*(t1-t[1])//1;
и все три значения вывожу в лог файл, который покажу ниже.
----------------------
кроме того, для сравнения я делаю тоже самое на основе собственной функции времени а также своего таймера который реализован на высокоточном таймере процессора.  Но это так, чтобы показать, что действительность не такая, как показывает ваша функция.
и вот результат :
Код
os.sysdate OnParam(сек)=78115.93613, os.sysdate main(сек)=78115.93613,разность 1(мкс)==0.0
nkvm.D OnParam(мкс)=78114968.3296, nkvm.D main(мкс)=78114968.3932, разность 2(мкс)=0.063599988818169
разность 3 по высокоточному таймеру OC(мкс)=59.8

os.sysdate OnParam(сек)=78115.998828, os.sysdate main(сек)=78115.998828,разность 1(мкс)==0.0
nkvm.D OnParam(мкс)=78114999.9583, nkvm.D main(мкс)=78115000.0045, разность 2(мкс)=0.046200007200241
разность 3 по высокоточному таймеру OC(мкс)=30.3

os.sysdate OnParam(сек)=78115.870038, os.sysdate main(сек)=78115.870038,разность 1(мкс)==0.0
nkvm.D OnParam(мкс)=78115435.1791, nkvm.D main(мкс)=78115435.2126, разность 2(мкс)=0.033499985933304
разность 3 по высокоточному таймеру OC(мкс)=24.3
На основе Вашей функции разность показаний равна НУЛЮ.
Мои функции показывают разность от 63 до 24 мкс, что более соответствует реальному процессу,
так как процессор у меня далеко не квантовый.
--------------------
Вопрос:
Что не так с вашей функцией os.sysdate() ?
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Хвалюсь. На начала сессии  6.39%  Сейчас шорт, но не закрыт.
Подробности на графике.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
VPM написал:
Nikolay, Ну первый вопрос зачем лезть в глобальное окружение, я видел у Вас такой прием?
Поясняю.
Основной стек VMLua в КВИКЕ - это то, что вне функции main.
Функция main - создана как  coroutines  (вы это уже знаете) , но только в отдельном потоке.
--------------------
У main, как у  coroutines ,  есть доступ к переменных основной VMLua.
Этот доступ через глобальные функции.
Все библиотеки в том числе QLUA содержатся в глобальной таблице, поэтому к ним есть доступ из main,
но лишь как к глобальным.
-------------------
Схема торговой программы
 
Цитата
Serge123 написал:
Кто-то может рассказать об удачной схеме работы торговой программы (без дорогих сердцу торговых стратегий), чтобы потом не переделывать своё изобретение? Я пока не знаю, как это всё в сумме организовывать и с какой стороны подходить... Торговать лучше по индикаторам или как-то ещё?
https://forum.quik.ru/messages/forum17/message73870/topic8467/#message73870
https://forum.quik.ru/forum17/topic8426/
Страницы: Пред. 1 ... 9 10 11 12 13 14 15 16 17 18 19 ... 80 След.
Наверх