nikolz (Все сообщения пользователя)

Выбрать дату в календареВыбрать дату в календаре

Страницы: Пред. 1 2 3 4 5 6 7 8 9 10 11 ... 69 След.
Робот в виде скрипта индикатора
 
2024 Февраль  Сегодня



2024 Январь и Февраль
os.execute с правами админа
 
Цитата
Serge123 написал:
1. Как можно (если можно) вызвать из qlua ехе программку с правами админа, напр., чтобы скорректировать часы ПК? А если эта программка сидит в dll, то тогда как? Видимо, можно как-то повысить права вызываемой программы?

2. Верно ли, что с ключом /nowait можно вызывать программы так, чтобы вызывающая программа продолжала работать и не ждала завершения вызываемой программы?
Запустите КВИК с правами админа и все функции в нем,в т ч и в ваших dll , будут исполнятся с этими правами.
Что за хрень версия 10...
 
Цитата
funduk написал:
Скорее всего формат котировок немного поменялся (их можно вручную перенести, формат хоть и секретный, но очевидный), иначе нет смысла его затирать. Конечно перед апдейтом надо было бэкап делать. 11 версия уже есть. Название файла локализации менялось от версии к версии, подчерк убирался. Долгая загрузка часто значит, что много ошибок пишется в окно сообщений (см. размер tmsg.dat), почему-то это долгая операция.
Давно пытался разобраться в формате но не получилось. Если есть формат выложите. Напишу программу конвертации архива из текста в файлы dat и выложу в свободном доступе. А то потерялась статистика за 2 года, а я на ней робота обучаю.  
Как исправить ошибки после зависания?
 
У меня на компе стоят три версии 8 10 11
10 11 - демо сервер
8 - рабочая
Как исправить ошибки после зависания?
 
Цитата
Serge123 написал:
Это некорректно из-за записей/удалений ключей в реестре...
Видно, придётся поставить Квик на другой ПК и сравнить файлы оттуда с моими...
Квик не пишет ключей в реестр.
Что за хрень версия 10...
 
Нашел файл в бекапе за 21 год.
Но проблема осталась. КВИК стал загружаться на 10 секунд и исчезать
-----------------------
Удалил все лишнее
----------------------
В итоге вернулся на версию 8.7 но уничтожился архив с котировками.
----------------------
Ув Разработчики сделайте так ,
чтобы архив не затирался вашими глючными новыми версиями.
-----------------------------------------
Буду ждать 11 версию, 9 и 10 успешно пропускаем.
Что за хрень версия 10...
 
Решил сдуру поменять нормально работающую версию 8.7 на новую у сбербанка 10....
в итоге получился вроде бы тормоз.
---------------
Стал из бекапа восстанавливать и нате вам :


Ну и что теперь делать?
Как исправить ошибки после зависания?
 
Цитата
Serge123 написал:
Можно брать только у моего брокера, т.к. она настроена у него только на работу через этого брокера и для его клиентов использование Квика бесплатно. Но у брокера нет версии в зипе, а есть только установщик в ехе...
сделайте архив своего каталога. После этого  установите  КВИК в другой каталог.
Потом заберите что хотите из него в свой каталог.  
openresty и повторный вызов функции
 
Цитата
Vitalia написал:
openresty
может это поможет
https://habr.com/ru/articles/321864/
https://webhostinggeeks.com/blog/what-is-openresty-web-server/
Как исправить ошибки после зависания?
 
https://arqatech.com/ru/support/files/
Как исправить ошибки после зависания?
 
Цитата
Serge123 написал:
Не надо писать ерунду, разумеется, я перезагружал... А то, что микрософты пишут, что их NTFS ведёт журнал и при загрузке винды исправляет транзакции при зависании (синем экране), это тоже ерунда. Я давно ещё на вин хр видел, что после синего экрана винда не исправила попорченный файл ярлыка, имя ярлыка стало короче и его папка не открывалась. А после прогона scandisk имя ярлыка восстановилось и его папка стала рабочей.

Поэтому моё сообщение остаётся в силе: где взять последние версии исполняемых файлов Квика?
А разве на сайте брокера их нет?
Тогда скачайте с этого сайта.  
Еще можете их взять у любого брокера, у которого такая же версия как у Вас.  
Как исправить ошибки после зависания?
 
Цитата
Serge123 написал:
Сегодня загрузил Квик, в меню Сервисы опять увидел левые иконки слева от строк меню. Перезагрузил Квик - иконки исчезли. Такое ощущение, что где-то подпортились файлы. Это сам info.exe или какие-то ещё?

Как можно обновить этот info.exe, dll и другие исполняемые файлы? Почему никто не ответил?
Вы не можете испортить программы  exe и dll.
Вы можете испортить лишь то, что в памяти. Если перезагрузка КВИК не помогает, то попробуйте перезагрузить комп.
Пожелание по 1. OnQuote и 2. getQuoteLevel2
 
Цитата
Kalmar написал:
Цитата
Serge123 написал:
1-я вызывается даже чаще, чем происходят сделки, хотя, часто не несёт нужной информации.
Потому что не имеет никакого отношения к сделакам.
Она вызывается когда появляется котировка в стакане.
поправлю.
Биржа передает изменяющиеся строки в стакане.
Это не только появление, но и удаление,
а также изменение количества в существующей позиции.
 
таблица "depo_limits" . Что не так?
 
Цитата
Anton Belonogov написал:
nikolz, добрый день.

Верно понимаем, что описанное поведение больше не воспроизводилось?
верно
Индикатор Delta
 
Добрый день,
Написал индикатор Delta.
Скрипт 60 строк.
Пока он работает только для текущего дня.
Сам я им не пользуюсь, поэтому особенно не придумывал.
Вот такая картинка получилась для Сбера (нижний график ).
Рисует объему купить продать для тайма графика и накопительную функцию.

Работает быстро, если запустить с начала дня.
Если не сначала, то задумывается при запуске, так как для Сбера например получилось 35 тысяч сделок сегодня.
---------------------
Если кому надо, то пишите могу выложить nkDelta.luac  на какой-нибудь файлообменник.
Робот в виде скрипта индикатора
 
Цитата
Александр написал:
Это очень хорошо. А как транзакции отслеживать Пробовали? События приходят?
Да, закончил отлаживать модуль для торговли.
События в индикаторах не используются.
Все делается по таблицам. Без проблем.
------------------------------
Скрипт 110  строк.
----------------
Модуль в виде функции.
Входные параметры сигнал купить/продать и текущий номер свечи.
---------------------
Алгоритм такой :
-----------------------
Проверяем есть ли активная заявка.
Если есть, то проверяется время ее активности.
Если время ее активности истекло (задается в параметрах индикатора)
то заявка снимается.
----------------------
Если активных заявок нет , то определяется текущая позиция  и возможное количество для совершения сделки.
-----------------------------
В зависимости от направления позиции, сигнала, допустимого максимума в позиции и разрешения на шорт, определяется
количество в новой заявке.
-----------------------------
Выбор цены сделки пока вопрос открытый. Есть различные варианты.  Пока остановился на last+-step.
После этого выставляется новая заявка.
------------------------
Тестил на демо сервере примерно 500 сделок , полет нормальный.
 
Не выставляются заявки после открытия сессии.
 
Цитата
НиколайН написал:
Обновил QUIK до 11 версии. Проблема не исчезла. Продублировал вопрос тут - https://forum.quik.ru/messages/forum1/message74126/topic8484/#message74126
Предположу, что в скрипте зависает при определении начала сессии.
Гипотеза такая:
Возможно Вы используете функцию соединения с сервером, а она у вас срабатывает до открытия сессии и потом все зависает.
Когда вы разрываете соединение и снова соединяетесь, то функция срабатывает при открытой сессии и все работает.
Комиссии в системе
 
https://www.moex.com/a2193
https://habr.com/ru/articles/486716/
https://journal.tinkoff.ru/investment-report/
Предлагаю реализовать
 
Хвалюсь, с индикаторами

Предлагаю реализовать
 
это тоже не проблема.
Предлагаю реализовать
 
Цитата
Kolossi написал:
Никому такая реализация нахрен не нужна, что с ней не так?
Поясняю ...
1) Зачем загромождать робота функциями индикаторов, если есть внутренние в КВИКЕ.
2) Все что напишите на луа будет на порядок медленнее чем встроенные.
3) Написанные индикаторы сожрут память для их хранения и ее надо в 2 раза больше , чем для встроенных.
------------------  
У меня нет других проблем.
Но писать индикаторы на луа, которые уже написаны на СИ и встроены - это "производственный ан..изм."
Предлагаю реализовать
 
Цитата
Anton Belonogov написал:
nikolz, добрый день.

1) Вы можете загрузить Lua-скрипты индикаторов, аналогичных встроенным, с нашего сайта и вносить необходимые изменения в их код;
2) не совсем поняли, о каких идентификаторах идет речь. Просьба описать пожелание более подробно.
Не буду ругаться, но зачем давать очевидные советы.
----------------------
Я специально подчеркнул что речь о встроенных индикаторах.
Вам объяснить в чем разница?
Предлагаю реализовать
 
Добрый день,
Ув. разработчики
Предлагаю  реализовать возможность:
---------------------------
1) изменять параметры встроенных индикаторов   из скрипта индикатора.
-------------------------
2) устанавливать идентификатор индикатора из скрипта индикатора.
Индикаторы. OnCalculate. Количество полных проходов по всем свечам
 
Цитата
Nikolay написал:
Цитата
Anton Belonogov написал:
Илья ,

Действительно, в описанных Вами ситуациях вызов OnCalculate происходит дважды.
Мы исправим данную ошибку в одной из очередных версий ПО.
Это сейчас серьезно? Почему же все эти годы не исправлялось. Сообщения были об этом очень-очень давно.
Вполне серьезно. проблема была выявлена при появлении VMLua  в КВИКЕ.
Пришлось сделать костыли.
Более быстрый перебор ключ - значение в таблице
 
Цитата
Цитата
Serge123 написал:
Вот загадочное и интересное сообщение:  https://forum.quik.ru/messages/forum10/message34083/topic3921/#message34083
См. также typedef struct Table в  https://www.lua.org/source/5.1/lobject.h.html
Можно ли как-то получить адрес этой структуры таблицы в программе на Lua и C, чтобы, скажем, напрямую читать
TValue  *array;  /* array part */ ?
Т.е. в случае C минуя rawgeti и стек Lua?
Можно.  Делал это на 5.3.
таблица "depo_limits" . Что не так?
 
сейчас все нормально.
таблица "depo_limits" . Что не так?
 
Добрый день,
-----------------------
Проблема с чтением позиции по инструментам
----------------
В терминале позиция SBER есть  со сроком расчета T0 позиция 120


---------------
При чтении таблицы в скрипте
Код
local s="depo_limits";
local N1=getNumberOf(s)-1
for j=0,N1 do local x=getItem(s,j);
 if x and x.sec_code==sec then Qp=x.currentbal; jdep=j;
   Log:write(value2text(x,"depo=").."\n");Log:flush(); -- вывод в лог файл
   end;
end
есть только с limit_kind <0, естественно позиция НОЛЬ
Код
depo={
["trdaccid"]=NL0011100043,
["currentlimit"]=0.0,
["locked_buy"]=0.0,
["currentbal"]=0.0,
["limit_kind"]=-2000001,
["locked_buy_value"]=0.0,
["openlimit"]=0.0,
["openbal"]=0.0,
["awg_position_price"]=0.0,
["sec_code"]=SBER,
["locked_sell"]=0.0,
["wa_position_price"]=0.0,
["client_code"]=10326,
["wa_price_currency"]=SUR,
["locked_sell_value"]=0.0,
["firmid"]=NC0011100000}

версия 11.1.0.45
демо сервер.
----------------------------
Что не так?
Робот в виде скрипта индикатора
 
При запуске Квик работет в процессах , в приложениях его нет . В окне нет ., Кошмарит уже год , два .
 
Цитата
Александр Васильев написал:
конечно в 9.30
При запуске Квик работет в процессах , в приложениях его нет . В окне нет ., Кошмарит уже год , два .
 
Цитата
Александр Васильев написал:
Да как то , у вас таблица процессов , там нихера ничего сделать нельзя ,  а нет квика в приложениях , и фиг вы его увидите  .
Приложение QUIK называется info.exe
Робот в виде скрипта индикатора
 
Написал робота.
Получилось 180 строк, примерно 200 операторов.
---------------------
Робот позволяет написать правило для индикаторов на графике
и по сигналам этого правила покупает или продает  заданное количество.
При этом снимает заявки, если они не исполняются заданное время.
-------------------
Сейчас процесс отладки.
-----------------
Отладил режим советника.
Вот картинка сигналов робота. На графике два мувинга .

это основная часть робота-индикатора:
Код
paths = "D:/QUIK_SCRIPT/" -- путь к файлу nkbot24_func.luac
dofile(paths.."nkbot24_func.luac")

Settings.account=""; Settings.client=""; --вписать счет и клиент
Settings.Nind=2;
function OnCalculate(i)
   Hi,Li=H(i),L(i);
   if i==1 then _nkInit(); return end--инициализация
   _getI(i); --читаем значения индикаторов
   f=_cross(1,1,2,1,i);  -- сигнал пересечение линий индикаторов
   _torg(f,i); --выставляем заявки по пересечению
   return SE,BU;  -- отображаем сигналы в режиме советника
end

Хотел выложить nkbot24_func.luac, но форум не принимает такие файлы.
--------------
При запуске Квик работет в процессах , в приложениях его нет . В окне нет ., Кошмарит уже год , два .
 
Цитата
Александр Васильев написал:
Ну тогда внимательно читаем заголовок , в процессах квик есть , работает , а в приложениях его НЕТ ( не развернуть , не свернуть ) а из процесса его никак не выдернуть в окно . Смыл сообщения , я столько мучился и во на тебе , нашёл в 2016 году . А ведь всегда искал . А скрипт дело 10 е  пару дней  пока .
Ну внимательно читаем - написано на картинке Приложений(7)
седьмое- это КВИК.
Что не так,
Индикаторы. OnCalculate. Количество полных проходов по всем свечам
 
можно еще проще сделать:
Код
function OnCalculate(index)
 
  if index == 1 then
    
    _ds = getDataSourceInfo()
 --....
    
  end
  
  return 0
  
end 


вообще не определять, будет глобальным.
При запуске Квик работет в процессах , в приложениях его нет . В окне нет ., Кошмарит уже год , два .
 
Цитата
Александр Васильев написал:
отвечу на заголовок:
приложения - это процессы.
И КВИК там и работает.
Вот картинка диспетчера задач:  Читаем внимательно надписи вкладок и открытого окна

====================
Относительно ошибок при загрузке скрипта.
Уверен, что ошибки в Вашем скрипте.
Покажите Ваш скрипт, если хотите их иcправить.
Индикаторы. OnCalculate. Количество полных проходов по всем свечам
 
Цитата
Илья написал:
Есть ли вариант сохранения состояния расчета между вызовами OnCalculate?

Вчера пытался в таблицу Settings  добавить свою таблицу рассчитанных при первом проходе значений, чтобы при следующих просто из нее вытащить. Знаю, что в руководстве написано "Типы пользовательских параметров: числа и строки"
До перезапуска терминала (накидал скрипт, пока терминал работал), вроде, получилось: значения и сохранялись, и выбирались.
Но при последующем запуске терминала выводилась ошибка об отсутствии моей таблицы.
Хотел сделать через замыкание, но, опять же, где хранить этот объект?
Опишите переменную вне функции OnCalculate.  
Например, у Вас выше написано так:
Код
function OnCalculate(index)
  
  local _ds = nil
  
  if index == 1 then
    
    _ds = getDataSourceInfo()
 --....
    
  end
  
  return 0
  
end 

переменная _ds всегда затирается при входе в OnCalculate
чтобы этого не было сделайте так:
Код
local _ds;
function OnCalculate(index)
  if index == 1 then   
    _ds = getDataSourceInfo()
  --....
  end
 
  return 0
  
end
Робот в виде скрипта индикатора
 
Добрый  день,
Рассказываю, как просто сделать робота в виде скрипта индикатора.
Сначала картинка работы такого робота.


В чем достоинство такого робота по сравнению с роботом на основе колбеков.
Робот значительно проще написать
Он загружается на график торгуемого инструмента,
Если для реализации алгоритма торговли  достаточно встроенных в QUIK индикаторов,
то нет надобности их программировать.
----------------  
Пример варианта основного  фрагмента такого робота:
Код
name="nkbot24"
Settings={["Name"] =name,["line"] ={},["account"]="",["client"]="",["Q"]=1;["wt"]=1000,["short"]=0}
Settings.Nind=0;

paths = "D:/QUIK_SCRIPT/"
package.cpath =package.cpath ..";"..paths.."?.dll";
package.path =package.path..paths.."?.lua;"
fnlog=paths..name..".log"; Log=io.open(fnlog,"w")

loadfile(paths.."nkbot24_func.lua")

function nkbuy(i,f)
---алгоритм покупки
 -- f=cross(1,1,2,1,1);
return f;
end

function nksell(i,f)
--алгоритм продажи
-- f=cross(1,1,2,1,1);
return f;
end

function nobuy(i,f)
--фильтр покупки
return f;
end

function nosell(i,f)
--фильтр продажи
return f;
end

function OnCalculate(i)
   local i1=i-1;
   if i==1 then nkInit(); return end
   if i~=i_ then    getI()   end
   N,torder=order(N);    Q=depo();
   if #t==0 then
--      f,j=cross(1,1,2,1,5); --пересечение двух индикаторов
      if i~=i_ then torg(nkbuysel(i));end
      M=os.clock();
   else
      del_ord(M);
   end
   i_=i;
return M1,M2;
end
Продолжение вероятно следует...
Сдвиговые регистры, циклические массивы. Экономим память
 
чтобы массив был ограничен по размеру, его надо закольцевать.
Очевидно, Виктор  это не проходил.  
Сдвиговые регистры, циклические массивы. Экономим память
 
VPM,
Я ранее написал, что Ваш вариант - это недоделанный циклический массив, тест которого я привел вторым.
Рекомендую доделать, тогда будет работать , но чтение из него в луа, как тоже уже писал, медленнее чем из сдвигового.
Сдвиговые регистры, циклические массивы. Экономим память
 
VPM,
Можете пояснить,
как в вашем варианте прочитать весь массив с 1 по последний
и сколько времени на это уйдет по сравнению с чтением типа t[i]  где i от 1 до #t.
--------------
И для какой задачи Вы планируете его применять.
-------------
Я определил область применения моего варианта.
А как применять Вашу очередь?
Сдвиговые регистры, циклические массивы. Экономим память
 
VPM,
вот результаты  тестов:
это тест моих функций  сдвиговый  массив.
Код
local M=1000000
local t=newCA(1024)
for i=1, M do  setCA(t,i) end
count1 = collectgarbage("count") print("объем занятой памяти",count1//1);
--------------------------------
collectgarbage("collect") count1 = collectgarbage("count") print("объем занятой памяти после сборщика мусора",count1//1);

результат:
Код
>D:/lua53/lua53.exe -e "io.stdout:setvbuf 'no'" "Test_List.lua" 
объем занятой памяти   82.0
объем занятой памяти после сборщика мусора   76.0
>Exit code: 0
тест циклический массив:
Код
local M=10000000
local t=nk_newV(1024)
for i=1, M do  nk_push(t,i) end
count1 = collectgarbage("count") print("объем занятой памяти",count1//1);
collectgarbage("collect") count1 = collectgarbage("count") print("объем занятой памяти после сборщика мусора",count1//1);
результат:
Код
>D:/lua53/lua53.exe -e "io.stdout:setvbuf 'no'" "Test_List.lua" 
объем занятой памяти   97.0
объем занятой памяти после сборщика мусора   91.0
>Exit code: 0
тест для Вашей функции
Код
local M=10000000
local list=List.new()
local count1 = collectgarbage("count") print("начальный объем занятой памяти",count1//1);
--------------------------
for i=1, M do  List.pushlast(list,i)   end
collectgarbage("collect") count1 = collectgarbage("count")  print("объем занятой памяти после сборщика мусора",count1//1);
результат:
Код
>D:/lua53/lua53.exe -e "io.stdout:setvbuf 'no'" "Test_List.lua" 
начальный объем занятой памяти   65.0
объем занятой памяти после сборщика мусора   262203.0
>Exit code: 0
Какой еще тест сделать?
Уникальный номер заявки
 
Цитата
bespalex написал:
это конечно вариант, но мне он не нравится отсутствием изящества, громоздкостью что ли. Кроме того, как справедливо раньше вы подметили, при работе с питоном приходится экономить операции.
На эту проблему накладывается возможное отсутствие trans_id в сообщениях, который я поддерживаю уникальным на своей стороне. Городить два индекса совсем не хотелось.
И что делать, если order_num не приходит? Ждать? Сколько? получается заявка в неопределенном статусе может находиться неопределенное время.
Можете показать пример громоздкости или затрат на вычисления?
---------------------
Вся история предыдущих дней в худшем случае обрабатывается  один раз до начала торгов. в лучшем случае обрабатывается вчера.
Сдвиговые регистры, циклические массивы. Экономим память
 
Если Вы считаете, что Вы правы, то просто покажите свой тест и результаты и будет предмет обсуждения.
Пока же у Вас лишь программа и ваша вера, что она экономит память.
Сдвиговые регистры, циклические массивы. Экономим память
 
Если Вы считаете, то просто покажите свой тест и результаты и будет предмет обсуждения.
Пока же у Вас лишь программа и ваша вера, что она экономит память.
Сдвиговые регистры, циклические массивы. Экономим память
 
Цитата
VPM написал:
Вот из букваря:

 Стек   — это коллекция, элементы которой получают по принципу «последний вошел, первый вышел» (Last-In-First-Out или LIFO).
Это значит, что мы будем иметь доступ только к последнему добавленному элементу.

 Очереди     очень похожи на стеки. Они также не дают доступа к произвольному элементу, но, в отличие от стека, элементы кладутся (enqueue) и забираются (dequeue) с разных концов.
Такой метод называется «первый вошел, первый вышел» (First-In-First-Out или FIFO).
То есть забирать элементы из очереди мы будем в том же порядке, что и клали. Как реальная очередь или конвейер.

 Двусторонняя очередь   (Double-ended queue), или дек (Deque), расширяет поведение очереди.
В дек можно добавлять или удалять элементы как с начала, так и с конца очереди.
Такое поведение полезно во многих задачах, например, планирование выполнения потоков или реализация других структур данных.

Позже мы рассмотрим   вариант реализации стека с помощью двусторонней очереди  .
Будем считать, что у нас разные определения этих понятий.
------------------------------
Но это не важно.
Важно, что ваш вариант не работает.
Сдвиговые регистры, циклические массивы. Экономим память
 
Цитата
VPM написал:
nikolz,  Это я и хотел сравнить, сделать один размер массивов, один размер окна прогнать на скорость на память, на время исполнения?
Цитата
nikolz написал:
и еще...
ваша стек-очередь напоминает недоделанный циклический массив.
Если его доделать, то он будет делать ровно тоже самое, что и мой вариант сдвига массива выше.
--------------------
Циклический массив работает быстрее, чем сдвиг массива.
Но в луа из него медленнее брать данные.
Его интереснее делать на C и встраивать сразу в индикаторы и фильтры.
Но это уже другая тема.
Вы нем поняли. В вашем случае нельзя сделать размер постоянным.
Он будет лишь увеличиваться при записи в конец.  Но не будет уменьшаться.
----------------
Это я показал Вам в своем тесте.
Там в конце Ваша очередь-стек имеет ноль элементов , но размер памяти занятый массивом остался такой же как при записи миллиона элементов.
--------------------
В моем варианте Вы изначально фиксируете длину массива и она остается всегда такой же.
CalcBuySell. Что не так?
 
Владимир,
Вы прежде, чем писать херню, прочитали бы о чем тема.
-------------------------------
Специально для вас, поясняю.
Речь идет о работоспособности функций библиотеки QLUA,
а не о написании примитивных вычислений..
-------------------------------
Вы уже написали свой "гениальный" шедевр  очереди,
которая стек и которая лишь увеличивает размеры используемой памяти.
Но почему молчите о том что написали говно?
------------------
Если у Вас проблема с написанием таких программ,
то пишите конкретно вопрос, а не скулите.
--------------
Программатор Вы наш.
Сдвиговые регистры, циклические массивы. Экономим память
 
и еще...
ваша стек-очередь напоминает недоделанный циклический массив.
Если его доделать, то он будет делать ровно тоже самое, что и мой вариант сдвига массива выше.
--------------------
Циклический массив работает быстрее, чем сдвиг массива.
Но в луа из него медленнее брать данные.
Его интереснее делать на C и встраивать сразу в индикаторы и фильтры.
Но это уже другая тема.
Сдвиговые регистры, циклические массивы. Экономим память
 
Цитата
VPM,
Возможно я не понял, вопроса,
Но так как Вы возвращаетесь к этой идеи уже многократно, то поясню подробнее в чем у Вас ошибка.
---------------------
Во-первых, в терминологии.  
Вы уж не обижайтесь, но прежде, чем обсуждать надо быть уверенным ,
что мы с вами горшками называем горшки, а цветами -цветы.
------------------
Так вот,
Стек и очередь это две большие разницы.
Стек - это кипа - т е представьте кипу листов бумаги на столе. Вы положили лист сверху и взяли его.
--------------------
или еще пример стека - это обойма в автомате  патрон лежащий сверху выйдет первым.
-----------------
Т е принцип последним зашел -первым вышел.
-------------------------
Очередь  -это первый зашел и первым купил.
Наглядный пример - очередь в магазине за яйцами.
------------------------
Поэтому невозможно стек сделать из очереди.
Если конечно Вы не сторонник смотреть гланды через зад.
====================
Но это не главное.
========================
Давайте посмотрим на то как вы пытаетесь  уменьшить память, создав нечто,
в котором Вы синхронно выкидываете первый элемент и запихиваете последний.
----------------------------
Ничего это вам не напоминает? А посмотрите эту мою тему Про сдвиговые регистры.
Именно это и происходи в них.
--------------------
Но они реализуются методами, которые я описал выше.
===================
Если же Вы будете просто в массиве луа стирать первый элемент,
записывая туда nil и добавлять в конец новый, то массив будет увеличиваться на этот новый элемент.
----------------------------------------
В луа для хранения одного числа в таблице тратится 12 байт.
Когда Вы пишите nil в первый элемент, то память из под него не освобождается,
так как ее невозможно удалить из того блока памяти, который уже выделен для этого массива.  
-------------------
В лучшем случае освободится память на элемент массива, если он является тоже таблицей.
======================
вот ваш вариант.
Код
---- Операции вставки -- table.insert
function List.pushlast (list, value)   local last = list.last + 1;   list.last = last;   list[last] = value; end
---- Операции удаления -- table.remove
function List.popfirst (list)
  local first = list.first;  if first > list.last then   return nil   end
  local value = list[first]   list[first] = nil   list.first = first + 1  return value  end
list[last] = value;  -- этот оператор записывает в таблицу новое значение.
--------------------------------
При создании таблицы , ей выделяется место в оперативной памяти.  
----------------------------------
Если при записи нового значения места не хватает, то оно будет увеличено.
-----------------------
C точки зрения сборки мусора.
Объектом для сборки является вся таблица, а не отдельная ее ячейка.
================
Когда Вы в функции popfirst  делаете это:    list[first] = nil
то в ячейке таблицы в параметр тип элемента записывается ноль.
Но память для хранения этого типа и значения элемента не может быть освобождена,
так как она не является самостоятельным объектом. Это часть память таблицы.
=======================
Таким образом, в вашем варианте таблица может только увеличивать объем занимаемой памяти, но не уменьшать ее.
=========================
Уменьшать, можно лишь так, как я рассказал в этой теме.

Уникальный номер заявки
 
номер сделки и дата торгов
Уникальный номер заявки
 
Цитата
bespalex написал:
Уникальность номеров заявок order_num поддерживается только внутри одного торгового дня. Также как и trade_num для сделок.
Получается при использовании этих параметров в качестве индекса может возникнуть ситуация, что записи имеющиеся совпадут по индексу с новыми заявками и сделками дня, что может привести к труднопредсказуемым последствиям.
Использовать trans_id  в качестве уникального индекса тоже ненадежный способ, т.к. логика его передачи в сообщениях нестабильна. Также например случаются существенные задержки с поступлением OnTransReply и тогда невозможно отменить заявку, т.к. для этого необходим order_num, которого у нас еще может не быть.
Кто как решает эту проблему?
Внутри дня используем номе сделки
А между днями - дополнительно дату.
Устроит такое решение?
Страницы: Пред. 1 2 3 4 5 6 7 8 9 10 11 ... 69 След.
Наверх