Nikolay написал: И если хотите обсудить конкретное решение, то лучше для этого использовать ветку Discussions GitHub (правда если есть профиль).
Да нет спасибо, мне пока достаточно Вашего примера. Он для меня пока солоноват. Но это только пока .
Я по этой логике накидал свой шаблон, Но все что было в голове стало на беккрень Вот код
Код
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. Что делаю не так?
В чём преимущество OnInit
Пользователь
Сообщений: Регистрация: 15.06.2023
05.07.2023 21:16:51
Владимир, Да это вы правы Опыт необходим, но ведь если не учить не подсказывать, то и опыт будет соответствующий.
Я в данном случае не о себе, о молодежи. У меня все в порядке с наставниками всегда везло, и вспоминаю их с огромной благодарностью!
Да и зарегистрировался на форуме чтоб исправили ошибку в стакане. Вроде нашли!
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
05.07.2023 20:45:33
Nikolay, Подскажите пожалуйста dll служит для обмена данными?
Очереди и двойные очереди в луа, Пример из книги Р.Е.
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;
Или я опять все не так понял?
В чём преимущество OnInit
Пользователь
Сообщений: Регистрация: 15.06.2023
05.07.2023 18:04:28
Цитата
Владимир написал: Уровень подавляющего большинства посетителей форума близок к абсолютному нулю, а туде же - потоки им подавай. НА ХРЕНА ОНИ ВАМ?! С переменными та же хрень: мой скрипт может обслуживать несколько тысяч тикеров, так что переменных там, возможно, миллион - и нет проблем. Вы СВОИ задачи решайте, торговые, а не занимайтесь разной хернёй с потоками,, коллбеками, библиотеками и прочим онанизмом.
Целиком поддерживаю Вас. Не от хорошей жизни колупаемся в носу и лезем не туда. Так поделитесь опытом.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Nikolay написал: При старте внутри торговой сессии уже есть накопленные данные. Их надо перебрать (если надо). Для этого будет написан код.Далее появляются новые записи. Например, через интервал 1 сек., появилось 10-100 записей. Берем и читаем их сразу за один проход, используя тот же, уже написанный, код И это без всяких колбеков.
Но ведь это очередь.
Да хорошо ушел от колбека. Читаю таблицу можно наверное не писать а через присвоение. А что делать с индексацией? Первого нужно вести, желательно и подчистить предыдущие данные.
Ну собственно мысль я Вашу уловил. Буду пробовать.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
05.07.2023 17:06:42
Кажется я понял не прикрутив к рабочему скрипту данные утилиты не возможно судить об их работе. Нужно что то на ваять.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
05.07.2023 16:49:43
Nikolay, Спасибо что заглянули, думал уже все ушли за криптой.
Да я видел ваши работы в свободном доступе кое чем пользуюсь, за что отдельное спасибо. Ваш smart ZZ просто супер!
А очереди никто не реализует
Цитата
Владимир написал: Список, стек, очередь - это азбука, букварь, любой профессионал реализует это на полном автопилоте.
Как то перебирать всю таблицу да по нескольким инструментам меня смущает?
Может есть реализация в Ваших работах?
В чём преимущество OnInit
Пользователь
Сообщений: Регистрация: 15.06.2023
05.07.2023 16:27:30
Ziveleos, Мне не нужен это просто пример, что можно писать другие переменные.
суть другая переменная local path; локализуется в body а присвоение идет в OnInit я так делаю когда переменных >200, если меньше лучше делать как описал Владимир.
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
Ну вот пример от автора луа list[first] = nil -- чтобы разрешить сборку мусора
local path=nil;
В чём преимущество OnInit
Пользователь
Сообщений: Регистрация: 15.06.2023
05.07.2023 16:04:39
Nikolay, Вот это правильно! К этому Вопросу Может глянете мою веточку что то посоветуете.
В чём преимущество OnInit
Пользователь
Сообщений: Регистрация: 15.06.2023
05.07.2023 15:48:52
Цитата
Nikolay написал: Как и в предыдущей структуре скрипта Lua, после его запуска первоначально выполняются сценарии, описанные в , если они присутствуют. Далее происходит вызов обработчика с именем OnInit(), если он присутствует. В обработчике OnInit() пользователь имеет возможность инициализировать все необходимые переменные и библиотеки перед запуском отдельного потока. После завершения функции OnInit() происходит создание отдельного потока РМ QUIK, и в этом потоке начинает выполнение функция main(), которая обязательно должна присутствовать в скрипт
Владимир, Все равно не понятно, вот документация. будет OnInit() или не будет. Из body будет брать и обрабатывать. Так устроен луа, а qlua не приделах. Я думаю это больше к вопросу с видимостью в самом луа.
Nikolay написал: Речь же про колбеки звучит странно, т.к. я слабо себе представляю использование колбеков в алгоритме, если они не обработаны все. Например, запуск в середине торгового дня. Половина колбеков уже прошла, надо читать прошедшие события из таблиц, и здесь уже не важно как инициализировать. Поэтому колбеки - это вспомогательный инструмент, не более. "Прибивать гвоздями" их к логике - не самая лучшая затея. Он может и не прийти, в конечном итоге. Гарантированной доставки в документации не декларируется.
Просто из собственного опыта при запуске от колбека пришло а основной цикл еще не запущен. Прошедшие события читаю и из таблиц перед за основного цикла, после запуска беру из колбека. А какие еще варианты обработать т. всех сделок?
В Чистом луа прогоняю свою писанину на ошибки луа, остальное на совести qlua. Это просто мой подход к экономии времени.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
05.07.2023 12:12:02
Владимир, То что вы реализовали свои идеи средствами луа это просто здорово тут и комментарии не нужны.
Я к примеру не очень доволен своей аналитикой, постоянно что кручу верчу, проверяю идеи.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
05.07.2023 11:46:28
Владимир, Ну конечно брокер, именно он выводит наши заявки на биржу. А выводить или не выводить это его проблема. Вы видимо имеете в виду форексные дома или это про Т+2? Ну акции не просто вывести а переместить их на депозитарий.
Я о другом котировки, объем, открытый интерес и много чего а главное Параметры RM Quik - это биржа именно ее алгоритмы.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
05.07.2023 09:14:20
nikolz, Даже слова не знакомы. По существу темы есть мысли.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
05.07.2023 09:12:21
nikolz, Я начинаю повесть именно от туда откуда взят код. Хоть 100 лет. Какое это отношение имеет к коду.
Я уже молчу когда мой первый код был написан, а про железо лучше не вспоминать.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Системная математика видимо имеется в виду QUIK, но основную лепту вносит биржа. ARQA Technologies декларирует что дают то и передаем.
Согласен с Вами реализация мягко говоря не "кудышняя", одно пустое обновление версий чего стоит (windows уже отстал). Но QUIK старая система писалась еще для сибирской биржи, вот и латают как могут.
Язык бессмысленно ругать другого нет. Я люблю луа - чтоб делал без него (Qpile).
Какие из торговых алгоритмов применять дело индивидуальное. Я люблю солянку.
Событие не включать имеет мин. риск.
Но мы ведь обсуждаем Вкл. Чтоб сделку совершил, вел ее по установленным правилам RM MM и желательно закрыл в +. Да еще при всем этом желательно чтоб терминал не падал
Ну а если серьезно посмотрите TradingVieW современная более серьезная разработка со своим языком, да и профи привлекают. Правда брокер на ММВБ один Алор.
с уважением, VPM
В чём преимущество OnInit
Пользователь
Сообщений: Регистрация: 15.06.2023
04.07.2023 23:07:10
Да пока вел беседы CNYRUBF нарисовал границы по CNYRUB.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Для того чтоб слово "Робот" звучало гордо мало одного алгоритма на стек или очередь.
Как минимум нужен RM? управление позицией (MM), сама торговая система (TS) с рядом включенных стратеги и много еще всего. Вы это лучше меня знаете. Одно установления тренда с мин. отставанием чего стоит, молчу уже про применение в стратегии.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
04.07.2023 22:43:09
Владимир, Мне думается зря вы, ведь есть round, средние, да чего только не публикуется.
Я зарегистрировался недавно, а пользуюсь давно беру примеры.
За что ребятам пользуясь моментом хочу сказать огромное Спасибо!
Ругаются когда видимо мешаем им зарабатывать их профессией, но это нормально. Алгоритм кому помешал его еще нужно прикрутить.
Да и публикуется бесплатные Боты, тестеры индикаторы тот же алгоритм.
История с серебром это хорошо описанная история в экономике, когда один фонд завладел рынком серебра. Вы как программист прекрасно понимаете каких средств и алгоритмов требуется чтоб держать рынок одной бумаги.
Посмотрите договор ММ на ММИБ.
Но мы сильно отошли от темы. Если есть желание давайте отдельный топик заведем. Под названием торговые алгоритмы или еще чего.
Может кто со знатоков Lua посмотрит и протестирует данный функционал.
Хотелось бы универсальные алгоритмы реализации методов получить! Подчеркиваю никто из нас не является конкурентом друг другу.
В чём преимущество OnInit
Пользователь
Сообщений: Регистрация: 15.06.2023
04.07.2023 20:50:12
Это да.
В трейдинге нет единого алгоритма по которому Все работают.
И ведь вопрос очень примитивен, даже для меня - это азы. Если можем помочь почему бы нет.
Я уже Вам писал в другом п. никто здесь является мне или Вам соперником в торговле.
Вы прекрасно знаете что ММ и Банки торгуют абсолютно др. алгоритмы. Ну к примеру ММ видит обе стороны сделок и одновременно с обоих торгует.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
04.07.2023 20:37:40
Чтоб двинуть цену нужны Капиталы! Чтоб двинуть цену нужном направлении нужно понимание, и это не закрытые форумы. Пример тому хорошо освещенная история в трайдинге по серебру.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
04.07.2023 20:30:18
Владимир, к стати как Вы вставляете чтоб именно отвечать Вам.
Я просмотрел Ваши посты, более того мне нравится Ваш подход.
Но давайте говорить на одном языке.
Я установил КВИК не для программирования и Вы тоже.
Мы торгуем! Что будет если не понимать азов трейдинга?
Пример, если Всех участников этого форума просуммировать наш капитал, и открыть 1 сделку, на все. Что будет с этой сделкой?
Ответ очевиден. Это бизнес. Но не Ваш и не мой.
В чём преимущество OnInit
Пользователь
Сообщений: Регистрация: 15.06.2023
04.07.2023 20:06:47
Уважаемый , мы тут чуть отошли от темы.
На Ваш вопрос - В чём преимущество? Хотел сделать поправку на пост. Если скрипт небольшой, не требует особого быстродействия, не затратен по памяти. Вас все устраивает - То ни каких.
Если хотите оптимизировать Вас скрипт посмотрите "Програмирование на Lua" сэкономит много времени. Проверено!
С уважением VPM
В чём преимущество OnInit
Пользователь
Сообщений: Регистрация: 15.06.2023
04.07.2023 19:38:44
Я не обсуждаю язык, бессмысленно другого нет. Я лишь прислушиваюсь к рекомендациям авторов. Проверить видимость легко, быстродействие скрипта легко с локальными и глобальными. SciTe одно нажатие.
А вот со сбором мусора сложней. Оказывается nil запускает сборщик.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
04.07.2023 19:26:21
Владимир, так я и обращаюсь к профи, с вопросом как правильно организовать в луа; Список, стек, очередь.
Мне тяжело судить какай язык или РЕ, у меня нет подобных знаний. Пользуемся что есть, хотя мне нравится луа, интуитивно понятен.
Таблица Всех сделок отражает кто сделку организовал, больше взять негде - это собственно "Лента". А Также Количество в сделке. Баланс я имел ввиду именно Количество контрактов в сделках по направлению сделки. А так же отслеживаю крупных игроков ну и другие римочки VSA SmartM.
В чём преимущество OnInit
Пользователь
Сообщений: Регистрация: 15.06.2023
04.07.2023 19:00:30
Я смотрел Ваши посты Как понимаю у Вас свой подход вы не пользуетесь историей данных. А локализация в луа нужна чтоб не засорять для видимости и быстродействия.
Ну вы это сами лучше меня знаете.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
04.07.2023 18:52:46
Затраты памяти идут на высоко ликвидных к примеру фьючерс на NG нагружает, на RTS норм. OnAllTrade я баланс считаю.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
04.07.2023 18:47:01
"Поскольку Lua использует для представления чисел двойную точность, ваша программа можем выполняться на протяжении двухсот лет, "
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
04.07.2023 18:45:21
Владимир, Я это более менее понимаю.
Но по утверждению РЕ это
"Более эффективная реализация использует две индекса, один для первого элемента и один для последнего:"
Я это и опробовал. Здесь нет стандартной библиотеки.
Реализация похожа на Ваш стек, только использует два индекса. Я так понимаю именно для быстрого доступа и спереди и сзади.
Приведен весь код.
В чём преимущество OnInit
Пользователь
Сообщений: Регистрация: 15.06.2023
04.07.2023 18:30:04
, так я с Вами не спорю, где угодно!
Вопрос в организации переменных Вашего скрипта их локализации и видимости.
К примеру, "перед запуском основного потока main" всего 200 локальных переменных я постоянно выхожу за это число. Если как у Космонавта то сам lua ругается порой.
Сервис!
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
04.07.2023 15:52:54
Забыл сказать что получаю в колбеке обработка Main(). И сколько прилетит в колбек неизвестно даже МаркетМейкеру. Отсюда и разница в расходе памяти. один ликвидный другой не очень.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
04.07.2023 15:39:25
В примере приведены функции для организации Любого метода: LIFO или FIFO. В этом то собственно и вопрос в правильной организации обоих методов.
Да то что вы описываете я видел к Примеру понравилась реализация OnTrade() от Владимира, лаконично просто шикарно.
В моем же примере обработка не с последнего элемента а сначала сохранённого, ну собственно Вы сами об этом пишите.
В чём преимущество OnInit
Пользователь
Сообщений: Регистрация: 15.06.2023
04.07.2023 15:08:50
В чём преимущество? Так его и нет.
Вопрос в организации переменных Вашего скрипта их локализации и видимости.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
04.07.2023 14:46:35
Всем Добрый день!
Уж коль тема называется , обращусь к профи за пояснениями.
Взят Пример из книги Р.Е.
------ Очереди и двойные очереди
"Простейшим способом реализации очередей в 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 использует для представления чисел двойную точность, ваша программа можем выполняться на протяжении двухсот лет, делая по миллиону вставок в секунду, прежде чем возникнет проблема с переполнением.
Получаю, сохраняю 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
Все инструмента нормально для обработки одного инструмента, но в процессе работы скрипт накапливает память.
Вопрос к Профи, как нужно сделать чтоб максимально быстро обрабатывалась и очищалась очередь? Кто то может пример показать.
В чём преимущество OnInit
Пользователь
Сообщений: Регистрация: 15.06.2023
04.07.2023 13:31:33
написал: инициализирую переменные до начала main как то так:
это нормально если ваши переменные не лезут в терминал или к серверу до запуска mail()
В чём преимущество OnInit
Пользователь
Сообщений: Регистрация: 15.06.2023
04.07.2023 13:20:46
Владимир,
зря ругаете, функция необходима и ключевое здесь OnInit(STRING script_path) В данной функции пользователь имеет возможность инициализировать все необходимые переменные и библиотеки перед запуском основного потока main().
К примеру если обрабатываете колбек OnAllTrade() без нее и не обойтись.
Новые проблемы на все тоже quik, После обновления quik до версии 10. и выше перестал работать торговый сервис в таблице котировок (стакан)
Пользователь
Сообщений: Регистрация: 15.06.2023
30.06.2023 10:03:43
vladindre, Ок принято, спасибо.
Новые проблемы на все тоже quik, После обновления quik до версии 10. и выше перестал работать торговый сервис в таблице котировок (стакан)
Пользователь
Сообщений: Регистрация: 15.06.2023
28.06.2023 18:59:42
Добрый день
отправил Вам в почту.
Новые проблемы на все тоже quik, После обновления quik до версии 10. и выше перестал работать торговый сервис в таблице котировок (стакан)
Пользователь
Сообщений: Регистрация: 15.06.2023
26.06.2023 17:19:48
Андрей1
Нужно Вам убрать галочку. Редактировать графики, Диаграмма. Самая нижняя оставлять линии.
Новые проблемы на все тоже quik, После обновления quik до версии 10. и выше перестал работать торговый сервис в таблице котировок (стакан)
Пользователь
Сообщений: Регистрация: 15.06.2023
26.06.2023 12:51:38
Добрый день! Это давняя проблема! Более точно с версии 7,8,9,10. При аварийном обрыве соединения с сервером и последующим восстановлении. Скриншоты не сохранял. Да нужны ли они? см. арифметику в каком то режиме не сбрасывает в 0.