function qsc.all_trades(msg) local sec_code1 = msg.data local count1 = getNumberOf("all_trades") local depo_limits1 = {} for i = 1, count1-1,1 do local depo_limit2 = getItem("all_trades", i) if msg.data == "" or depo_limit2.sec_code == sec_code1 and depo_limit2.datetime.hour >= 10 then table.insert(depo_limits1, depo_limit2) end end msg.data = depo_limits1 -- depo_limit2 =0 return msg end ========================= Написал такой код по образцам, он работает но очень долго
занимает от 1-мин до 10 000 скажи пожалуйста , как можно быстро получить всю таблицу обезличенных сделок не через Цикл , а весь массив уже распарсить на шарпе, как передать байты или Сразу все таблицу
например есть qscalp , у него занимает это 10 сек, как такое вообще сделать можно ? поясните пожалуйста
Пользователь
Сообщений: Регистрация: 25.09.2020
12.10.2020 11:45:18
Костя, Ну так забирайте в цикле данные от getItem в свою таблицу, и больше ничего не делайте. Насколько я могу судить по коду, тормозит именно table.insert.
Пользователь
Сообщений: Регистрация: 30.01.2015
12.10.2020 11:48:53
Уточните, Вы пишите скрипт или индикатор.
Пользователь
Сообщений: Регистрация: 23.01.2015
12.10.2020 11:49:19
Попробуйте SearchItems
Пользователь
Сообщений: Регистрация: 27.01.2017
12.10.2020 11:54:58
Используйте функцию SearchItems, чтобы не получать данные по каждой строке. Это даст уже фильтрованный массив индексов строк по нужному инструменту.
Далее, не надо использовать table.insert. Если необходимо просто увеличивать массив, то быстрее будет сделать как t[#t+1] = value.
Так Вы просто добавляете в конец массива новый элемент.
Пользователь
Сообщений: Регистрация: 30.01.2015
12.10.2020 12:17:33
для скрипта надо делать две части первая часть исполняется один раз и читает данные из архива квика вторая часть работает в колбеке
Пользователь
Сообщений: Регистрация: 30.01.2015
12.10.2020 12:38:27
на основе вашей функции, можно сделать примерно так: ------------------------------- function qsc.all_trades(msg) if msg.data==nil then msg.data={} end local i=#msg.data; local count = getNumberOf("all_trades"); while count>i do i=i+1; local depo_limit2 = getItem("all_trades",i) if msg.data == "" or depo_limit2.sec_code == sec_code1 and depo_limit2.datetime.hour >= 10 then msg.data[i]= depo_limit2; end end return msg end
Пользователь
Сообщений: Регистрация: 12.10.2020
12.10.2020 13:11:41
Цитата
Nikolay написал: Используйте функцию SearchItems, чтобы не получать данные по каждой строке. Это даст уже фильтрованный массив индексов строк по нужному инструменту.
Далее, не надо использовать table.insert. Если необходимо просто увеличивать массив, то быстрее будет сделать как t[#t+1] = value.
Так Вы просто добавляете в конец массива новый элемент.
Можите показать на пример как это сделать, мой проект на си Шарп , библитека что пользуюсь quikLua кэлбеком с шарпа я подаю инструмент , что мне нужен
и он , добавляет в таблицу, строки, по одной , формирует таблицу и отправляет ,мне в шарп "return msg" а как воспользоваться тем чтобы, мгновенно получить таблицу, минус один индекс текущего тика , вот это я не понимаю SearchItems
сработало исключение @"Lua error: qsfunctions.lua:605: attempt to index a string value (field 'data')"
Пользователь
Сообщений: Регистрация: 12.10.2020
12.10.2020 14:14:47
А это c# метод который получает уже таблицу с луа , думаю теперь понятна мое желание ВАм *
SecCODe -ЭТО НАЗВАНИЕ инструмента
Пользователь
Сообщений: Регистрация: 27.01.2017
12.10.2020 18:51:14
Чтобы что-то ответить надо смотреть в исходники этой библиотеки. Не факт, что она поддерживает все глобальное окружение qlua.
Пользователь
Сообщений: Регистрация: 12.10.2020
12.10.2020 18:57:52
Цитата
Nikolay написал: Чтобы что-то ответить надо смотреть в исходники этой библиотеки. Не факт, что она поддерживает все глобальное окружение qlua.
Если Вам не сложно, можете показать пример с "Используйте функцию SearchItems, чтобы не получать данные по каждой строке. Это даст уже фильтрованный массив индексов строк по нужному инструменту." передать в шарп , любой массив, главное его получить, а как это сделать без цикла на луа я не понимаю , так как у нас есть препоследний элемент, и нам надо от первого пройтись по всем элементам , как по другому то?
Пользователь
Сообщений: Регистрация: 12.10.2020
13.10.2020 10:56:21
Так никто не и не поможет ? жаль придется тратить время на решении .задачи которую решает каждый алготрейдер , не хотите вы упростить нам жизнь=(
Пользователь
Сообщений: Регистрация: 27.01.2017
13.10.2020 11:11:15
Ну вот Вам пример.Их уже столько на просторах:
Код
---@param class_code string
---@param sec_code string
local function FilterTableLine(class_code, sec_code)
return class_code == Params.CLASS_CODE and
sec_code == Params.SEC_CODE
end
local t1 = SearchItems("all_trades", 0, getNumberOf("all_trades")-1, FilterTableLine, 'class_code,sec_code')
if t1 then
for i = 1, #t1 do
local trade = getItem("all_trades", t1[i])
if trade then
--- Сделать что-то
end
end
end
сработало исключение @"Lua error: qsfunctions.lua:605: attempt to index a string value (field 'data')"
покажите как вы определили msg которое передаете в вашу функцию.
Пользователь
Сообщений: Регистрация: 30.01.2015
13.10.2020 11:19:51
исправьте так: ------------------------------- function qsc.all_trades(msg) if type(msg.data)~="table" then msg.data={} end local i=#msg.data; local count = getNumberOf("all_trades"); while count>i do i=i+1; local depo_limit2 = getItem("all_trades",i) if msg.data == "" or depo_limit2.sec_code == sec_code1 and depo_limit2.datetime.hour >= 10 then msg.data[i]= depo_limit2; end end return msg end
Пользователь
Сообщений: Регистрация: 12.10.2020
13.10.2020 11:26:09
Цитата
nikolz написал: исправьте так: ------------------------------- function qsc.all_trades(msg) if type(msg.data)~="table" then msg.data={} end local i=#msg.data; local count = getNumberOf("all_trades"); while count>i do i=i+1; local depo_limit2 = getItem("all_trades",i) if msg.data == "" or depo_limit2.sec_code == sec_code1 and depo_limit2.datetime.hour >= 10 then msg.data= depo_limit2; end end return msg end
Благодарю за это, но это тоже медленно работает , буду SearchItems пробовать ...
написал: исправьте так: ------------------------------- function qsc.all_trades(msg) if type(msg.data)~="table" then msg.data={} end local i=#msg.data; local count = getNumberOf("all_trades"); while count>i do i=i+1; local depo_limit2 = getItem("all_trades",i) if msg.data == "" or depo_limit2.sec_code == sec_code1 and depo_limit2.datetime.hour >= 10 then msg.data = depo_limit2; end end return msg end
Благодарю за это, но это тоже медленно работает , буду SearchItems пробовать ...
Напишите для начала сколько времени у вас исполняется ваше решение и сколько это. -------------- В этом решении все существующие данные загрузятся один раз а не каждый цикл. Если новых данных нет, то время не тратится. --------------------- Поясняю на примере. Пусть в архиве 10000 данных. В вашем решении на каждом цикле будете читать в таблицу 10000 данных В моем это чтение будет лишь один раз. После поступление нового значение у Вас опять будет читаться все 10001 значение а в моем только 1. ------------------- Итак какие результаты у вас получились?
Пользователь
Сообщений: Регистрация: 27.01.2017
13.10.2020 15:00:33
Так, естественно, надо всегда запоминать последний прочитанный индекс. Какой смысл читать повторно, если один раз уже прочитал.
Пользователь
Сообщений: Регистрация: 21.02.2015
13.10.2020 18:05:26
Цитата
Костя написал: function qsc.all_trades(msg) local sec_code1 = msg.data local count1 = getNumberOf("all_trades") local depo_limits1 = {} for i = 1, count1-1,1 do local depo_limit2 = getItem("all_trades", i) if msg.data == "" or depo_limit2.sec_code == sec_code1 and depo_limit2.datetime.hour >= 10 then table.insert(depo_limits1, depo_limit2) end end msg.data = depo_limits1 -- depo_limit2 =0 return msg end ========================= Написал такой код по образцам, он работает но очень долго
занимает от 1-мин до 10 000 скажи пожалуйста , как можно быстро получить всю таблицу обезличенных сделок не через Цикл , а весь массив уже распарсить на шарпе, как передать байты или Сразу все таблицу
например есть qscalp , у него занимает это 10 сек, как такое вообще сделать можно ? поясните пожалуйста
1. Qscalp - сделан на луа апи 2. Передача идет через FileMapping 3. Зачем создавать отдельную таблицы? Надо просто отослать строку в шарп. А лучше передавать всю таблицу в шарп, так быстрее получится. Время передачи до 2 мин., когда (> 1 млн записей) SearchItems - костыль и вам скорее не поможет, потому что вы не правильно данные отправляете.
Пользователь
Сообщений: Регистрация: 30.01.2015
13.10.2020 19:08:36
Все смешалось - кони,люди
Зачем нагородили кашу из луа и шарпа?
Все делается без шарпов на луа без проблем. -------------------------------------------------------------------------------------- Мы не ищем легких путей. Создадим себе трудности, чтобы потом искать того, кто их преодолеет для нас..
Пользователь
Сообщений: Регистрация: 21.02.2015
14.10.2020 09:46:33
Костя,Можно воспользоваться CreateDataSource и создать тиковый график. Там есть ограничения на данные, но как вариант решения проблемы.
Все делается без шарпов на луа без проблем. -------------------------------------------------------------------------------------- Мы не ищем легких путей. Создадим себе трудности, чтобы потом искать того, кто их преодолеет для нас..
Почитал про луа знак решетка получает длинну массива,
# получить длину строки ================ объясни мне какую он должен получить длину массива из msg с чего вы взяли что я отправляю массив с размером 2 млн ? то что вы написали , вообще никак не хочет работать , я уже из шарпа отправляю кэлбек с типом object
и результат приходит такой {[]}
function qsc.all_trades(msg) if type(msg.data)~="table" then msg.data={} end local i=#msg.data; = .. если не сложно поясните эту строку. что я должен отправить из c# ,чтобы получить local i= с длинной массива local count = getNumberOf("all_trades"); while count>i do i=i+1; local depo_limit2 = getItem("all_trades",i) if msg.data == "" or depo_limit2.sec_code == sec_code1 and depo_limit2.datetime.hour >= 10 then msg.data = depo_limit2; end end return msg end
Все делается без шарпов на луа без проблем. -------------------------------------------------------------------------------------- Мы не ищем легких путей. Создадим себе трудности, чтобы потом искать того, кто их преодолеет для нас..
Все делается без шарпов на луа без проблем. -------------------------------------------------------------------------------------- Мы не ищем легких путей. Создадим себе трудности, чтобы потом искать того, кто их преодолеет для нас..
В ОБЩЕМ проблема не решена
Квиж жутко тормозит и набиваем массив
Освойте сначала луа а потом пишите на шарпе нет желания разбираться с вашей кашей.
Все делается без шарпов на луа без проблем. -------------------------------------------------------------------------------------- Мы не ищем легких путей. Создадим себе трудности, чтобы потом искать того, кто их преодолеет для нас..
В ОБЩЕМ проблема не решена
Квиж жутко тормозит и набиваем массив
Освойте сначала луа а потом пишите на шарпе нет желания разбираться с вашей кашей.
где же каша ,вы в пару строк кода не можете разобраться поясняю
function qsfunctions.all_trades(msg) - // принимаю мессендж в нем название котировки local инструмент = msg.data .// инструмент =равен .например brx0 local count = getNumberOf("all_trades") // кол- во значений в таблице local t = {} -создаю массив for i = 1, count-1,1 do trades = getItem("all_trades", i) // получаю строку из таблицы all_trades if msg.data == "" or trades.sec_code == инструмент and trades.datetime.hour >= 10 then t[#t+1] = trades // заношу ее в массив end end msg.data = t //как только массив из all_trades заполнен // отправляю его в шарп. t = {} // очищаю массив return msg end =================== вернемся к моему вопросу, как мгновенно получить сразу таблицу обезличных сделок ?
Все делается без шарпов на луа без проблем. -------------------------------------------------------------------------------------- Мы не ищем легких путей. Создадим себе трудности, чтобы потом искать того, кто их преодолеет для нас..
В ОБЩЕМ проблема не решена
Квиж жутко тормозит и набиваем массив
Освойте сначала луа а потом пишите на шарпе нет желания разбираться с вашей кашей.
где же каша ,вы в пару строк кода не можете разобраться поясняю
function qsfunctions.all_trades(msg) - // принимаю мессендж в нем название котировки local инструмент = msg.data .// инструмент =равен .например brx0 local count = getNumberOf("all_trades") // кол- во значений в таблице local t = {} -создаю массив for i = 1, count-1,1 do trades = getItem("all_trades", i) // получаю строку из таблицы all_trades if msg.data == "" or trades.sec_code == инструмент and trades.datetime.hour >= 10 then t[#t+1] = trades // заношу ее в массив end end msg.data = t //как только массив из all_trades заполнен // отправляю его в шарп. t = {} // очищаю массив return msg end =================== вернемся к моему вопросу, как мгновенно получить сразу таблицу обезличных сделок ?
В вашем случае никак. Передавайте записи в шарп, а не добавляйте его в отдельную таблицу. На это уходит лишнее время.
Пользователь
Сообщений: Регистрация: 21.02.2015
15.10.2020 20:46:10
Можно воспользоваться корутинами, но навряд ли увеличит скорость.
Пользователь
Сообщений: Регистрация: 25.09.2020
15.10.2020 21:00:26
Сроду не интересовали (и не заинтересуют) обезличенные сделки, но нажав тупо в Квике на эту таблицу (СПб), получил её примерно секунд за 10 (с прорисовкой!) Там на данный момент 563877 строк... ой, уже 563880 - таблица регулярно обновляется, и это время УЖ НИКАК не может быть больше, чем получение таблицы программным способом!
Пользователь
Сообщений: Регистрация: 12.10.2020
15.10.2020 21:49:11
Цитата
Владимир написал: Сроду не интересовали (и не заинтересуют) обезличенные сделки, но нажав тупо в Квике на эту таблицу (СПб), получил её примерно секунд за 10 (с прорисовкой!) Там на данный момент 563877 строк... ой, уже 563880 - таблица регулярно обновляется, и это время УЖ НИКАК не может быть больше, чем получение таблицы программным способом!
прежде чем глупости писать попробуйте просто на том же луа.создать текстовый файл и добавить все таблицу...
Пользователь
Сообщений: Регистрация: 25.09.2020
15.10.2020 21:52:25
Костя, Да я и пробовать не хочу! Получение массива БЕЗ прорисовки на экране НА ПОРЯДОК быстрее, чем без прорисовки! Если не на два.
Пользователь
Сообщений: Регистрация: 25.09.2020
15.10.2020 22:05:08
Костя, Ну, попробовал. Секунды три всё удовольствие. 21 метр результирующий файл. Что получить-то надо?
Код
function main()
local i,j,k;
k=getNumberOf("all_trades")
F=io.open(getScriptPath().."//qq","w");
for i=0, k-1 do
j=getItem("all_trades", i)
F:write(tostring(j).."\n");
end
F:close();
end;
Пользователь
Сообщений: Регистрация: 01.07.2020
15.10.2020 22:08:17
Цитата
Костя написал: function qsfunctions.all_trades(msg) - // принимаю мессендж в нем название котировки local инструмент = msg.data .// инструмент =равен .например brx0 local count = getNumberOf("all_trades") // кол- во значений в таблице local t = {} -создаю массив for i = 1, count-1,1 do trades = getItem("all_trades", i) // получаю строку из таблицы all_trades if msg.data == "" or trades.sec_code == инструмент and trades.datetime.hour >= 10 then t[#t+1] = trades // заношу ее в массив end end msg.data = t //как только массив из all_trades заполнен // отправляю его в шарп. t = {} // очищаю массив return msgend===================вернемся к моему вопросу, как мгновенно получить сразу таблицу обезличных сделок ?
Эта функция работает быстро - полсекунды на 25000 записей в Юниоре. Проблема в возврате ее в Квикшарп.
Пользователь
Сообщений: Регистрация: 25.09.2020
15.10.2020 22:14:33
Владимир, Ах, да - количество не вывел: Записей: 872869
Пользователь
Сообщений: Регистрация: 30.01.2015
16.10.2020 08:07:06
методы создания торговых роботов, принципиально отличаются от написания программ по понятиям, которые гоняют туда сюда кучу данных. вот некоторые из аксиом, которые надо усвоить и научится программировать. ----------------- 1) В текущий момент времени робот должен тратить ресурсы лишь на обработку новой информации 2) Если робот не успевает обработать информацию до прихода новой, то информация лишняя и обрабатывать ее не имеет смысла. 3) Применение циклов в системах реального времени - это зло, которое надо избегать. ---------------- Поэтому в конкретный момент времени надо обрабатывать лишь новые сделки. =============== Если надо очень быстро то используйте API C for LUA. будет быстрее чем шарп, а для уровня решения задач посетителей данного форума еще и проще в понимании. А уж Буратинам надо писать исключительно на луа.
Пользователь
Сообщений: Регистрация: 25.09.2020
16.10.2020 08:34:51
nikolz,То-то и оно, что "аксиом" - в подобную чушь можно только верить, а вера подразумевает полное отключение мозгов.
Методы создания торговых роботов НИЧЕМ не отличаются от написания любых других программ.
1) Не определены ни "текущий момент", ни "ресурсы", ни "новая информация", но зато стоит категоричное "лишь".
2) Если робот не успевает обработать информацию до прихода новой, то его место на помойке. Лично у меня робот практически всё время просто спит.
3) Это вообще песня! Та ОС, в которой я был соавтором, так и называлась: "операционная система реального времени". И вот что удивительно: НИКТО из нас не считал циклы "злом" и не пытался их избегать!
Совершенно верно: "А уж Буратинам надо писать исключительно на луа". Язык, конечно, полное дерьмо, но и требования к софту для торговых роботов просто НУЛЕВЫЕ! Так что я буду писать именно на Lua, и не буду даже пытаться искать что-то лучшее.
Катати, а полный список "аксиом" можно услышать? Прям заинтриговали...