Более быстрый способ

Страницы: 1
RSS
Более быстрый способ, all_trades
 
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  сек,  как такое вообще сделать можно ?
поясните пожалуйста
 
Костя, Ну так забирайте в цикле данные от getItem в свою таблицу, и больше ничего не делайте. Насколько я могу судить по коду, тормозит именно  table.insert.
 
Уточните, Вы пишите скрипт или индикатор.
 
Попробуйте SearchItems
 
Используйте функцию SearchItems, чтобы не получать данные по каждой строке. Это даст уже фильтрованный массив индексов строк по нужному инструменту.

Далее, не надо использовать table.insert. Если необходимо просто увеличивать массив, то быстрее будет сделать как t[#t+1] = value.

Так Вы просто добавляете в конец массива новый элемент.
 
для скрипта надо делать две части
первая часть исполняется один раз и читает данные из архива квика
вторая часть работает в колбеке
 
на основе вашей функции, можно сделать примерно так:
-------------------------------
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
 
Цитата
Nikolay написал:
Используйте функцию SearchItems, чтобы не получать данные по каждой строке. Это даст уже фильтрованный массив индексов строк по нужному инструменту.

Далее, не надо использовать table.insert. Если необходимо просто увеличивать массив, то быстрее будет сделать как t[#t+1] = value.

Так Вы просто добавляете в конец массива новый элемент.
Можите показать на пример как  это сделать, мой проект на  си Шарп ,  библитека что пользуюсь  quikLua
кэлбеком  с шарпа я подаю  инструмент , что мне нужен

и он , добавляет  в таблицу,  строки, по одной , формирует таблицу и отправляет ,мне в шарп  "return msg"
а как воспользоваться  тем чтобы, мгновенно получить  таблицу,  минус один индекс текущего тика , вот это я не понимаю  SearchItems
 
Цитата
nikolz написал:
local i=#msg.data;
Попробовал ваше  

сработало исключение
@"Lua error: qsfunctions.lua:605: attempt to index a string value (field 'data')"

 

А это c#  метод  который  получает  уже таблицу  с луа , думаю  теперь понятна мое желание  ВАм *

SecCODe -ЭТО НАЗВАНИЕ  инструмента
 
Чтобы что-то ответить надо смотреть в исходники этой библиотеки.
Не факт, что она поддерживает все глобальное окружение qlua.
 
Цитата
Nikolay написал:
Чтобы что-то ответить надо смотреть в исходники этой библиотеки.
Не факт, что она поддерживает все глобальное окружение qlua.
Если Вам  не сложно, можете  показать  пример с "Используйте функцию SearchItems, чтобы не получать данные по каждой  строке. Это даст уже фильтрованный массив индексов строк по нужному  инструменту."
передать в шарп ,  любой массив, главное его получить,  а как  это сделать без цикла на луа я не понимаю  , так как у нас есть  препоследний элемент, и нам надо от первого пройтись по всем элементам , как по другому то?
 
Так  никто не и не поможет  ?  жаль придется тратить время на решении .задачи которую решает  каждый алготрейдер , не хотите вы упростить нам жизнь=(
 
Ну вот Вам пример.Их уже столько на просторах:
Код
---@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
 
Цитата
Костя написал:
Цитата
nikolz написал:
local i=#msg.data;
Попробовал ваше  

сработало исключение
@"Lua error: qsfunctions.lua:605: attempt to index a string value (field 'data')"
покажите как вы определили msg которое передаете в вашу функцию.  
 
исправьте так:
-------------------------------
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
 
Цитата
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 пробовать  ...
 
Цитата
Костя написал:
Цитата
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 пробовать  ...
Напишите для начала сколько времени у вас исполняется ваше решение и сколько это.
--------------
В этом решении все существующие данные загрузятся один раз а не каждый цикл.
Если новых данных нет, то время не тратится.
---------------------
Поясняю на примере.
Пусть в архиве 10000 данных.
В вашем решении на каждом цикле будете читать в таблицу 10000 данных
В моем это чтение будет лишь один раз.
После поступление нового значение у Вас опять будет читаться все 10001 значение
а в моем только 1.
-------------------
Итак какие результаты у вас получились?
 
Так, естественно, надо всегда запоминать последний прочитанный индекс.
Какой смысл читать повторно, если один раз уже прочитал.
 
Цитата
Костя написал:
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 - костыль и вам скорее не поможет, потому что вы не правильно данные отправляете.
 
Все смешалось - кони,люди

Зачем нагородили кашу из луа и шарпа?

Все делается без шарпов на луа без проблем.
--------------------------------------------------------------------------------------
Мы не ищем легких путей.  
Создадим себе трудности, чтобы потом искать того, кто их преодолеет для нас..
 
Костя,Можно воспользоваться CreateDataSource и создать тиковый график. Там есть ограничения на данные, но как вариант решения проблемы.
 
Цитата
nikolz написал:
Все смешалось - кони,люди

Зачем нагородили кашу из луа и шарпа?

Все делается без шарпов на луа без проблем.
--------------------------------------------------------------------------------------
Мы не ищем легких путей.  
Создадим себе трудности, чтобы потом искать того, кто их преодолеет для нас..
Почитал про луа знак решетка получает длинну массива,

# получить длину строки
================
объясни мне какую он должен получить длину массива  из 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
 
Цитата
nikolz написал:
Все смешалось - кони,люди

Зачем нагородили кашу из луа и шарпа?

Все делается без шарпов на луа без проблем.
--------------------------------------------------------------------------------------
Мы не ищем легких путей.  
Создадим себе трудности, чтобы потом искать того, кто их преодолеет для нас..
В ОБЩЕМ проблема не решена

Квиж жутко тормозит  и набиваем массив
 
Цитата
Костя написал:
В ОБЩЕМ проблема не решена
Если требуется анализ приложите полную версию скрипта.
 
Цитата
Костя написал:
Цитата
nikolz написал:
Все смешалось - кони,люди

Зачем нагородили кашу из луа и шарпа?

Все делается без шарпов на луа без проблем.
--------------------------------------------------------------------------------------
Мы не ищем легких путей.  
Создадим себе трудности, чтобы потом искать того, кто их преодолеет для нас..
В ОБЩЕМ проблема не решена

Квиж жутко тормозит  и набиваем массив
Освойте сначала луа а потом пишите на шарпе
нет желания разбираться с вашей кашей.
 
Сами
Цитата
nikolz написал:
Цитата
Костя написал:
 
Цитата
nikolz  написал:
Все смешалось - кони,люди

Зачем нагородили кашу из луа и шарпа?

Все делается без шарпов на луа без проблем.
--------------------------------------------------------------------------------------
Мы не ищем легких путей.  
Создадим себе трудности, чтобы потом искать того, кто их преодолеет для нас..
 В ОБЩЕМ проблема не решена

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

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
===================
вернемся к моему вопросу,  как мгновенно получить  сразу  таблицу   обезличных сделок ?
 
Цитата
Костя написал:
Сами
Цитата
nikolz написал:
 
Цитата
Костя  написал:
 
Цитата
 nikolz   написал:
Все смешалось - кони,люди

Зачем нагородили кашу из луа и шарпа?

Все делается без шарпов на луа без проблем.
--------------------------------------------------------------------------------------
Мы не ищем легких путей.  
Создадим себе трудности, чтобы потом искать того, кто их преодолеет для нас..
  В ОБЩЕМ проблема не решена

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

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
===================
вернемся к моему вопросу,  как мгновенно получить  сразу  таблицу   обезличных сделок ?
В вашем случае никак. Передавайте записи в шарп, а не добавляйте его в отдельную таблицу. На это уходит лишнее время.
 
Можно воспользоваться корутинами, но навряд ли увеличит скорость.
 
Сроду не интересовали (и не заинтересуют) обезличенные сделки, но нажав тупо в Квике на эту таблицу (СПб), получил её примерно секунд за 10 (с прорисовкой!) Там на данный момент 563877 строк... ой, уже 563880 - таблица регулярно обновляется, и это время УЖ НИКАК не может быть больше, чем получение таблицы программным способом!
 
Цитата
Владимир написал:
Сроду не интересовали (и не заинтересуют) обезличенные сделки, но нажав тупо в Квике на эту таблицу (СПб), получил её примерно секунд за 10 (с прорисовкой!) Там на данный момент 563877 строк... ой, уже 563880 - таблица регулярно обновляется, и это время УЖ НИКАК не может быть больше, чем получение таблицы программным способом!
прежде чем глупости писать попробуйте просто на том же луа.создать   текстовый файл  и добавить все таблицу...
 
Костя, Да я и пробовать не хочу! Получение массива БЕЗ прорисовки на экране НА ПОРЯДОК быстрее, чем без прорисовки! Если не на два.
 
Костя, Ну, попробовал. Секунды три всё удовольствие. 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;
 
Цитата
Костя написал:
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 записей в Юниоре. Проблема в возврате ее в Квикшарп.  
 
Владимир, Ах, да - количество не вывел:  Записей: 872869
 
методы создания торговых роботов, принципиально отличаются от написания программ по понятиям, которые гоняют туда сюда кучу данных.
вот некоторые из аксиом, которые надо усвоить и научится программировать.
-----------------
1) В текущий момент времени робот должен тратить ресурсы лишь на обработку новой информации
2) Если робот не успевает обработать информацию до прихода новой, то информация лишняя и обрабатывать ее не имеет смысла.
3) Применение циклов в системах реального времени - это зло, которое надо избегать.
----------------
Поэтому в конкретный момент времени надо обрабатывать лишь новые сделки.
===============  
Если надо очень быстро то используйте API C for LUA.
будет быстрее чем шарп, а для  уровня решения задач посетителей данного форума еще и проще в понимании.
А уж Буратинам надо писать исключительно на луа.
 
nikolz,То-то и оно, что "аксиом" - в подобную чушь можно только верить, а вера подразумевает полное отключение мозгов.  :smile:

Методы создания торговых роботов НИЧЕМ не отличаются от написания любых других программ.

1) Не определены ни "текущий момент", ни "ресурсы", ни "новая информация", но зато стоит категоричное "лишь".

2) Если робот не успевает обработать информацию до прихода новой, то его место на помойке. Лично у меня робот практически всё время просто спит.

3) Это вообще песня! Та ОС, в которой я был соавтором, так и называлась: "операционная система реального времени". И вот что удивительно: НИКТО из нас не считал циклы "злом" и не пытался их избегать!

Совершенно верно: "А уж Буратинам надо писать исключительно на луа". Язык, конечно, полное дерьмо, но и требования к софту для торговых роботов просто НУЛЕВЫЕ! Так что я буду писать именно на Lua, и не буду даже пытаться искать что-то лучшее.

Катати, а полный список "аксиом" можно услышать? Прям заинтриговали...  :smile:  
Страницы: 1
Читают тему
Наверх