Очереди и двойные очереди в луа

Страницы: 1 2 3 4 5 ... 26 След.
RSS
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Всем Добрый день!

Уж коль тема называется Программирование на языке Lua, обращусь к профи за пояснениями.

Взят Пример из книги Р.Е.

------ Очереди и двойные очереди

"Простейшим способом реализации очередей в Lua является использование функций ins ert и remove из библиотеки table.
Эти функции вставляют и удаляют элементы из произвольной позиции массива, сдвигая остальные элементы для согласования действий.
Однако, подобные перемещения могут быть дорогими для больших структур.

Более эффективная реализация использует две индекса, один для первого элемента и один для последнего:

function ListNew () return {first = 0, last = -1} end

Во избежание загрязнения глобального пространства имен мы
определим все операции со списком внутри таблицы, которую мы соответственно назовем List
(таким образом, мы создадим модуль)."

Код
   local List = {};
function List.new()
    return {first = 0, last = -1}
end
--Теперь мы можем вставлять и удалять элементы с обоих концов за постоянное время:
function List.pushfirst (list, value)
   local first = list.first - 1
   list.first = first
   list[first] = value
end
function List.pushlast (list, value)
   local last = list.last + 1;
   list.last = last;
   list[last] = value;
   --message('List.pushlast: ' ..'; '..tostring(last)..'; '.. tostring(value.price)..'; '.. tostring(value.qty))
end
function List.popfirst (list)
   local first = list.first;
   if first > list.last then 
   --error("list is empty") 
   return nil
   end
   local value = list[first]
   list[first] = nil -- чтобы разрешить сборку мусора
   list.first = first + 1
   return value
end
function List.poplast (list)
   local last = list.last
   if list.first > last then error("list is empty") end
   local value = list[last]
   list[last] = nil -- чтобы разрешить сборку мусора
   list.last = last - 1
   return val ue
end
 
Если вы будете использовать эту структуру для обслуживания в порядке поступления, вызывая только pushlast и popfirst,
то и first, и last будут постоянно расти.

Однако, так как мы представляем массивы в Lua при помощи таблиц,
вы можете индексировать их как с 1 до 20, так и с 16 777 216 до 16 777 236.

Поскольку Lua использует для представления чисел двойную точность, ваша программа можем
выполняться на протяжении двухсот лет, делая по миллиону вставок в секунду,
прежде чем возникнет проблема с переполнением.

-----------------------------------------------------------------------

Реализовал у себя для обработки  OnAllTrade:

Создаем т.  list
local list=List.new()

Получаю, сохраняю list и уматываю.
function OnAllTrade(at)
   if is_run and at and at.sec_code==symbol and at.class_code==class then
   List.pushlast(list, at);
end

Получаю из  list строку для обработки.
function AllTrade()
   at = List.popfirst(list);
end

Все инструмента нормально для обработки одного инструмента,  но в процессе работы скрипт накапливает память.

Вопрос к Профи, как нужно сделать чтоб максимально быстро обрабатывалась и очищалась очередь?
Кто то может пример показать.
 
Возможно ошибаюсь,
но Вы реализовали очередь по принципу LIFO - это стек,
но классическая очередь ( "кто последний", не "последний", а "крайний")  это принцип FIFO, на пример которой Вы сослались   Программирование на языке Lua,
-----------------
Т е Вы просто вместо очереди из книги делаете стек - совершенно другую организацию очереди.
Ваша реализация - это тоже классика реализации стека.
 
Применительно к скриптам на луа стек реализуется гораздо проще, чем Вы написали.
Алгоритм такой
1) запись X в стек:     t[#t+1]=X
2) выталкивание из стека:   X=t[#t],  #t=nil
-----------------
Для указатель стека можно использовать значение таблицы с индексом 0.
 
пардон, опечатка
1) запись X в стек:     t[#t+1]=X
2) выталкивание из стека:   X=t[#t],  t[#t]=nil
 
В примере приведены функции для организации Любого метода: LIFO или FIFO.
В этом то собственно и вопрос в правильной организации обоих методов.

Да то что вы описываете я видел
к Примеру понравилась реализация  OnTrade() от Владимира, лаконично просто шикарно.

В моем же примере обработка не с последнего элемента а сначала сохранённого, ну собственно Вы сами об этом пишите.
 
Забыл сказать что получаю в колбеке обработка Main().
И сколько прилетит в колбек неизвестно даже МаркетМейкеру.
Отсюда и разница в расходе памяти. один ликвидный другой не очень.
 
VPM, Очередь, как и стек, понятия чисто алгоритмические. Но если со стеком всё просто с доступом - обрабатывается всегда  последний элемент, то с очередью всё хуже: обрабатывается первый, а потом первым становится уже второй, и вообще вся очередь сдвигается. Это затратно по времени. Если ничего не сдвигать, то первым элементом всегда будет "условно первый" - доступ мгновенный, как и в случае со стеком, но массив данных постоянно растёт. Это затратно по памяти. Наконец, если данные организовать в виде циклической очереди, как, например, организован буфер событий от клавиатуры, затрат почти нет ни по скорости, ни по памяти, но появляется риск переполнения буфера. Других вариантов, как я понимаю, в природе не существует. Вернее, можно очень эффективно реализовать очередь через список, но, строго говоря, это уже и будет список, т.е. другой тип организации данных. А про все эти insert и remove лучше сразу же забыть, как страшный сон.
 
Владимир, Я это более менее понимаю.

Но по утверждению РЕ это

"Более эффективная реализация использует две индекса, один для первого элемента и один для последнего:"

Я это и опробовал. Здесь нет стандартной библиотеки.

Реализация похожа на Ваш стек, только использует два индекса.
Я так понимаю именно для быстрого доступа и спереди и сзади.

Приведен весь код.
 
"Поскольку Lua использует для представления чисел двойную точность, ваша программа можем
выполняться на протяжении двухсот лет, "
 
Затраты памяти идут на высоко ликвидных к примеру фьючерс на NG нагружает, на RTS норм.
OnAllTrade я баланс считаю.
 
VPM, Да мало ли кто там чего утверждает. Послушать того же Роберто Иерусалимского, так Луа не полное говно, а лучший представитель плеяды языков программирования. Список, стек, очередь - это азбука, букварь, любой профессионал реализует это на полном автопилоте.

Я не знаю, что там за "Более эффективная реализация использует две индекса, один для первого элемента и один для последнего" - это похоже на указатели головы и хвоста в циклической очереди. А вообще доступ к очереди только "спереди" и никакого "сзади". Что до "Поскольку Lua использует для представления чисел двойную точность, ваша программа может выполняться на протяжении двухсот лет", то это бредни в стиле того же Роберто Иерусалимского. Мой скрипт может работать хоть тысячу лет, хоть миллион, и насрать ему на двойную точность. И обслуживать может несколько тысяч тикеров. И затраты памяти никакие.

Что за "баланс" и на кой он нужен?
 
Владимир,
так я и обращаюсь к профи, с вопросом как правильно организовать в луа;
Список,
стек,
очередь.

Мне тяжело судить какай язык или РЕ, у меня нет подобных знаний.
Пользуемся что есть, хотя мне нравится луа, интуитивно понятен.

Таблица Всех сделок отражает кто сделку организовал, больше взять негде - это собственно "Лента".
А Также Количество в сделке.
Баланс я имел ввиду именно Количество контрактов в сделках по направлению сделки.
А так же отслеживаю крупных игроков ну и другие римочки VSA SmartM.
 
VPM, Так же, как и в любом другом языке. Как правило, каждая из этих конструкций имеет некоторые особенности в зависимости от конкретной задачи. В моём скрипте, например, три стека - все разные, хотя техника работы с ними, конечно, одинаковая - LIFO. Очередей не знаю сколько, но тикеры уж точно обрабатываются по очереди. Списков, кажется, нет ни одного.

Мне тоже тяжело судить какай язык - я почти полвека в программировании, любой язык осваиваю за пару часов - мне всё равно на чём писать. А здесь и выбора почти нет - Луа.

Не знаю, что там можно полезного вытащить из Таблицы Всех Сделок - моим алгоритмам совершенно по барабану и "кто сделку организовал", и "количество контрактов" и "крупные игроки".
 
Владимир, к стати как Вы вставляете чтоб именно отвечать Вам.

Я просмотрел Ваши посты, более того мне нравится Ваш подход.

Но давайте говорить на одном языке.

Я установил КВИК не для программирования и Вы тоже.

Мы торгуем!
Что будет если не понимать азов трейдинга?

Пример, если Всех участников этого форума просуммировать наш капитал, и открыть 1 сделку, на все.
Что будет с этой сделкой?

Ответ очевиден. Это бизнес. Но не Ваш и не мой.
 
Чтоб двинуть цену нужны Капиталы!
Чтоб  двинуть цену нужном направлении нужно понимание, и это не закрытые форумы.
Пример тому хорошо освещенная история в трайдинге по серебру.
 
VPM, Кнопка ИМЯ справа в конце каждого коммента.

Ну, я не понимаю азов трейдинга. И понимать не собираюсь. Двигать цену - тем более. Если открыть 1 сделку, на все, то она наверняка проиграет. Серебром никогда не торговал, истории не знаю.
 
Владимир, Спасибо!

История  с серебром это хорошо описанная история в экономике, когда один фонд завладел  рынком серебра.
Вы как программист  прекрасно понимаете каких средств и алгоритмов требуется чтоб держать рынок одной бумаги.

Посмотрите договор ММ на ММИБ.

Но мы сильно отошли от темы.
Если есть желание давайте отдельный топик заведем.
Под названием торговые алгоритмы или еще чего.

Может кто со знатоков Lua посмотрит и протестирует данный функционал.

Хотелось бы универсальные алгоритмы реализации методов получить!
Подчеркиваю никто из нас не является конкурентом друг другу.
 
VPM, Нафиг, нафиг! Я тут пару раз хотел организовать ветки по отладке основных утилит для торговли, вплоть до кода - там же в принципе нет ничего секретного. Такого насмотрелся - больше не хочу. С алгоритмами визгу будет на пару порядков больше. Да и не интересуют меня чужие алгоритмы - я и сам алгоритмист, причём очень хороший. По крайней мере, был таким в молодости.
 
Владимир, Мне думается зря вы, ведь есть round,  средние, да чего только не публикуется.

Я зарегистрировался недавно, а пользуюсь давно беру примеры.

За что ребятам пользуясь моментом хочу сказать огромное Спасибо!

Ругаются когда видимо мешаем им зарабатывать их профессией, но это нормально.
Алгоритм кому помешал его еще нужно прикрутить.

Да и публикуется бесплатные Боты, тестеры индикаторы тот же алгоритм.
 
Владимир,

Для того чтоб слово "Робот" звучало гордо мало одного алгоритма на стек или очередь.

Как минимум нужен RM? управление позицией (MM), сама торговая система (TS) с рядом включенных стратеги и много еще всего.
Вы это лучше меня знаете.
Одно установления тренда с мин. отставанием чего стоит, молчу уже про применение в стратегии.
 
VPM, Я знаю, что системная математика здесь безобразная - чуть ли не четверть моего кода посвящена компенсации всяких глюков, что язык полное говно, что реальная работа делается вне форума, что она многодневная и что мне лично ваапще ничего из торговых алгоритмов не нужно. Скрипт можно запустить, а можно выключить. А можно и не выключать. Вот и весь необходимый набор действий.
 
Цитата
VPM написал:
Всем Добрый день!

Уж коль тема называется  Программирование на языке Lua , обращусь к профи за пояснениями.

Взят Пример из книги Р.Е.

------ Очереди и двойные очереди

"Простейшим способом реализации очередей в Lua является использование функций ins ert и remove из библиотеки table.
Эти функции вставляют и удаляют элементы из произвольной позиции массива, сдвигая остальные элементы для согласования действий.
Однако, подобные перемещения могут быть дорогими для больших структур.

Более эффективная реализация использует две индекса, один для первого элемента и один для последнего:

function ListNew () return {first = 0, last = -1} end

Во избежание загрязнения глобального пространства имен мы
определим все операции со списком внутри таблицы, которую мы соответственно назовем List
(таким образом, мы создадим модуль)."

Код
      local  List  =  {};
 function   List.new ()
     return  {first  =   0 , last  =   -  1 }
 end 
 --Теперь мы можем вставлять и удалять элементы с обоих концов за постоянное время: 
 function  List.pushfirst (list, value)
    local  first  =  list.first  -   1 
   list.first  =  first
   list[first]  =  value
 end 
 function  List.pushlast (list, value)
    local  last  =  list.last  +   1 ;
   list.last  =  last;
   list[last]  =  value;
    --message('List.pushlast: ' ..'; '..tostring(last)..'; '.. tostring(value.price)..'; '.. tostring(value.qty)) 
 end 
 function  List.popfirst (list)
    local  first  =  list.first;
    if  first  >  list.last  then  
    --error("list is empty")  
    return   nil 
    end 
    local  value  =  list[first]
   list[first]  =   nil   -- чтобы разрешить сборку мусора 
   list.first  =  first  +   1 
    return  value
 end 
 function  List.poplast (list)
    local  last  =  list.last
    if  list.first  >  last  then  error( "list is empty" )  end 
    local  value  =  list[last]
   list[last]  =   nil   -- чтобы разрешить сборку мусора 
   list.last  =  last  -   1 
    return  val ue
 end 
 
  
Если вы будете использовать эту структуру для обслуживания в порядке поступления, вызывая только pushlast и popfirst,
то и first, и last будут постоянно расти.

Однако, так как мы представляем массивы в Lua при помощи таблиц,
вы можете индексировать их как с 1 до 20, так и с 16 777 216 до 16 777 236.

Поскольку Lua использует для представления чисел двойную точность, ваша программа можем
выполняться на протяжении двухсот лет, делая по миллиону вставок в секунду,
прежде чем возникнет проблема с переполнением.

-----------------------------------------------------------------------

Реализовал у себя для обработки  OnAllTrade:

Создаем т.  list
local list=List.new()

Получаю, сохраняю list и уматываю.
function OnAllTrade(at)
   if is_run and at and at.sec_code==symbol and at.class_code==class then
   List.pushlast(list, at);
end

Получаю из  list строку для обработки.
function AllTrade()
   at = List.popfirst(list);
end

Все инструмента нормально для обработки одного инструмента,  но в процессе работы скрипт накапливает память.

Вопрос к Профи, как нужно сделать чтоб максимально быстро обрабатывалась и очищалась очередь?
Кто то может пример показать.
Вы забыли дать ссылку, откуда Вы скопировали этот код.
https://stackoverflow.com/questions/18843610/fast-implementation-of-queues-in-lua

,
 
этому коду в обед 12 лет
 
изначально этот код выложен здесь:
http://www.lua.org/pil/11.4.html
Ему в обед 20 лет.
 
Владимир,  Добрый день!

Системная математика  видимо имеется в виду QUIK, но основную лепту вносит биржа.
ARQA Technologies декларирует что дают то и передаем.

Согласен с Вами реализация мягко говоря не "кудышняя", одно пустое обновление версий чего стоит (windows уже отстал).
Но  QUIK старая система писалась еще для сибирской биржи, вот и латают как могут.

Язык бессмысленно ругать другого нет. Я люблю луа - чтоб делал без него (Qpile).

Какие из торговых алгоритмов применять дело индивидуальное. Я люблю солянку.

Событие не включать имеет мин. риск.

Но мы ведь обсуждаем Вкл. Чтоб сделку совершил, вел ее по установленным правилам RM MM  и желательно закрыл в +.
Да еще при всем этом желательно чтоб терминал не падал  :smile:

Ну а если серьезно посмотрите TradingVieW современная более серьезная разработка со своим языком, да и профи привлекают.
Правда брокер на ММВБ один Алор.

с уважением, VPM
 
Цитата
VPM написал:
Владимир,  Добрый день!

Системная математика  видимо имеется в виду QUIK, но основную лепту вносит биржа.
ARQA Technologies декларирует что дают то и передаем.

Согласен с Вами реализация мягко говоря не "кудышняя", одно пустое обновление версий чего стоит (windows уже отстал).
Но  QUIK старая система писалась еще для сибирской биржи, вот и латают как могут.

Язык бессмысленно ругать другого нет. Я люблю луа - чтоб делал без него (Qpile).

Какие из торговых алгоритмов применять дело индивидуальное. Я люблю солянку.

Событие не включать имеет мин. риск.

Но мы ведь обсуждаем Вкл. Чтоб сделку совершил, вел ее по установленным правилам RM MM  и желательно закрыл в +.
Да еще при всем этом желательно чтоб терминал не падал  ::

Ну а если серьезно посмотрите TradingVieW современная более серьезная разработка со своим языком, да и профи привлекают.
Правда брокер на ММВБ один Алор.

с уважением, VPM
Напоминает басню Эзопа "Лиса и виноград"
 
nikolz, Я начинаю повесть именно от туда откуда взят код. Хоть 100 лет. Какое это отношение имеет к коду.

Я уже молчу когда мой первый код был написан, а про железо лучше не вспоминать.  
 
nikolz, Даже слова не знакомы. По существу темы есть мысли.
 
VPM, Да при чём тут биржа? Для меня биржей является сам Квик - именно ему я отправляю заявки, именно от него я получаю данные о сделках, всё остальное - не мои проблемы. Допустим, сам брокер замкнул пару встречных заявок друг на друга, вообще не обращаясь к бирже - какая мне разница? А версии я меняю В ИСКЛЮЧИТЕЛЬНЫХ случаях, просто боюсь этих долбаных нововведений - и без них математика на ладан дышит. Язык я и не ругаю - да, полное говно, но и его возможностей вполне достаточно для организации нормальной торговли. А торговые алгоритмы я применяю только свои. И они меня устраивают - настолько, что я уже несколько месяцев вообще не прикасался к коду. Да, там можно кое-что подрихтовать, но лень - алгоритм и так торгует намного лучше меня.
 
Владимир, Ну конечно брокер, именно он выводит наши заявки на биржу.
А выводить или не выводить это его проблема. Вы видимо имеете в виду форексные дома или это про Т+2?
Ну акции не просто вывести а переместить их на депозитарий.

Я о другом котировки, объем, открытый интерес и много чего а главное Параметры RM Quik - это биржа  именно ее алгоритмы.
 
Владимир, То что вы реализовали свои идеи средствами луа это просто здорово тут и комментарии не нужны.

Я к примеру не очень доволен своей аналитикой, постоянно что кручу верчу, проверяю идеи.
 
VPM, Я имею в виду, что я работаю ТОЛЬКО с Квиком - что там творится на бирже, у брокера или по дороге к ним, мне насрать. И никакой аналитики давно не делаю: запустил скрипт - и пусть канает. Я ему не советчик: как против моей же шахматной программы у меня нет никаких шансов, так и против моего же скрипта.
 
Владимир, Да все мы тут только с Квиком за чем Вы об этом.

И процессами взаимодействия с ним забит форум.

Я же на ветке которая называется Программирование на языке Lua, обращусь к профи за помощью в разборе конкретного примера.
 
Здесь вопрос зачем эта конструкция используется. Если задача - просто собрать данные в таблице всех сделок, то да, конечно, можно это делать через колбек. Но зачем?
Есть таблица. У нее есть размер. Изменился размер - значит там появились новые записи. Пройдись по ним и обработай. И так порциями обрабатывать. По крайней мере я так привык делать, когда надо в реальном времени опрашивать данные с портов. Да, колбек - это красиво, модно и т.д. Но если речь про деньги или про критически важный параметр с датчика, то не ленись, опрашивай его. Надежность решения важнее красоты.

Поэтому - читаете таблицу, хоть всю подряд (но это в момент расход памяти), либо через специальную функцию SearchItems интерфейса qlua. И делайте это в потоке main, тогда это не будет нагружать поток терминала.Например, простой скрипт записи всех сделок в файл, читая первоначальную порцию накопленных данных, делает это очень быстро: 100 тыс. записей пишется за секунду - две.
 
Nikolay, Спасибо что заглянули, думал уже все ушли за криптой.

Да я видел ваши работы в свободном доступе кое чем пользуюсь, за что отдельное спасибо. Ваш smart ZZ просто супер!

А очереди никто не реализует
Цитата
Владимир написал:
Список, стек, очередь - это азбука, букварь, любой профессионал реализует это на полном автопилоте.
Как то перебирать всю таблицу да по нескольким инструментам меня смущает?

Может есть реализация в Ваших работах?
 
Цитата
Как то перебирать всю таблицу да по нескольким инструментам меня смущает?
А что смущает? При старте внутри торговой сессии уже есть накопленные данные. Их надо перебрать (если надо). Для этого будет написан код.
Далее появляются новые записи. Например, через интервал 1 сек., появилось 10-100 записей. Берем и читаем их сразу за один проход, используя тот же, уже написанный, код И это без всяких колбеков.

Также стоит учитывать особенность колбеков qlua - при заказе данных, приедут все записи и на каждую запись будет колбек. Если читать колбеком, то придется обрабатывать построчно - это плохо и медленно.
Проще это сделать за раз. Пришли 50 тыс. записей - прочитать их разом, потратив на это 1 сек., если не меньше.
 
Кажется я понял не прикрутив к рабочему скрипту данные утилиты не возможно судить об их работе.
Нужно что то на ваять.
 
Nikolay,
Цитата
Nikolay написал:
При старте внутри торговой сессии уже есть накопленные данные. Их надо перебрать (если надо). Для этого будет написан код.Далее появляются новые записи. Например, через интервал 1 сек., появилось 10-100 записей. Берем и читаем их сразу за один проход, используя тот же, уже написанный, код И это без всяких колбеков.
Но ведь это очередь.

Да хорошо ушел от колбека. Читаю таблицу можно наверное не писать а через присвоение. А что делать с индексацией?
Первого нужно вести, желательно и подчистить предыдущие данные.

Ну собственно мысль я Вашу уловил. Буду пробовать.
 
Цитата
Но ведь это очередь.

Да хорошо ушел от колбека. Читаю таблицу можно наверное не писать а через присвоение. А что делать с индексацией?
Первого нужно вести, желательно и подчистить предыдущие данные.

Ну собственно мысль я Вашу уловил. Буду пробовать.
Очередь возникнет, если надо передать сообщения между потоками, методами, межпроцессорное взаимодействие и т.д. А если я прямо сейчас, в прямом цикле читаю данных, в том порядке следования, в каком они есть, то зачем мне очередь.
Есть некие служебные расчетные структуры, читаем данные и накапливаем их. Все.

Вот, я когда-то давно писал макет такого скрипта по просьбе - https://github.com/nick-nh/qlua/tree/master/quantScript
 
Очередь не связана с передачей данных потокам или еще куда-нибудь.
-----------------------
Очередь связана лишь с обработкой данных в реальном времени.
------------------------
Реальное время - это время за которое Вы обрабатываете очередную порцию данных.
-----------------
И если Вы не успеваете обработать эту порцию до прихода новой, то возникает очередь.
------------------
Поэтому и имеет значение как быстро Вы можете обрабатывать данные.
===============
И если кто-то говорит что он может обрабатывать тысячи данных, и при этом обрабатывает их по таймеру через 0.5 секунды,
то это значит , что тысячный элемент он обработает лишь через 9 минут ,
следовательно интервал обработки нового значения первого элемента будет не 0.5 сек, а 500 секунд,
так как все элементы будут стоить в очереди.
 
 
Применительно к скриптам в которых ставите в main sleep(500)
либо создаете очередь,
либо пропускаете данные и потом хвалитесь на форуме,
что вы самый лучший алгоритмист, та как Вам на все на...ть.
 
Nikolay, Спасибо.
 
Nikolay, Дым вокруг не видно? :smile:

Нашел;
Код
function rescanBigDeals(sec_code, class_code)

   local all_trades_count = getNumberOf("all_trades")

   local endIndex = LastReadDeals
   local beginIndex = 1

    params = {sec_code=sec_code,class_code=class_code}
    local t1 = SelectItems("all_trades", 1, endIndex, params)
    if t1 ~= nil then
        endIndex = #t1
    else
        endIndex = 0
    end

    --myLog("rescan begin "..tostring(beginIndex).." - "..tostring(endIndex))

    local lastClaster = nil

   for i = beginIndex, endIndex, 1 do

      local at = getItem ("all_trades", t1[i])

        if at ~= nil then

            local datetime = os.time(at.datetime)

            if curDate.day == at.datetime.day or curDate.wday==1 or curDate.wday==7 then

                local value = 0
                --if CountQuntOfDeals == 1 then
                --    value = 1
                --elseif sum_quantity == 0 then
                --    value = at.value
                --else
                    value = at.qty
                --end

                local itsSell = bit.band(at.flags, 0x1) ~= 0
                if dirTradeType == 2 and SecData[at.sec_code]["lastDealPrice"]~=0 and at.price~=SecData[at.sec_code]["lastDealPrice"] then
                    itsSell = at.price<SecData[at.sec_code]["lastDealPrice"]
                end
                SecData[at.sec_code]["lastDealPrice"] = at.price

                --myLog("deal "..at.sec_code.." qnt "..tostring(at.qty).." deal n:"..tostring(at.trade_num).." "..isnil(toYYYYMMDDHHMMSS(at.datetime)))

                if lastClaster == nil then
                    lastClaster = {datetime = at.datetime, mcs = at.datetime.mcs, qty = 0, value = 0, price = 0, isSell = itsSell, sellVol = 0, buyVol = 0} -- time, qty, vol, wvap
                end
                local needNewClaster = false
                if SecData[at.sec_code]["clasterTime"] == 0 and lastClaster["mcs"] ~= at.datetime.mcs then
                    needNewClaster = true
                elseif SecData[at.sec_code]["clasterTime"] ~= 0 
            and ((at.datetime.sec-lastClaster["datetime"].sec+1) > SecData[at.sec_code]["clasterTime"] 
            or lastClaster["datetime"].min ~= at.datetime.min or lastClaster["datetime"].hour ~= at.datetime.hour) then
                    needNewClaster = true
                end

                --myLog("needNewClaster "..tostring(needNewClaster))

                if needNewClaster then
                    if lastClaster["value"]~=0 then
                        lastClaster["price"] = lastClaster["price"]/lastClaster["value"]
                    else
                        lastClaster["price"] = at.price
                    end
                    lastClaster.datetime = at.datetime
                    local clasterQty = lastClaster["qty"]

                    if SecData[at.sec_code]["bigDealSize"]~=0 and clasterQty >= SecData[at.sec_code]["bigDealSize"] then
                        myLog("big deal "..at.sec_code.." qnt "..tostring(clasterQty).." "..isnil(toYYYYMMDDHHMMSS(at.datetime)))
                        if lastClaster["buyVol"]>lastClaster["sellVol"] then
                            lastClaster["isSell"] = false
                        elseif lastClaster["buyVol"]>lastClaster["sellVol"] then
                            lastClaster["isSell"] = true
                        end
                        addBigDealLabel(at.sec_code, lastClaster)
                    end
                    lastClaster = {datetime = at.datetime, mcs = at.datetime.mcs, qty = 0, value = 0, price = 0, isSell = itsSell, sellVol = 0, buyVol = 0} -- time, qty, vol, wvap
                end

                lastClaster["qty"] = lastClaster["qty"] + at.qty
                lastClaster["value"] = lastClaster["value"] + at.value
                lastClaster["price"] = lastClaster["price"] + at.value*at.price
                if itsSell then --sell
                    lastClaster["sellVol"] = lastClaster["sellVol"] + at.qty
                else
                    lastClaster["buyVol"] = lastClaster["buyVol"] + at.qty
                end

                --if lastClaster == nil then
                --    lastClaster = {datetime = at.datetime, mcs = at.datetime.mcs, qty = 0, value = 0, price = 0, isSell = itsSell} -- time, qty, vol, wvap
                --elseif lastClaster["mcs"] ~= at.datetime.mcs then
                --    lastClaster["price"] = lastClaster["price"]/lastClaster["value"]
                --    local clasterQty = lastClaster["qty"]
                --    if SecData[at.sec_code]["bigDealSize"]~=0 and clasterQty >= SecData[at.sec_code]["bigDealSize"] then
                --        myLog("big deal "..at.sec_code.." qnt "..tostring(clasterQty).." deal n:"..tostring(at.trade_num).." "..isnil(toYYYYMMDDHHMMSS(at.datetime)))
                --        addBigDealLabel(at.sec_code, lastClaster)
                --    end
                --    lastClaster = {datetime = at.datetime, mcs = at.datetime.mcs, qty = 0, value = 0, price = 0, isSell = itsSell} -- time, qty, vol, wvap
                --end
                --
                --lastClaster["qty"] = lastClaster["qty"] + at.qty
                --lastClaster["value"] = lastClaster["value"] + at.value
                --lastClaster["price"] = lastClaster["price"] + at.value*at.price

                addTradeStat(at, value, itsSell)
            end
        end
    end

    if SecData[sec_code]["showHourVWAP"] == 1 then
        for k,n in pairs(SecData[sec_code]["h_vwap"]) do
            addPriceLabel(sec_code, n, 3, 0)
        end
    end
    if SecData[sec_code]["showDayVWAP"] == 1 then
        addPriceLabel(sec_code, SecData[sec_code]["vwap"], 5, -2)
    end

    if curDate.wday==1 or curDate.wday==7 then
        updateSecs()
    end

    rescanSec = nil
    rescanning = false
end
Хочу сразу предупредить мои познания в программировании как это что не обидеть себя!
Для меня смысл слова очередь - это очередь в магазине.

Как то очень сложно, про то что я писал видимость и локализацию можно забыть.
1,2,3 Ничего не вижу не знаю!

for i = beginIndex, endIndex, 1 do

    local at = getItem ("all_trades", t1[i])

       if at ~= nil then

           local datetime = os.time(at.datetime)

           if curDate.day == at.datetime.day or curDate.wday==1 or curDate.wday==7 then

Но ведь луа позволяет такие конструкции типа:

local flg = at ~= nil or urDate.day == at.datetime.day or curDate.wday==1 or curDate.wday==7 or false;

Или я опять все не так понял?

 
 
Nikolay,

local endIndex = all_trades_count-1
local beginIndex = firstindex

Начальный и коечный индекс очереди
(в магазине если термин не верный поправите мне более важно говорить на одном языке - понимание )

т. е в такой реализации нужно куда - то  сохранять иначе при обрыве связи или вылете, все с начало?
 
Nikolay, Подскажите пожалуйста dll служит для обмена данными?
 
Цитата
VPM написал:
Nikolay, Подскажите пожалуйста dll служит для обмена данными?
Да, dll для обмена данных. Можно выкинуть.

Что касается чтения, то при обрыве связи не будет сначала, т.к. скрипт же продолжает работать.Он просто будет ждать пока не придет очередная порция после восстановления связи.
А вот если его выключить, упадет Квик, то да, сначала. И в контексте той задачи, для которой он писался - это правильно.

И если хотите обсудить конкретное решение, то лучше для этого использовать ветку Discussions GitHub (правда если есть профиль).
 
Nikolay,
Цитата
Nikolay написал:
И если хотите обсудить конкретное решение, то лучше для этого использовать ветку Discussions GitHub (правда если есть профиль).
Да нет спасибо, мне пока достаточно Вашего примера. Он для меня пока солоноват. Но это только пока :smile: .

Я по этой логике накидал свой шаблон, Но все что было в голове стало на беккрень  :unamused:
Вот код
Код
 
    local is_run;
function OnStop(flag)--вызывается при остановке скрипта из диалога управления
-- 2.2.24 Функция вызывается терминалом QUIK при остановке скрипта из диалога управления.

   is_run = false
   return 1000
end
function OnClose()--Функция вызывается перед закрытием терминала QUIK и при выгрузке файла qlua.dll. 
is_run = false
end
--function OnInit() -- вызывается терминалом QUIK перед вызовом функции main (2.2.25 OnInit)
--end
--local class,symbol;
function main()-- Функция, реализет основной поток выполнения в скрипте.(2.2.26 main) 
    
   
   
   is_run = true;
   
   --local list=List.new();
    -- message('0 '..'first='..tostring(list.first)..'; '..'last='..tostring(list.last) )
   --local AT=allt:new();
      class= "SPBFUT";
       symbol='RMU3'--NGN3';
      
       -----------all_trades
      --Если перечисленные параметры отсутствуют в списке полей элемента, то в качестве параметра передается nil. 
        
      function fn(par1,par2)
          if par1 == class and par2 == symbol then
                 return true
          else
              return false
          end
      end
      local t1 = nil;
      --[[---- возвращает таблицу с индексами элементов, удовлетворяющих условию поиска
      t1 = SearchItems("all_trades", 0, getNumberOf("all_trades")-1, fn, "class_code, sec_code")

       local at=nil;
      --local number_of_rows = getNumberOf('all_trades')   
      local first,last=1,#t1;
        for i = 1, #t1 do
             at = getItem('all_trades', i)
          if at --and at.sec_code==symbol 
          then
             List.pushlast(list, at);
             --AllTrade();
             List.popfirst(list);
          end
      end   
      --]]
      local first=0;
      local at = nil;
      --message('1 '..'first='..tostring(list.first)..'; '..'last='..tostring(list.last) )
       ----
       local j=1;
   while is_run do ----- основной поток выполнения скриптa:
   
      local last=getNumberOf("all_trades"); 
      message(j..' '..'first='..tostring(first)..'; '..'last='..tostring(last) )
      if last>first then
      
        ---- возвращает таблицу с индексами элементов, удовлетворяющих условию поиска При возникновении ошибки в функции fn функция SearchItems прерывает свою работу и возвращает «nil». 
        t1 = SearchItems("all_trades", first, getNumberOf("all_trades")-1, fn, "class_code, sec_code")
        if t1 then
        
         message(j..'): '..'first='..tostring(first)..'; last='..tostring(last)..'; #t1='..tostring(#t1) ..'; t1[1]='..tostring(t1[1])..'; t1[#t1]='..tostring(t1[#t1]))
            at = {};
         for i = t1[1], t1[#t1] do
         
             if not is_run then break end
          
          at = getItem('all_trades', i)
          --if at and at.sec_code==symbol then
          --List.pushlast(list, at);
          --AllTrade();
          --List.popfirst(list);
          --end
         
          local d = at and get_date(at.datetime) or 0;
          local t = at and get_time(at.datetime) or 0;
          local sec = at and at.sec_code or 'x';
          local p = at and at.price or 0;
          local q = at and at.qty or 0;
          
          local dir = (at and bit.test(at.flags,0) and -1 or 1) or 0; 
          
          --if bit.test(at.flags, 0) then ---- Если сделка на продажу, вычитает объем из текущего 
             --   dir=-1;
           --else -- Если сделка на покупку, прибавляет объем к текущему
             --   dir=1; 
           --end
          
          message(j..'): ('..i..'); '..tostring(d)..'; '..tostring(t)..'; '..tostring(sec)..'; '.. tostring(p)..'; '..tostring(q*dir)..'; '..tostring(dir) );
          
          end
          first=getNumberOf("all_trades");--last;--t1[#t1];
        end
      end
      j=j+1;
        --message(j..' '..'first='..tostring(first)..' list.first='..tostring(list.first)..'; '..'list.last='..tostring(list.last) )
      sleep(1000);
      
   end
end
Скрытый текст

Не получилось вставить,
Но ошибка в этом исполнении не фильтрует по class_code, sec_code.
Что делаю не так?
 
Индекс RTS упал, фьючерс на индекс упал, портфель мой чудесны образом растет. Стою в Long.
Чудеса да и только. Видимо наступило время нам поддержать отечественную экономику. :lol:  
 
Да а экономика та, рублем да по голове. "Кто не спрятался я не виновата"  :what:  
 
Да в таком подходе с памятью "шик блеск красота",  тянет все доступные тикеры.

Хотя в таблице индексов должны быть отобранные индексы по sec_code.
Сходу не получилось добавлю логи.
Страницы: 1 2 3 4 5 ... 26 След.
Читают тему
Наверх