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

Страницы: Пред. 1 ... 20 21 22 23 24 ... 26 След.
RSS
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
Владимир написал:
VPM, И ценности никакой нет: есть согласие продавца и покупателя, то бишь абсолютно субъективная вещь.
Пример. Рыбак живет на Аральском море решил приобрести лодку чтоб рыбачить, спрос на лодки огромный все живут рыбалкой - Ценность1.
Аральском море высохло больше никто не рыбачит лодка ни кому не нужна нет спроса можно сдать на металлолом - Ценность2.
 
VPM, Я и говорю: нет никакой "справедливой цены", нет никакой "ценности" - всё субъективно. Мне эта лодка даром не нужна, и пофиг, высох ли Арал или вышел из берегов.
 
Вот такое сообщение получил сегодня от управляющей компании:

Стратегии доверительного
управления (ДУ) «Тактическая стратегия» и «Сбалансированная стратегия»
больше не активны, потому что БПИФы в их составе были закрыты
из-за инфраструктурных рисков. Инфраструктурный риск — это риск
на неопределенно долгий срок потерять доступ к операциям
с бумагами. Например, не иметь возможности продавать
их и получать дивиденды и купоны.

Красавцы, думаю еще за управление сдерут.
 
VPM,
Вы рыбак?  Покупали лодку на Аральском море ?
-----------------
Если нет, то Ваш пример из раздела - " Остапа понесло"  
---------------  
Всегда прикольно, когда начинают рассказывать примеры из совершенно чужой области деятельности.
===========
Типа:  "А вот им это очень нужно"
или "в будущем это особо пригодится тем, .... "
и так далее...
 
nikolz,  Вы как всегда остроумны, а Ваши посты очень содержательны и полезны. И причём ту я? Это был всего лишь образ, фантазия, для простоты понимания. Сожалею что и такие вещи нужно разжёвывать. И уж точно они моего времени не стоят.

А говорю я в основном о возможностях, А каждый для себя решает чем ему пользоваться, а чем пользоваться. :smile:  
 
nikolz, Ну Вы же любите поговорить о программировании. Советы даже даёте. И ничего, терпим. Вон сколько нафлудили. А если ещё и на название темы взглянуть - ваще укатайка.
 
Владимир,  Вот к нашему разговору про инвестирование, посмотрел фонды у управляющей компании. Это самый лучший результат

Паевый фонд, Сырьевой сектор, Акции сырьевых компаний из разных стран, Динамика стоимости пая▲86.49% за 3 года.

Прогноз доходности▲14% за год, Уровень риска Высокий, Рекомендуемый срок от 3 лет.

И не факт что управляющий сможет повторить? Пересчет в годовые 28,83% это хороший результат для инвестора с кругленькой суммой.
Но где тут управляющий, АУ, достаточно вспомнить что было с денежной массой и Сырьевыми рынками.

Есть и в минусе.
 
Хвалюсь:
 
Цитата
Владимир написал:
Glukator, И у меня этот файл просто содержит строки вида "класс, код", только там ещё валюта, содержимое портфеля (если тикер там есть), настройки разные. Но тоже выдерживается правило "одна строка - один тикер". Кроме того, есть другие строки - данные по кошельку, номер счёта, можно переопределить режим работы скрипта (боевой, тестовый, по историческим данным), добавить или отнять денег или тикеров и т.д. Короче, структура внешнего файла тоже тщательно продумана и столь же подробно описана, как и структура данных в самом скрипте.
О как :) А у меня три файла - список тикеров, конфигурация, портфель. Ну еще запрещенные для торговли тикеры - четвертый.

Цитата
VPM написал:
У меня их не 3 это для простоты изложения, но точно не 300, к примеру для фондового рынка я установил правило ~ 5% Капитала на инструмент,  100% / 20% <= 20 бумаг в портфеле.
В Вашем варианте  Капитал =100% / 300 бумаг <= 0.33% капитала  на 1 бумагу? Но мне помнится у Вас еще нужно 300 * 9 тайм фреймов, считайте сами на кого работаете (комиссии).
Нет у меня 300 бумаг в портфеле, с чего вдруг делить капитал на 300? 300 - это число бумаг, за которыми _следит_ скрипт (в моем случае не 300, а 226). И по _некоторым_ из них время от времени совершаются сделки. А в портфеле болтается обычно от 3 до 5 штук. Вот за сегодня 32 поданных заявки и 15 закрытых с профитом сделок. Утром в портфеле было 2 тикера, сейчас 3, из которых только один тот же самый. Кстати, памяти скрипт жрет от 900 кБ до 2 Мб.  
 
VPM, Не вижу ни малейшего отношения к нашему разговору.

Glukator, И нафига столько файлов?

Да, и у меня в портфеле была примерно такая же катавасия. А когда ввёл рейтинги тикеров, портфель стал куда более стабильным. Всё-таки жалко, когда хорошие тикеры быстро вылетают из портфеля, пусть даже и с профитом. А когда скрипт стал их неохотно выпускать из портфеля, а даже если и выпускал, то быстро возвращал обратно - это мне куда больше понравилось. Как и "говну" достаточно выйти на окупаемость - и до свидания, освободим деньги для более перспективных вложений.
 
Glukator,  Это было предположение, что одномоментно дадут сигнал 226 инструментов, но я упустил что Вы  алгоритмически ранжируете сделки. С памятью я примерно понимаю проблему, от куда "ноги растут", не очень понимаю как ее элегантно решить. Но всему свое время.
Цитата
Владимир написал:
VPM , Не вижу ни малейшего отношения к нашему разговору.
Ну как же не имеет это хороший пример, инвестиционного подхода крупного игрока!
 
Цитата
Владимир написал:
VPM, Очередь, как и стек, понятия чисто алгоритмические. Но если со стеком всё просто с доступом - обрабатывается всегда  последний элемент, то с очередью всё хуже: обрабатывается первый, а потом первым становится уже второй, и вообще вся очередь сдвигается. Это затратно по времени. Если ничего не сдвигать, то первым элементом всегда будет "условно первый" - доступ мгновенный, как и в случае со стеком, но массив данных постоянно растёт. Это затратно по памяти. Наконец, если данные организовать в виде циклической очереди, как, например, организован буфер событий от клавиатуры, затрат почти нет ни по скорости, ни по памяти, но появляется риск переполнения буфера. Других вариантов, как я понимаю, в природе не существует. Вернее, можно очень эффективно реализовать очередь через список, но, строго говоря, это уже и будет список, т.е. другой тип организации данных. А про все эти insert и remove лучше сразу же забыть, как страшный сон.
Вы можете дать пояснения вот этому моменту
Цитата
Если ничего не сдвигать, то первым элементом всегда будет "условно первый" - доступ мгновенный, как и в случае со стеком, но массив данных постоянно растёт. Это затратно по памяти.
Но ведь в варианте со стеком массивы тоже растут?
 
В организации складского учета есть два разных подхода: ФИФО и ЛИФО.  
 
Цитата
VPM написал:
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 использует для представления чисел двойную точность, ваша программа можем выполняться на протяжении двухсот лет, делая по миллиону вставок в секунду, прежде чем возникнет проблема с переполнением.
Кто то может сказать, как собрать ФИФО, как собрать ЛИФО, возможно есть еще варианты, и вообще о чем  толкует профессор? Кто понимает?
 
VPM, А я не занимаюсь ни инвестиционными подходами ни крупными игроками.

Циклическая очередь не сдвигается - и доступ мгновенный, и массив данных не растёт. У стека тоже есть риск переполнения, точно такой же. А про remove я уже давно забыл, как страшный сон. Про insert низзя - этим таблицы Квика рисуются. И хоть миллион лет скрипт будет работать никаких проблем с переполнением не будет.
 
Цитата
Владимир написал:
Glukator, И нафига столько файлов?
Разделил по задачам. Конфиг - это lua-файл с настройками, там у меня задается режим работы (то же, что и у вас - 'file' - по истории, 'test' - по торгам с симуляцией сделок, 'work' - боевой - очередное спасибо за отличную идею), каталоги, файлы, размеры комиссий, параметры входа-выхода, настройки счетов, настройки сообщений. Портфель - простой текстовый файл, там первая строчка - это деньги (сколько свободно, сколько заблокировано под заявки, и общая оценка портфеля), а в каждой следующей строке параметры отдельного тикера из портфеля (код инструмента, количество лотов, размер лота, средняя цена позиции, индекс таймфрейма, время и цена последней покупки, суммарные затраты на покупку). Ну а файл со списком тикеров уже показывал - просто
класс:код инструмента по штуке на строку. Он у меня практически не меняется.

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

Цитата
VPM написал:
Кто то может сказать, как собрать ФИФО, как собрать ЛИФО, возможно есть еще варианты, и вообще о чем  толкует профессор? Кто понимает?
Да хрен его знает, этого прохвоссора, о чем он толкует. У вас какое-то конкретное практическое приложение намечено для этих структур?
Есть у меня очередь, но всего одна - это очередь сделок. Туда падает информация о сделках из OnTrade() и разгребается потом в main(). Вот я, в принципе, и умом понимаю, что без разницы, в каком порядке это разгребать (алгоритму разбора по барабану, в каком порядке пришла информация о сделках) - вполне можно и стеком было обойтись. Он реализуется куда как красивее.
 
Glukator, Ага, "разделил по задачам". Первая задача - считать внешний файл, по его данным создать и проинициализировать. соответствующие структуры ОЗУ. Это main, считали и забыли. Открыли лог - это снова ОДИН открытый файл. По выходу сбрасываем текущее состояние во внешний файл - лог уже не нужен, - это снова ОДИН открытый файл. Исключение - сброс дампа, я в этот момент лог не закрываю, и это ДВА открытых файла. Но можно и закрывать, останется ОДИН. Единственное - я читаю IN.TXT, а дамп сбрасываю в OUT.TXT - это на случай каких-то страшных ошибок, чтобы хотя бы исходный файл остался. Ах, да - есть ещё DATA,TXT, если работаем по историческим данным. А IN, он же OUT содержит и все текущие настройки, и кошельки по всем валютам, и портфель, и список отслеживаемых тикеров, "а также всё, что понадобится впредь". А стек прерываний - единственный из моих стеков, который обрабатывается именно как стек, поскольку "без разницы, в каком порядке это разгребать", а работать со стеком удобнее.
 
Владимир, ну я не вижу проблемы в том, чтобы держать открытыми несколько файлов. Лог всегда открыт, да - на то он и лог. Файл портфеля у меня обновляется при каждом изменении позиций и раз в 5 минут - на всякий случай. Перед сохранением файла портфеля делается его резервная копия. А конфиг - да, считали и забыли. Короче, то, что часто меняется (портфель) вынесено в отдельный файл. Остальное просто лежит рядом и хлеба не просит. Не вижу противоречий :)
 
Glukator, Проблемы потенциальные - в рассогласовании данных. Если тикер вообще есть в списке, его нужно отслеживать - свечи считать и всё такое. Если им разрешено торговать - можно формировать заявки, если он есть в портфеле - сведения, сколько и почём на каких таймфреймах торгуется. А то вдруг в портфеле тикер есть, а в списке его нет. Да и самому удобнее смотреть, когда всё собрано в одном месте, а не рыскать по разным файлам.
 
Цитата
Glukator написал:
Да хрен его знает, этого прохвоссора, о чем он толкует. У вас какое-то конкретное практическое приложение намечено для этих структур?

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

Как было показано в организации структуры данных, программа получает внешние данные из ds по нескольким тикерам на нескольких тайм фреймах. От начало торгов до закрытия торгов, эти массивы растут.
Для расчета самописных индикаторов, используемых торговой стратегией (в среднем ~<5), это массив ds передается в качестве входного параметра в алгоритм расчета индикатора.
Все они написаны с использованием замыкания, т.е. имеют внутренние таблицы для хранения данных, и все это дело с ходом торгов разрастается.

Изначально такой подход в организации стратегии, принят по тому что у меня много таких индикаторов, и простой заменой (присвоением) одного на другой меняется сама стратегия.
Этот подход проходит без проблем на одном инструменте, а при использовании портфеля возникают проблемы с памятью.

Решения вижу два:
1) Организовать расчет индикаторов по другому, но это не решает коренным образом проблему.
2) В организации и хранении структуры данных, ведь как правило не нужен весь массив значений хранящихся в ds, достаточно чтоб сохранялось 5 или 20 (Period=X задается пользователем) последних значений. Пример профессора, это на мой взгляд, ключ к пониманию и решению этой проблемы, правильной организации структуры данных использованию этих данных и хранению.

Эта тема лежит в начале обсуждения (пост #1) на этой веточки. Но куда то подевались программисты? Все "понты" по отлетали. Лучше месяцами "толочь воду в ступе" про OnInit и тому подобное.
 
VPM, С КАКОГО БОДУНА "эти массивы растут"? У меня почему-то ничего не растёт, кроме лога. А если есть какой-то внешний софт, в котором что-то там растёт, так выбросить его на помойку! Зачем пользоваться поделиями криворуких бездарей? Мало ли кто там что-то где-то когда-то сказанул. Меня интересует решение МОЕЙ задачи, и любая хрень, которая не помогает этому решению, мгновенно отбрасывается.
 
Цитата
Владимир написал:
С КАКОГО БОДУНА "эти массивы растут"? У меня почему-то ничего не растёт, кроме лога.
Растут, и у Вас растут просто не критично. А все кто использует ds,Error = CreateDataSource(class,symbol,interval) сталкиваются с этой проблемой!

Цитата
Владимир написал:
А если есть какой-то внешний софт, в котором что-то там растёт, так выбросить его на помойку! Зачем пользоваться поделиями криворуких бездарей?
Вы не поняли, внешнего софта нет, есть отдельно написанные небольшие программы (см. пример организации ниже) на луа, для совместного использования в виде индикатора с отображением на графике,
так и в main(). В этом случае тот самый бездарь я, так как написаны мной.

1) Передал огромный ds
2) Filt,Price={},{} массивы при такой индексации нарастают с приходом нового индекса.
Код
function f() -- индикатор
        
     local Filt,Price={},{}; -- таблицы для хранения данных
   return function(I,FSettings,ds )
      local I = I or 1; --индекс бара
      local ds = ds or nil; -- передача (ds,Error = CreateDataSource(class,symbol,interval))
      local FSettings = FSettings or {};
      local v_t = FSettings.v_t or 'C';
      local P = FSettings.period or 48;
      
      --------------------------------------
      local price = x or Value(I, v_t, ds) or 0;
      --------------------------------------
      if I == 1 then 
         Price,Filt={},{};
         Price[I],Filt[I]=p0,p0;
      end
      --------------------------------------
      local p1=Price[I-1] or price;
      local p2=Price[I-2] or p1;
      local pn=Price[I-n] or p2;
      Price[I] = price;

        .... что то считаем
    
   Filt[I] = filt; --сохраняем промежуточный результат
   
   return filt1,filt выводим
   end
end

 
Цитата
Владимир написал:
Циклическая очередь не сдвигается - и доступ мгновенный, и массив данных не растёт.
А здесь можно пример и где посмотреть?
 
VPM, У меня НИЧЕГО не растёт - с какой радости чему-то расти? CreateDataSource, естественно, не пользуюсь и другим не советую.

А что мешает отправить на помойку "отдельно написанные небольшие программы на луа"? Ага, понятно - автор не устраивает.  :smile:  Ну так надо переписать всё с нуля, чтобы нигде ничего не росло. И без всяких CreateDataSource - ЭТО не лечится.

Какой пример? Буфер клавиатуры - классическая реализация, вылизанная до предела за десятилетия использования. Указатели головы и хвоста - там всё просто.
 
Владимир,  С автором по аккуратней, если еще его удалить, то что вообще останется :wink:
Ну Вы же говорите стеки растут?

Вроде до меня доходит, о чем написал профессор.
Описан метод FIFO (реализации стека с использованием таблиц,  вызывая только pushlast - вставляем в конец и popfirst - удаляем первого ), а   эффективность достигается, поскольку элементы не нужно сдвигать после операций вставки и удаления. А размер таблицы всегда постоянен.
Попробую в решении своей задачи!!! :smile:  
 
VPM, С какой радости стекам расти? Стек заявок выбирается 2 раза в секунду, стек прерываний - 4 раза в секунду, элементы в стеке активных заявок редко живут более нескольких минут, а в конце сессии брокер такие заявки всё равно снимает. Скрипт это видит, и очищает стек.

И "профессора" посылайте куда подальше. Размер стека ТОЖЕ всегда постоянен, как и очереди. Никогда не встречались с диагностикой "stack overflow"? И в стеке ТОЖЕ "элементы не нужно сдвигать после операций вставки и удаления": иллюстрацией стека может служить стопка тарелок или магазин к АКМ. Так что дурак Ваш "профессор". Малограмотный дурак.
 
Цитата
Владимир написал:
У стека тоже есть риск переполнения, точно такой же.
Ну Вы меня окончательно запутали, а это что такое?  Но таблица то растет проиндексированная стеком.
 
Цитата
Владимир написал:
И "профессора" посылайте куда подальше.
Послал всех и автора и профессора, покажите как правильно организовать хранение внешних данных???
 
VPM, Я понятия не имею, что такое "таблица, проиндексированная стеком" и, тем более, почему она растёт. А "правильно организовать хранение внешних данных" нужно так, чтобы было удобно с ними работать. И не кому-нибудь, а лично Вам.
 
Владимир,  Ну  тогда прежде чем рассуждать о великом, нужно определиться с понятиями :smile:

Вот
local i=sdelka[0];  i=i+1;      ---- новый размер стека сделок из прерывания
sdelka[0]=i;                         ---- записываем изменение стека:
---- сохраняем новую сделку;
   sdelka[i]={};                     -- заводим новый элемент стека
   sdelka[i][0]=sdelka[0];
   sdelka[i][1]=trade.trans_id;      -- ID транзакции
   sdelka[i][2]=get_date(trade.datetime)
   sdelka[i][3]=get_time(trade.datetime)

sdelka[i]={}; таблица растет с увеличением размера стека?
 
Цитата
Владимир написал:
А "правильно организовать хранение внешних данных" нужно так, чтобы было удобно с ними работать.
А это общие слова - лозунг, Вы покажите
Цитата
Владимир написал:
Размер стека ТОЖЕ всегда постоянен, как и очереди.
на примере?
 
VPM, Растёт, если он не обрабатывается. Но стек ведь не только LI, но и FO.

ЧТО "показать"? Я организовал данные так, чтобы МНЕ было удобно с ними работать, разработал структуру как в ОЗУ, так и в файле. А максимальный размер программного стека всегда заранее известен в любой программе.
 
Цитата
Владимир написал:
Растёт, если он не обрабатывается. Но стек ведь не только LI, но и FO.
Ну вот, а если миллионы сделок на 1000 тикерах и множестве тайм фреймах -- это уже проблемы с памятью.

"Но стек ведь не только LI, но и FO". - Не большие примеры можете на кидать чтоб всем стало понятно!
Не обязательно как у Вас, а принципиально чтоб понять как можно обрабатывать, чтоб держать размер постоянным?
 
VPM, Миллионы сделок на 1000 тикерах и множестве тайм фреймах - это чушь собачья. Это тысячи сделок в среднем на тикер, это миллиардные обороты, это идиотизм. Даже один миллион при моём ограничении "не более двух заявок в секунду" и круглосуточной работе биржи за неделю не управиться, чтобы это всё хотя бы в Квик подать. Но даже в этом случае, если стеки будут обрабатываться быстрее, чем пополняться, ничего расти не будет: размеры стеков будут болтаться около нуля.

Ну что тут может быть непонятного? Тарелку на вершину стопки положил - push, снял - pop. И на кой "держать размер постоянным"?
 
Сделал не большой пример
Эта запись list.last = last;  list[last] = value; в начале кажется что идет пере присвоение, но когда понимаешь что это две переменные, два разных элемента таблицы , вот из моего примера list.last=0; list[last]=40
Доходит как все элегантно написано!  Вот уже полчаса не могу глаз оторвать :lol:
Код
local List = {};
---- Теперь мы можем вставлять и удалять элементы с обоих концов за постоянное время:
function List.new()
   return {first = 0, last = -1}
end

---- Операции вставки -- table.insert
function List.pushlast (list, value) 
  local last = list.last + 1;
  list.last = last;
  list[last] = value;
  print('List.pushlast: ' ..'; '..type(list.last)..'; '..'; last='..tostring(list.last)..'; '..type(list[last])..'; '.. tostring(list[last]))
end
---- Операции удаления -- table.remove
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

local list=List.new()

local ds={10,20,30}; local value=40;
for i=1, #ds do

List.pushlast(list, value)
print( 'Вставил в конец',list.last, value )
if i>1 then
print( 'Удалил первого', List.popfirst (list) , type(list), #list)
end
end

List.pushlast: ; number; ; list.last=0; number; list[last]=40

 
VPM,
В качестве информации к размышлению.
---------------------
Вы наверное видели на форуме результаты теста хранения и обмена данных по принципу Memory-mapped files
-------------------  
Так вот , применение отображения файла на память решает все проблемы с объемом памяти.
----------------------------------------
1)  Объем памяти для хранения данных.
У меня он ограничен свободным объемом диска. сейчас это 100 ГБайт.
Очевидно, что если мало, то можно добавить еще диск специально для данных, например 500 Гбайт
Цена вопроса 2тр.  Понятно, что объем памяти для хранения данных практически любой.
---------------------------------------
2) Объем памяти для обработки данных.
Очевидно, что обрабатывать  500 Гбайт каждую минуту нет надобности.  
У меня на компе есть сейчас  свободных  2.5Гбайта .
Для обработки за один заход  мне достаточно 1 ГБайт.
------------------------------------
3) Фокус в том, что на этот 1Гбайт  менее, чем за 0.001 сек проецирую  любой ГБайт из файла на диске.
После проецирования работа с Гбайтом данных выполняется в памяти.
----------------
Более того, не надо ничего читать из файлов в другие потоки или приложения.
------------------------
Они видят эту оперативную память и просто работают с ней как обычно.
=========================
Резюме, нет никаких ограничений ни в памяти для обработки , ни в памяти для хранения.
 
 
В общем все как люблю, это модуль, написано на чистом луа, написано элегантно загляденье, Размер таблицы задается пользователем, количество элементов поддерживается постоянным, реализовать  4 функциями можно различные варианты (возможности). Вердикт немедленно в работу! :smile:  
 
nikolz, Не все понял, нужно поискать, посмотреть подход, Спасибо. Но Вроде я нашел решение свей задачи,  попробую будет ясно. Но в любом случае спасибо за новую идею.
 
Цитата

List.pushlast: ; number; ; list.last=0; number; list[last]=40
тут ошибки
 
Цитата
nikolz написал:
Цитата

List.pushlast: ; number; ; list.last=0; number; list[last]=40
тут ошибки
где?
 
Какое-то странное обсуждение. Если это оперативные данные, то, чаще всего, их не так и много, если, конечно, это не данные модели, которые лучше в памяти держать.
Думаю, что здесь задача тривиальная - хранить какие-то простые данные для работы скрипта. И уж как организовать их хранение не столь важно, важно, чтобы они было доступны, просто получаемые, без лишних поисков.

А обезличенные сделки - зачем их держать в памяти? Прочитал партию - записал в файл, базу данных, передал в socket. Все, забыли. Либо произвели агрегацию, вычисления и храним только данные расчета, сами-то ВСЕ сделки зачем хранить.
 
Nikolay,  Добрый день! Что то давно не заглядывали на "огонек"? Постановка задачи в в моем посте 17.01.2024 11:51:41 проблемы с памятью.
 
Я, кажется, уже писал Вам, что почти все индикаторы не требую хранения данных более чем период расчета. А у еще большего числа индикаторов таки вообще достаточно хранения данных на прошлой итерации, как, например, у EMA.
Поэтому, для начала, просто произведите оптимизацию расчетов. Большинство примеров из просторов глобальной помойки, совершенно не заботятся о том, что баров может быть под 60 тыс, и экземпляров расчета от 100 и более.
 
Nikolay, Да мы это обсуждали , массивы в индикаторах подчищаю, этого мало,  ведь передается ds, Хочу попробовать очередь! т.е. данные уменьшить до определённого количества необходимого для расчета, а за основу возьму пример из книги. Что скажите?
 
Зачем здесь очередь? Какую задачу надо решить, что нужна именно очередь? Нужен простой массив или кольцевой буфер (что тоже массив). И как сам DS влияет на занимаемую память? DS ничего не хранит - это интерфейс к данным, а не сами данные, и поэтому один тот же DS, одного и того же инструмента, можно использовать в различных расчетах.
 
ds,Error = CreateDataSource(class,symbol,interval)
type (ds) = таблица , т.е. там только методы получения , а сами данные на сервере или в хранилище рабочего места?

Тогда такая запись передача только методов доступа к данным?
function f() -- индикатор        
    local Filt,Price={},{}; -- таблицы для хранения данных
  return function(I,FSettings,ds )

Я правильно Вас понял?
 
Да, DS - это таблица (класс) (в LUA всё таблицы), но там только методы и недокументированные переменные. Сами данные получаются через эти методы.

Что касается организации замыкания, то я никогда не понимал зачем в учебных примерах, предоставляемых ARQA, настройки и DS передаются в метод расчета на каждой итерации. Когда более логично их передать один раз при вызове конструктора экземпляра. Они будут запомнены через upvalue и никуда не денутся. Сам метод расчета требует только индекс бара (и что еще, если алгоритм требует), и не более.
 
Ну Nikolay, Спасибо Вам, все поставили на свои места, мои подозрения не верны, нужно смотреть что еще может критично накапливаться в таблицах.

У меня сейчас в работе 4 тикера 4 тайм фрейма  4 индикатора рассчитываю на момент запуска примерно 1М на конец дня 25М, и мне это не нравится, так как планирую увеличить и количество тикеров.
 
Добавьте в лог в разных подозрительных местах результат выполнения collectgarbage('count')
Будете видеть где происходит утечка памяти.
 
Цитата
Владимир написал:
Glukator, Проблемы потенциальные - в рассогласовании данных. <...> А то вдруг в портфеле тикер есть, а в списке его нет.
У меня была такая ситуация. С тех пор сначала загружаются тикеры, потом портфель. И если в портфеле тикер есть, а в списке нет, скрипт матерится в лог и отказывается работать.
Цитата
VPM написал:
Доходит как все элегантно написано!
По мне так перегружено как-то. Вот моя очередь:
Код
-- Положить элемент v в конец очереди q
function qpush(q, v)
    if q[0] == nil then
        q[0] = { 1, 1 }
        q[1] = v
    else
        q[0][2] = q[0][2] + 1
        q[q[0][2]] = v
    end
end

-- Извлечь первый элемент
function qpop(q)
    if q[0] == nil then return nil end
    local x = q[q[0][1]]
    if x ~= nil then
        q[q[0][1]] = nil
        q[0][1] = q[0][1] + 1
    end
    return x
end

-- ֶДлина очереди
function qlen(q)
    if q[0] == nil then return nil end
    return q[0][2] - q[0][1] + 1
end

-- i-й элемент с начала
function qitem(q, i)
    if q[0] == nil then return nil end
    return q[q[0][1] + i - 1]
end

Потенциально опасные места есть, но мне не критично.
Страницы: Пред. 1 ... 20 21 22 23 24 ... 26 След.
Читают тему
Наверх