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

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

Страницы: Пред. 1 2 3 4 5 6 7 8 9 10 11 ... 72 След.
Сдвиговые регистры, циклические массивы. Экономим память
 
Цитата
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/
Очередь -элементарно и полезно, Как сделать очередь в роботе и зачем.
 
Примечательно то, что наличие очереди дает нам возможность получить и обработать все события, которые принимают колбеки вне зависимости от величины времени  бездействия  функции sleep.
----------------
Если бы я не использовал очередь, то в случае sleep(1000) - 1 секунда, в каждом цикле терялись несколько десятков событий.
Если посмотрите тему "мой робот", то там видно что за 5 секунд приходит до 3000 событий, которые без организации очереди просто потеряются.
=====================
А теперь я объясню как в моем скрипте организована очередь и почему она такая простая.
---------------
Очередь реализована так.
строка:
Код
_N=0; _tN={};
в ней задается счетчик элементов очереди _N
и таблица для этих элементов
-------------------
запись элемента в очередь производится в колбеках всегда одинаково просто:
Код
  _N=_N+1; _tN[_N]={1,t}; 
а для колбека onParam так:
Код
 _N=_N+1; _tN[_N]={99,c,s,tim};

т е увеличиваем счетчик элементов
и записываем в таблицу по значению счетчика   ключ и передаваемые параметры.
-----------------------
При записи не требуется никакой синхронизации, так как запись лишь в колбеках, а они в одном потоке.
----------------------
Чтение и удаление элемента из очереди реализована в функции main  так:
Код
   t=_tN[_N]; _N=_N-1 

Элемент не удаляется, а уменьшается лишь счетчик.
Удаление элемента произойдет лишь, если на его место будет записан новый элемент в колбеке.
=====================
Вот и вся очередь.
-----------------------
Все просто , но весьма эффективно.
---------------------
Далее я расскажу как сделать обработку еще быстрее, но не сложнее.
-----------------
Продолжение возможно следует..  
Очередь -элементарно и полезно, Как сделать очередь в роботе и зачем.
 
В данном варианте скрипта у нас нет информации о времени исполнения каких-либо фрагментов.
изменим скрипт и добавим измерения времени исполнения.
кроме того, начнем процесс изучения с классической рекомендации разработчиков - поставить sleep на 1 секунду
вот такой скрипт:
Код
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
         DT=getInfoParam("TRADEDATE"); DT=tonumber(string.sub (DT,7,10)..string.sub (DT,4,5)..string.sub (DT,1,2));
         fconnect=2;
         Log:write("DT="..tostring(DT)..",fconnect="..fconnect.."\n");Log:flush();
      end
------------------------------

      local clas,sec,ncb,t,_time,tim1,tim2,T;
      local tim0,tim1,tim2,T;
-----------------------------
      while fconnect==2 do
         while _N>0 do
            t=_tN[_N]; _N=_N-1  ncb=t[1];
   ----------------------
            if ncb==99 then
               clas,sec=t[2],t[3]; tim1=t[4];

            else
               t=t[2];
               if ncb==1 then
                  clas=t.class_code; sec=t.sec_code; --может не быть
               elseif ncb==2 then
                  clas=t.class_code; sec=t.sec_code;
               end
            end
            T=os.sysdate(); tim=60.*(60.*T.hour+T.min)+T.sec+0.001*(T.ms+0.001*T.mcs);
            tim=(1000000.*(tim-tim1))//1;
            Log:write(ncb..",tim="..tim..",clas="..tostring(clas)..",sec="..tostring(sec)..",_N=".._N.."\n");Log:flush();
         end
            sleep(1000);
      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)
      _N=_N+1; _tN[_N]={99,c,s,tim};
end
function OnTransReply(t)        _N=_N+1; _tN[_N]={1,t}; end
function OnOrder(t)            _N=_N+1; _tN[_N]={2,t}; end
это результат в лог файле:
Код
DT=20240119,fconnect=2
99,tim=218014.0,clas=SPBFUT,sec=EuH4,_N=25
99,tim=304359.0,clas=SPBFUT,sec=SVH4,_N=24
99,tim=541966.0,clas=SPBFUT,sec=NKH4,_N=23
99,tim=595608.0,clas=CETS,sec=EUR_RUB__TOD,_N=22
99,tim=1213820.0,clas=SPBFUT,sec=EuH4,_N=21
99,tim=1344144.0,clas=SPBFUT,sec=GZH4,_N=20
99,tim=1404051.0,clas=SPBFUT,sec=EuH4,_N=19
99,tim=587619.0,clas=CETS,sec=EUR_RUB__TOD,_N=18
99,tim=587619.0,clas=SPBFUT,sec=EDH4,_N=17
99,tim=772196.0,clas=QJSIM,sec=YNDX,_N=16
99,tim=772196.0,clas=QJSIM,sec=WUSH,_N=15
99,tim=772196.0,clas=QJSIM,sec=TGKA,_N=14
99,tim=772196.0,clas=QJSIM,sec=TATNP,_N=13
99,tim=772196.0,clas=QJSIM,sec=SNGS,_N=12
99,tim=772196.0,clas=QJSIM,sec=SFIN,_N=11
99,tim=772196.0,clas=QJSIM,sec=SBER,_N=10
99,tim=772196.0,clas=QJSIM,sec=RTKMP,_N=9
99,tim=772196.0,clas=QJSIM,sec=RTKM,_N=8
99,tim=772196.0,clas=QJSIM,sec=OZON,_N=7
99,tim=772196.0,clas=QJSIM,sec=MTLR,_N=6
99,tim=772196.0,clas=QJSIM,sec=KGKCP,_N=5
99,tim=772196.0,clas=QJSIM,sec=IRAO,_N=4
99,tim=772196.0,clas=QJSIM,sec=GLTR,_N=3
99,tim=772196.0,clas=QJSIM,sec=GAZP,_N=2
99,tim=772196.0,clas=QJSIM,sec=ALRS,_N=1
99,tim=772196.0,clas=QJSIM,sec=ABIO,_N=0
99,tim=61608.0,clas=SPBFUT,sec=EuH4,_N=26
99,tim=127575.0,clas=SPBFUT,sec=BRH4,_N=25
99,tim=559817.0,clas=CETS,sec=EURUSD000TOD,_N=24
99,tim=653453.0,clas=SPBFUT,sec=EuH4,_N=23
99,tim=899874.0,clas=SPBFUT,sec=CRH4,_N=22
99,tim=995760.0,clas=SPBFUT,sec=GZH4,_N=21
99,tim=1022059.0,clas=QJSIM,sec=WUSH,_N=20
99,tim=1022059.0,clas=QJSIM,sec=TTLK,_N=19
99,tim=1022059.0,clas=QJSIM,sec=TGKA,_N=18
99,tim=1022059.0,clas=QJSIM,sec=TCSG,_N=17
99,tim=1022059.0,clas=QJSIM,sec=SOFL,_N=16
99,tim=1022059.0,clas=QJSIM,sec=SFIN,_N=15
99,tim=1022059.0,clas=QJSIM,sec=SBERP,_N=14
99,tim=1022059.0,clas=QJSIM,sec=SBER,_N=13
99,tim=1022059.0,clas=QJSIM,sec=RTKM,_N=12
99,tim=1022059.0,clas=QJSIM,sec=MTSS,_N=11
99,tim=1022059.0,clas=QJSIM,sec=MTLR,_N=10
99,tim=1022059.0,clas=QJSIM,sec=KZOSP,_N=9
99,tim=1022059.0,clas=QJSIM,sec=KGKCP,_N=8
99,tim=1022059.0,clas=QJSIM,sec=IRAO,_N=7
99,tim=1022059.0,clas=QJSIM,sec=GAZP,_N=6
99,tim=1022059.0,clas=QJSIM,sec=ALRS,_N=5
99,tim=1430033.0,clas=SPBFUT,sec=SiH4,_N=4
99,tim=619443.0,clas=CETS,sec=SLVRUB_TOM,_N=3
99,tim=619443.0,clas=SPBFUT,sec=EuH4,_N=2
99,tim=681738.0,clas=SPBFUT,sec=EuH4,_N=1
99,tim=805853.0,clas=SPBFUT,sec=SGH4,_N=0
99,tim=311503.0,clas=QJSIM,sec=WUSH,_N=23
99,tim=311503.0,clas=QJSIM,sec=SNGS,_N=22
99,tim=311503.0,clas=QJSIM,sec=SFIN,_N=21
99,tim=311503.0,clas=QJSIM,sec=SBERP,_N=20
В лог файле есть два значения времени tim, - задержка исполнения колбека onParam в main
Как видно из лог файла , Как видим из лог файла очередь на обработку никогда не бывает пустой.
Задержка составляет от 0.3 до 0.8 сек. В лог файле она в мкс.
--------------------------
функция sleep установлена чтобы уменьшить загрузку ядра процессора холостыми циклами.
Поэтому посмотрим в диспетчере задач эту загрузку.
Она составляет:


Примерно 8.5%
теперь давайте уменьшим эту величину до 1 ms
в результате получим:
Код
DT=20240119,fconnect=2
99,tim=32006.0,clas=SPBFUT,sec=SiH4,_N=1
99,tim=32006.0,clas=SPBFUT,sec=SiH4,_N=0
99,tim=31589.0,clas=SPBFUT,sec=RNH4,_N=1
99,tim=31589.0,clas=SPBFUT,sec=RNH4,_N=0
99,tim=24404.0,clas=SPBFUT,sec=SiH4,_N=2
99,tim=24404.0,clas=SPBFUT,sec=SPH4,_N=1
99,tim=24404.0,clas=SPBFUT,sec=EuH4,_N=0
99,tim=32006.0,clas=SPBFUT,sec=RNH4,_N=0
99,tim=30568.0,clas=SPBFUT,sec=SPH4,_N=0
99,tim=30675.0,clas=SPBFUT,sec=RNH4,_N=2
99,tim=30675.0,clas=SPBFUT,sec=SPH4,_N=1
99,tim=30675.0,clas=SPBFUT,sec=RNH4,_N=0
99,tim=30164.0,clas=SPBFUT,sec=RNH4,_N=0
99,tim=20010.0,clas=SPBFUT,sec=SPH4,_N=0
99,tim=30185.0,clas=SPBFUT,sec=SPH4,_N=0
99,tim=28578.0,clas=SPBFUT,sec=RIH4,_N=1
99,tim=28578.0,clas=SPBFUT,sec=SiH4,_N=0
99,tim=4000.0,clas=SPBFUT,sec=EuH4,_N=0
99,tim=26515.0,clas=SPBFUT,sec=RNH4,_N=0
99,tim=2383.0,clas=SPBFUT,sec=RNH4,_N=0
99,tim=30316.0,clas=SPBFUT,sec=SiH4,_N=1
99,tim=30316.0,clas=SPBFUT,sec=SiH4,_N=0
99,tim=31911.0,clas=SPBFUT,sec=SPH4,_N=0
99,tim=11245.0,clas=SPBFUT,sec=VBH4,_N=2
99,tim=11245.0,clas=SPBFUT,sec=VBH4,_N=1
99,tim=11508.0,clas=SPBFUT,sec=RNH4,_N=0
99,tim=11998.0,clas=SPBFUT,sec=SPH4,_N=0
99,tim=28664.0,clas=SPBFUT,sec=SiH4,_N=0
99,tim=27900.0,clas=SPBFUT,sec=RNH4,_N=0
99,tim=831.0,clas=SPBFUT,sec=BRG4,_N=0
99,tim=11832.0,clas=SPBFUT,sec=GZH4,_N=1
99,tim=11832.0,clas=SPBFUT,sec=EuH4,_N=0
99,tim=11998.0,clas=CETS,sec=TRYRUB_TOM,_N=1
99,tim=11998.0,clas=CETS,sec=CNYRUB_TOM,_N=0
99,tim=31687.0,clas=SPBFUT,sec=GZH4,_N=0
99,tim=23877.0,clas=SPBFUT,sec=RNH4,_N=0
99,tim=11997.0,clas=SPBFUT,sec=SPH4,_N=0
99,tim=31793.0,clas=SPBFUT,sec=RNH4,_N=0
99,tim=30233.0,clas=SPBFUT,sec=SPH4,_N=0
99,tim=29818.0,clas=SPBFUT,sec=MMH4,_N=0
99,tim=30141.0,clas=SPBFUT,sec=RNH4,_N=0
99,tim=1998.0,clas=QJSIM,sec=YNDX,_N=19
99,tim=1998.0,clas=QJSIM,sec=WUSH,_N=18
99,tim=1998.0,clas=QJSIM,sec=VTBR,_N=17
99,tim=1998.0,clas=QJSIM,sec=VKCO,_N=16
99,tim=1998.0,clas=QJSIM,sec=TCSG,_N=15
99,tim=1998.0,clas=QJSIM,sec=SFIN,_N=14
99,tim=1998.0,clas=QJSIM,sec=SELG,_N=13
99,tim=1998.0,clas=QJSIM,sec=SBER,_N=12
99,tim=1998.0,clas=QJSIM,sec=ROSN,_N=11
99,tim=1998.0,clas=QJSIM,sec=OZON,_N=10
99,tim=1998.0,clas=QJSIM,sec=MOEX,_N=9
99,tim=1998.0,clas=QJSIM,sec=LKOH,_N=8
99,tim=1998.0,clas=QJSIM,sec=KAZTP,_N=7
99,tim=1998.0,clas=QJSIM,sec=IRAO,_N=6
99,tim=4000.0,clas=QJSIM,sec=GLTR,_N=5

Задержка составляет 1998 мкс примерно 2 ms.  Очередь бывает пустой.
Смотрим загрузку ядра:

Примерно 10%. Что вполне допустимо
------------------
Продолжение следует...
Очередь -элементарно и полезно, Как сделать очередь в роботе и зачем.
 
Тем, кто хотел бы практически разобраться в данном вопросе, рекомендую установить демо КВИК
и запускать скрипты, которые я буду выкладывать и пояснять.
Итак начнем.
Вот исходный скрипт, в нем закомментированы некоторые операторы, которые демонстрируют однотипность записи колбеков
и их обработку в функции main.
В первых трех строчках скрипта создаемся лог файл, куда скрипт выводит информацию о своей работе.
Вам надо исправить 2-ю строку, записав в ней путь, где Вы хотите создать этот файл
Код
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
         DT=getInfoParam("TRADEDATE"); DT=tonumber(string.sub (DT,7,10)..string.sub (DT,4,5)..string.sub (DT,1,2));
         fconnect=2;
         Log:write("DT="..tostring(DT)..",fconnect="..fconnect.."\n");Log:flush();
      end
------------------------------

      local clas,sec,ncb,t,_time;
-----------------------------
      while fconnect==2 do
         while _N>0 do
            t=_tN[_N]; _N=_N-1  ncb=t[1];
   ----------------------
            if ncb==99 then
               clas,sec=t[2],t[3];
            else
               t=t[2];
               if ncb==1 then
                  clas=t.class_code; sec=t.sec_code; --может не быть
               elseif ncb==2 then
                  clas=t.class_code; sec=t.sec_code;
--               elseif ncb==3 then
--               elseif ncb==4 then
--               elseif ncb==5 then
--               elseif ncb==6 then
--               elseif ncb==7 then
--               elseif ncb==8 then
--               elseif ncb==9 then
--               elseif ncb==10 then
--               elseif ncb==11 then
--               elseif ncb==12 then
               end
            end
            Log:write(ncb..",clas="..tostring(clas)..",sec="..tostring(sec)..",_N=".._N.."\n");Log:flush();
            _time=0;
         end
         sleep(1);
      end
   end
end
----------------------------
function OnInit(pfile)    fconnect=isConnected(); end
----------------
function OnParam(c,s)                _N=_N+1; _tN[_N]={99,c,s,tim};end
---------------------
function OnTransReply(t)        _N=_N+1; _tN[_N]={1,t}; end
function OnOrder(t)            _N=_N+1; _tN[_N]={2,t}; end
--function OnStopOrder(t)       _N=_N+1; _tN[_N]={3,t}; end
--function OnTrade(t)              _N=_N+1; _tN[_N]={4,t}; end
--function OnQuote(c,s)           _N=_N+1; _tN[_N]={5,t}; end
--function OnAllTrade(t)       _N=_N+1; _tN[_N]={6,t}; end
--function OnDepoLimit(t)         _N=_N+1; _tN[_N]={7,t}; end
--function OnAccountBalance(t)             _N=_N+1; _tN[_N]={8,t}; end-- изменение позиции по счету
--function OnAccountPosition(t)    _N=_N+1; _tN[_N]={9,t}; end-- изменение позиции по счету
--function OnDepoLimit(t)       _N=_N+1; _tN[_N]={10,t}; end -- изменение позиции по инструментам
--function OnFuturesClientHolding(t) _N=_N+1; _tN[_N]={11,t}; end  -- изменение позиции по срочному рынку
--function OnMoneyLimit(t)       _N=_N+1; _tN[_N]={12,t}; end -- изменение денежной позиции

--function OnClose() fconnect=nil end
--function OnConnected(flag) fconnect=1; end
--function OnDisconnected() fconnect=1 end
--function OnStop(flag) fconnect=nil; return 2000 end
--function OnCleanUp()  end -- смена торговой сессии
--function OnDepoLimitDelete(t) end -- удаление позиции по инструментам
--function OnFirm(t) end -- получение описания новой фирмы
--function OnFuturesLimitChange(t) end -- изменение ограничений по срочному рынку
--function OnFuturesLimitDelete(t) end -- удаление лимита по срочному рынку
--function OnMoneyLimitDelete(t) end -- удаление денежной позиции
--function OnNegDeal end-- новая заявка на внебиржевую сделку или изменение параметров существующей заявки на внебиржевую сделку
--function OnNegTrade end-- новая сделка для исполнения или изменение существующей сделки для исполнения
для наглядности уберем эти комментарии:
Код
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
         DT=getInfoParam("TRADEDATE"); DT=tonumber(string.sub (DT,7,10)..string.sub (DT,4,5)..string.sub (DT,1,2));
         fconnect=2;
         Log:write("DT="..tostring(DT)..",fconnect="..fconnect.."\n");Log:flush();
      end
------------------------------

      local clas,sec,ncb,t,_time;
-----------------------------
      while fconnect==2 do
         while _N>0 do
            t=_tN[_N]; _N=_N-1  ncb=t[1];
   ----------------------
            if ncb==99 then
               clas,sec=t[2],t[3];
            else
               t=t[2];
               if ncb==1 then
                  clas=t.class_code; sec=t.sec_code; --может не быть
               elseif ncb==2 then
                  clas=t.class_code; sec=t.sec_code;
               end
            end
            Log:write(ncb..",clas="..tostring(clas)..",sec="..tostring(sec)..",_N=".._N.."\n");Log:flush();
            _time=0;
         end
         sleep(1);
      end
   end
end
----------------------------
function OnInit(pfile)    fconnect=isConnected(); end
----------------
function OnParam(c,s)        _N=_N+1; _tN[_N]={99,c,s,tim};end
---------------------
function OnTransReply(t)        _N=_N+1; _tN[_N]={1,t}; end
function OnOrder(t)            _N=_N+1; _tN[_N]={2,t}; end
Запустим этот скрипт на исполнение
и получим следующий результат в лог файле
Код
DT=20240119,fconnect=2
99,clas=SPBFUT,sec=SiH4,_N=0
99,clas=SPBFUT,sec=MMH4,_N=0
99,clas=SPBFUT,sec=EuH4,_N=0
99,clas=SPBFUT,sec=EuH4,_N=0
99,clas=SPBFUT,sec=EuH4,_N=0
99,clas=SPBFUT,sec=SFH4,_N=0
99,clas=SPBFUT,sec=EuH4,_N=0
99,clas=SPBFUT,sec=EuH4,_N=1
99,clas=SPBFUT,sec=USDRUBF,_N=0
99,clas=SPBFUT,sec=EuH4,_N=0
99,clas=SPBFUT,sec=USDRUBF,_N=0
99,clas=CETS,sec=USDCNY_TOM,_N=4
99,clas=CETS,sec=EURUSD000TOD,_N=3
99,clas=CETS,sec=CNYRUB_TOM,_N=2
99,clas=CETS,sec=EUR_RUB__TOM,_N=1
99,clas=SPBFUT,sec=EuH4,_N=0
99,clas=SPBFUT,sec=TNH4,_N=1
99,clas=SPBFUT,sec=EuH4,_N=0
99,clas=SPBFUT,sec=SGH4,_N=0
99,clas=SPBFUT,sec=CHH4,_N=0
99,clas=SPBFUT,sec=SGH4,_N=1
99,clas=SPBFUT,sec=CHH4,_N=0
99,clas=SPBFUT,sec=LKH4,_N=1
99,clas=SPBFUT,sec=SGH4,_N=0
99,clas=SPBFUT,sec=TNH4,_N=3
99,clas=SPBFUT,sec=TNH4,_N=2
99,clas=SPBFUT,sec=EDH4,_N=1
99,clas=SPBFUT,sec=EDH4,_N=0
99,clas=QJSIM,sec=WUSH,_N=12
99,clas=QJSIM,sec=UPRO,_N=11
99,clas=QJSIM,sec=UGLD,_N=10
99,clas=QJSIM,sec=SIBN,_N=9
99,clas=QJSIM,sec=NMTP,_N=8
99,clas=QJSIM,sec=MTLR,_N=7
99,clas=QJSIM,sec=MDMG,_N=6
99,clas=QJSIM,sec=GLTR,_N=5
99,clas=QJSIM,sec=CHMF,_N=4
99,clas=QJSIM,sec=ALRS,_N=3
99,clas=QJSIM,sec=ABIO,_N=2
99,clas=SPBFUT,sec=CRH4,_N=1
99,clas=SPBFUT,sec=TNH4,_N=0

Последним значением в строке переменная _N - длина очереди.
--------------
Пояснение следует...
Очередь -элементарно и полезно, Как сделать очередь в роботе и зачем.
 
Добрый день,
Хочу поделиться некоторыми приемами, которые я использую при построении своих роботов.
См. тему -мой робот.
-----------------
В структуре спинного мозга робота , реализуемого в QUIK, условно можно выделить колбеки,
в которые приходят сообщения о событиях и функцию main,
работающую в отдельном потоке, которая обрабатывает эти события.
-------------------
Как правило, в  main делается бесконечный цикл, в котором и осуществляется обработка.
------------------------
Если обрабатывать нечего, то рекомендуют ставить sleep(time) , где time - число миллисекундах,
на которое Вы заморозите работу main.
===============
Но проблема в том, что пока Main не работает, в колбеки поступают события ,
которые надо обрабатывать либо как-то сохранить иначе они потеряются.
------------------------------
Если обрабатывать события  в колбеках, то на время обработки будет остановлен терминал QUIK, так как колбеки работают в основном потоке термина.
------------------
Проблема решается путем сохранения сообщений из колбеков в массиве,
из которого потом main сможет обработать все сохраненные сообщения.
Такой список (массив,таблица и т д) сообщений называется очередью.
===================
Вопрос лишь в том, как организовать эту очередь , чтобы было просто и быстро.
---------------
Есть несколько вариантов,
------------
Вариант 1: классический - это сделать универсальные списки, очереди. Алгоритмов и их реализаций много можно найти в интернете.
Сложно, малопонятно не спецам . Большая нагрузка на сборщик мусора, что замедляет исполнение скрипта.
--------------------
Вариант 2: -рекомендуемый  в документации QLUA - использовать потоко безопасные функции записи и удаления из массива.
Просто, но относительно медленно.
-------------------
Вариант 3:   это мой, тот который я расскажу далее. просто и быстро.
Объяснять буду на рабочем примере.
-------------------
Продолжение следует...

 
Lua таблицу в файл и обратно
 
еще вариант преобразования таблицы в скрипт Lua
Код
function t2s(t,s) -- преобразование таблицы в скрипт Lua
   for z,v in pairs(t) do
   if s~="" then s=s.."," end
       if type(z)~="number" then s=s.."["..z.."]=" end
      m=type(v);
      if m=="table" then x=t2s(v,"")
        elseif m=="number" then  x=v;
      else x='"'..v..'"';   end
      s=s..x;
    end
return "{"..s.."}";
end
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
а теперь хвалюсь. На сегодня 5.98%. Подробности на картинке.

Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Выложенный скрипт  очереди Владимира - это просто ужас какой-то.
Сборщик мусора сойдет с ума.
Берем такой  два варианта :
Код
--сравнительный тест размер массива
local M=1000000
local list=List.new()
local tnk=nkcc.new(32);
nklib.startA();  for i=1, M do push(tnk,i); end  tim1=nklib.stopA();
print("замер массива после"..M.." циклов push="..#tnk)
nklib.startA();  for i=1, M do local x=pop(tnk); end  tim2=nklib.stopA();
print("замер массива после"..M.." циклов pop="..#tnk)
nklib.startA();  for i=1, M do local x=get(tnk,i); end  tim3=nklib.stopA();
print("замер массива после"..M.." циклов pop="..#tnk)
print(tim0,tim01,tim1,tim2,tim3,tim0/tim1,tim01/tim2,tim01/tim3);

а это результат:
Код
>D:/lua53/lua53.exe -e "io.stdout:setvbuf 'no'" "Test_List.lua" 
замер массива после1000000 циклов push=999999
замер массива после1000000 циклов pop=0
739889   798541
замер массива после1000000 циклов push=33
замер массива после1000000 циклов pop=33
замер массива после1000000 циклов pop=33
739889   798541   668524   665355   742990   1.1067500942375   1.2001728400628   1.0747668205494
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
VPM написал:
Цитата
Glukator написал:
Да хрен его знает, этого прохвоссора, о чем он толкует. У вас какое-то конкретное практическое приложение намечено для этих структур?

Да уж куда еще конкретней. Попробую сформировать свою Задачу.

Эта тема лежит в начале обсуждения (пост #1) на этой веточки. Но куда то подевались программисты? Все "понты" по отлетали. Лучше месяцами "толочь воду в ступе" про OnInit и тому подобное.
Это делается организацией циклическим массивом.
Например, в индикаторах используем не более 32 отсчетом .
это тест в нем внешний цикл это поступающие отсчеты
А внутренний цикла печатает какие отсчеты сейчас внутри массива
Код
local M=1000000
local tnk=newV(32);
 for i=1, M do push(tnk,i);
local t1={}
for i=1,32 do t1[i]=get(tnk,i); end
print(table.concat(t1,","));
end
и вот результат: Массив содержит всегда последние 32 элемента . Сборщик мусора отдыхает.
Могу показать как работает стек с фиксированной длинной и очередь с циклическим массивом.
А ту очередь, которую Вам гуру по прогаммированию написалчто Вам раноше
Код
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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,118
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,118,119
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,118,119,120
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,118,119,120,121
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,118,119,120,121,122
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,118,119,120,121,122,123
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,118,119,120,121,122,123,124
94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125
95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126
96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127
97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128
98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129
99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130
100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131
101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132
102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133
103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134
104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135
105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136
106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137
107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138
108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139
109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140
110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141
111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142
112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143
113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144
114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145
115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146
116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147
117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148
118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149
119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150
66,167,168,169,170
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата

List.pushlast: ; number; ; list.last=0; number; list[last]=40
тут ошибки
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
VPM,
В качестве информации к размышлению.
---------------------
Вы наверное видели на форуме результаты теста хранения и обмена данных по принципу Memory-mapped files
-------------------  
Так вот , применение отображения файла на память решает все проблемы с объемом памяти.
----------------------------------------
1)  Объем памяти для хранения данных.
У меня он ограничен свободным объемом диска. сейчас это 100 ГБайт.
Очевидно, что если мало, то можно добавить еще диск специально для данных, например 500 Гбайт
Цена вопроса 2тр.  Понятно, что объем памяти для хранения данных практически любой.
---------------------------------------
2) Объем памяти для обработки данных.
Очевидно, что обрабатывать  500 Гбайт каждую минуту нет надобности.  
У меня на компе есть сейчас  свободных  2.5Гбайта .
Для обработки за один заход  мне достаточно 1 ГБайт.
------------------------------------
3) Фокус в том, что на этот 1Гбайт  менее, чем за 0.001 сек проецирую  любой ГБайт из файла на диске.
После проецирования работа с Гбайтом данных выполняется в памяти.
----------------
Более того, не надо ничего читать из файлов в другие потоки или приложения.
------------------------
Они видят эту оперативную память и просто работают с ней как обычно.
=========================
Резюме, нет никаких ограничений ни в памяти для обработки , ни в памяти для хранения.
 
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Хвалюсь:
Lua таблицу в файл и обратно
 
Serge123,
За базар отвечаешь?
-------------------
Разуй глаза:
Lua таблицу в файл и обратно
 
Цитата
Serge123 написал:
bot4sale.ru/blog-menu/qlua/300-table-tostring.html
Можешь доказать?
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
VPM,
Вы рыбак?  Покупали лодку на Аральском море ?
-----------------
Если нет, то Ваш пример из раздела - " Остапа понесло"  
---------------  
Всегда прикольно, когда начинают рассказывать примеры из совершенно чужой области деятельности.
===========
Типа:  "А вот им это очень нужно"
или "в будущем это особо пригодится тем, .... "
и так далее...
Cкорость обмена данными через файлы
 
Цитата
Serge123 написал:
А если диск виртуальный, то как по сравнению с маппинг филес?
У меня нет виртуального диска.
Могу предположить что разницы в скорости нет так как обмен практически через память ,
но в маппинге параллельно получаем файл в энергонезависимой памяти (диске). и нет надобности тратить память на виртуальный диск.
Ну и безусловно, если данных  сотни гигабайт или терабайты, то никакой виртуальный диск  не поможет.
------------------------------
Возможно обмен через Shared Memory будет быстрее.  
Cкорость обмена данными через файлы
 
сделал тест обмена данными приложения Lua и  Python.
--------------------
для mapping falles скорость обмена 21 МБ/сек.
Просто файлами  0.8 МБ/сек.
Аналогично между приложениями на Lua.
------------------
Функции обмена реализованы на С.
Ограничения при использовании QuikSharp.lua
 
Цитата
bespalex написал:
Цитата
nikolz написал:
Я выкладывал тесты.
Но с питоном не делал.
Он медленнее luajit примерно в 30 раз.
да уже увидел тесты
сделал тест обмена данными приложения Lua и  Python.
--------------------
для mapping falles скорость обмена 21 МБ/сек.
Просто файлами  0.8 МБ/сек.
Аналогично между приложениями на Lua.
------------------
Функции обмена реализованы на С.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Продолжаю хвалится.
--------------------------
Те кому рябит, смотрите только нижнюю картинку
это профит - рассчитывается с начала этого года (есть за 2023 и частично за 2022)
--------------
белая линия - это суммарный профит
зеленая линия - это лонг
синяя - это шорт
штриховые линии - это текущий расчет.
=================
Графики использую для обучения.
Этот робот реализует NN -"обучение с учителем"
-----------------
С самообучением пока лишь стою.
==============
На верхнем графики автоматически строятся уровни поддержки и сопротивления и линии регрессии.  
Ограничения при использовании QuikSharp.lua
 
Я выкладывал тесты.
Но с питоном не делал.
Он медленнее luajit примерно в 30 раз.
Ограничения при использовании QuikSharp.lua
 
Цитата
bespalex написал:
Цитата
nikolz написал:
 
Цитата
bespalex  написал:
   перебор тоже вариант  
Чаще всего отключение происходит ровно в 10:00:05. Не знаю, может какое-то технологическое переключение в начале сессии, которое триггерит выкидыш. Не думаю, что если бы дело было в core.dll оно бы так выглядело.
  Дело в том, что нет смысла передавать все данные из КВИК через луа в питон.
-------------
Моя концепция создания робота такая:
-----------
Робот условно содержит две части - я их назвал по аналогии с человеком - спинной и головной мозг.
Спинной - это все колбеки в КВИКЕ и все торговые операции в КВИКЕ.
Их нет смысла  перегонять в питон и обратно.
Это фактически автомат стандартных действий, которые не зависят никак от стратегии и тактики торговли.
Эту часть я реализую в КВИКЕ на луа + си for lua.
------------------
Головной мозг -  это прогнозы, управление капиталом, стратегии торговли можно и нужно реализовывать
в дополнительных потоках и приложениях  на любых языках, в том числе и питоне.
---------------------  
Вот для этого организую  взаимодействие КВИКа через Луа с python, rust,julia, terra, luajit и т д
================  
Сейчас обмен любыми данными делаю через mapping files.
Скорость обмена просто аховая, так как это обмен через память .
Нет никаких оберток. Поддерживаются все форматы.
Строки передаю как хеш.  Это фактически два целых числа.
Объем данных ограничен лишь объемом дисков.
----------------------  
Хочу сделать формирования запроса произвольных данных от сторонних приложений.
===========
И еще замечу, что если Вы исполняете скрипт для питона без jit либо трансляции в СИ,
то это раз в пять медленнее, чем на луа.
Спасибо, очень познавательно.
У меня задача немного проще сейчас: адаптировать существующего робота для работы с Quik. В принципе не сказать, что медленно, цикл проверок на триггер занимает около 50-150мс (вместе со всеми транзакциями). Для моих задач этого пока достаточно. В вашей системе какое время обработки получается?
Примерно  от 100 до 1000 раз быстрее.
Прикольно: Lua5.4 медленнее Lua5.3
 
а это python
Код
>pythonw -O "test.py" 
time=1.96  y=-94.5016299429584
>Exit code: 0
Прикольно: Lua5.4 медленнее Lua5.3
 
lua.jit без сюрпризов
Код
>D:/LuaJIT/luajit.exe -e "io.stdout:setvbuf 'no'" "testSM.jit" 
time=0.092   y=-94.501629942958
>Exit code: 0
Прикольно: Lua5.4 медленнее Lua5.3
 
Добрый день,
Тестил скорость питона, луа и jit и решил посмотреть, как ускорит Lua5.4 по сравнению 5.3.
--------------------
Раньше было быстрее, да и интернет говорит об этом же.
Выкладывал тест на форуме.
------------
Но получился прикол.
На этом тесте оказалось наоборот
Вот этот testSM.lua
Код
local V={}
local t=os.clock();
local N=256;
local y=0.;
local A=100.
local P=128
local W=2*3.14/N
for i=1,10000000 do
   y=A*math.sin(W*i);
end
local t1=os.clock()
print("time="..t1-t,"y="..y);

результат:
Код
>D:/lua54/lua54.exe -e "io.stdout:setvbuf 'no'" "testSM.lua" 
time=0.74   y=-94.501629942958
>Exit code: 0

>D:/lua53/lua53.exe -e "io.stdout:setvbuf 'no'" "testSM.lua" 
time=0.597   y=-94.501629942958
>Exit code: 0
Кто сможет объяснить?
Получение тиковых данных(исторических) во вне биржевой сессии
 
Цитата
Робеспьер написал:
Цитата
nikolz написал:
Да, тики - это лишь текущие торги. Свечи - на сервер КВИК формируются и хранятся 3000 шт. Если не будете удалять и переустанавливать, то будут накапливаться в арктве на компе бБлагодарю за пояснение
Благодарю за пояснение!
По поводу второго вашего поста, нужно было сделать только один запрос с последующим экспортом в cvs например, но теперь я понял что нужно искать другие источники биржевых данных, либо накапливать самому во внешнюю БД
Можно брать с финама
Ограничения при использовании QuikSharp.lua
 
Цитата
bespalex написал:
Цитата
перебор тоже вариант  
Чаще всего отключение происходит ровно в 10:00:05. Не знаю, может какое-то технологическое переключение в начале сессии, которое триггерит выкидыш. Не думаю, что если бы дело было в core.dll оно бы так выглядело.
Дело в том, что нет смысла передавать все данные из КВИК через луа в питон.
-------------
Моя концепция создания робота такая:
-----------
Робот условно содержит две части - я их назвал по аналогии с человеком - спинной и головной мозг.
Спинной - это все колбеки в КВИКЕ и все торговые операции в КВИКЕ.
Их нет смысла  перегонять в питон и обратно.
Это фактически автомат стандартных действий, которые не зависят никак от стратегии и тактики торговли.
Эту часть я реализую в КВИКЕ на луа + си for lua.
------------------
Головной мозг -  это прогнозы, управление капиталом, стратегии торговли можно и нужно реализовывать
в дополнительных потоках и приложениях  на любых языках, в том числе и питоне.
---------------------  
Вот для этого организую  взаимодействие КВИКа через Луа с python, rust,julia, terra, luajit и т д
================  
Сейчас обмен любыми данными делаю через mapping files.
Скорость обмена просто аховая, так как это обмен через память .
Нет никаких оберток. Поддерживаются все форматы.
Строки передаю как хеш.  Это фактически два целых числа.
Объем данных ограничен лишь объемом дисков.
----------------------  
Хочу сделать формирования запроса произвольных данных от сторонних приложений.
===========
И еще замечу, что если Вы исполняете скрипт для питона без jit либо трансляции в СИ,
то это раз в пять медленнее, чем на луа.
Получение тиковых данных(исторических) во вне биржевой сессии
 
Цитата
Робеспьер написал:
Всем привет!
Полагаю, что получение тиковых данных возможно только при активной биржевой сессии, или возможно, это от брокера зависит.
Код
  class_code  =   "TQBR" 
sec_code  =   "GAZP" 


 function   main ()
    ds, err  =   CreateDataSource (class_code, sec_code, INTERVAL_TICK)
     if  err ~ =   nil   then 
         message (tostring( message ))
         return 
     end 


    err  =  ds: SetEmptyCallback ()
     if  err  =  =   false   then 
         message (tostring(err))
         return 
     end 


     message ( string.format ( "Sizeof: %s" , ds: Size ()))
 end 


  

Вывод:
Sizeof: 0
При использовании свечного интервала, к примеру: INTERVAL_M1, наоборот данные возвращаются со всеми полями OHLC
у вас неправильно написана программа.
Надо один раз подписываться на источник, а не долбить сервер заявками на подписку. Сами тики приходят в колбек onAllTrade
----------------  
На форуме я выкладывал скрипт с очередью данных из колбеков и подпиской. посмотрите и повторите.
Получение тиковых данных(исторических) во вне биржевой сессии
 
Да, тики - это лишь текущие торги. Свечи - на сервер КВИК формируются и хранятся 3000 шт. Если не будете удалять и переустанавливать, то будут накапливаться в арктве на компе больше.
Страницы: Пред. 1 2 3 4 5 6 7 8 9 10 11 ... 72 След.
Наверх