Господа, вопрос не совсем по Луа. Но может быть кто то поможет. У меня две виртуалка, на них установлена Windows Server 2003 На одной виртуалке стоят расчётные роботы, которые "готовят" файлики с параметрами. На второй виртуалке стоит робот, который торгует. Он должен прочитать файлик с параметрами, лежащий на первой виртуалке, например с помощью функции dofile. Как это сделать? Папку с файлом на первой виртуалке нужно сделать общей. Я не умею соединять две виртуалки между собой. Спасибо заранее, если кто то знает.
Уточнение. Выключение скрипта с помощью кнопки Остановить освобождает память. Но если он останавливается по причине выполнения всех задач (нет вечного цикла while is run do и при этом закончилась функция main), то память не освобождается.
Господа, прошу подсказать. Мои скрипты работают на луа. Я объединяю данные в огромную таблицу. Вот образец данных: Таких файлов десятки. Я их склеиваю в одну большую таблицу с помощью функции:
Код
function tableMerge(table1, table2)
for k,v in pairs(table2) do
--deceleration()
table.insert(table1,v)
--проверим качество данных в таблице. Нет ли разрывов в записях.
-- if v.stime-(remember_prev_time or v.stime)>100 then
-- mm("в таблице дырка "..v.stime.." "..v.bid)
-- end
remember_prev_time=v.stime
end
remember_prev_time=nil
return table1
end
В итоге получается огромная таблица, которая сильно забивает память. --- Вот как это выглядит на виртуалке. А теперь мой вопрос. в конце работы скрипта я УБИВАЮ эту гигантскую таблицу с помощью строчки t_big=nil Надеюсь, что при этом будет освобождена память. Но этого не происходит. Более того. Остановка скрипта не освобождает память. Она освобождается только с выключением КВИКа подскажите как освобождать память силами самого скрипта. Спасибо. --- П.С. Я знаю, что мой подход сам по себе не совершенен. Иду по пути переноса громоздких функций в dll. Но в силу слабеньких мозгов мне ещё далеко до этого. Так что пока работаю в рамках Луа.
возможно ему dll в таком виде и не нужно ... :) кто сказал, что нужно всё тащить в луа-машину? может брать данные, юзать их снаружи и выполнять как внешнюю транзакцию: - модульная масштабируемая и кастомизирумая структура, ключевое слово - структура - разделение на дата-екзекушн -более, чем логично - исключение gui - как в принципе самой тормозной и ненадежной части - перспектива на прямое/другое подключение результата усилий
уточните пожалуйста о чём речь. Вы имеете в виду, что не покидая языка Луа, можно по особому написать код (на Луа), чтобы он был быстрым? что значит "брать данные, юзать их снаружи и выполнять как внешнюю транзакцию "?
Я качал эти файлы с сайта lua.org и кидал в папку где лежит моя программа для Си++. CodeBlocks называется. Судя по вашим словам их можно было не кидать в эту папку, а подключить как то иначе?
Добрый день. Не могу сообразить как мне получать обезличенные сделки без открытия таблицы обезличенных сделок. Здесь где-то писали, что это можно делать через заказ тикового графика INTERVAL_TICK Но мне нужны параметры обезличенных сделок, такие как Купля-Продажа. Как это реализовать через заказ тикового графика?
Господа, я с горем пополам выучил Луа. Но его возможностей мне уже не хватает, так как накапливаю большие объёмы данных и обрабатываю их. Теперь начал с горем пополам учить С++. Не могу понять как написать простейший dll-файл под КВИК. Например, файл принимает данные текущей таблицы по инструменту SBER (колбек OnParam). Подскажите пожалуйста. Премного благодарен. Прошу простить за тупенькие вопросы.
Спасибо за ответ. Я скорее всего так и поступлю. Какой язык лучше использовать? В моём случае это равносильно вопросу "какой язык учить". Чистый Си или Си++? Задача будет такая: получение данных из квика и перебор их брутфорсом. Скорость обработки должна быть максимальной.
Друг посоветовал учить язык Golang. Мой тестер стратегии на Луа просчитывает массив данных за 7 часов. Golang это сделает за час. Посоветуйте пожалуйста как из скрипта Луа запускать файл с кодом .go Можно ли это делать через dofile? Или сделать третий файл с флагом вкл/выкл, который будет читаться скриптом на go?
Добрый день. У меня при сохранении настроек выставлена опция В этом состоянии КВИК работал много месяцев. В КВИКе запущены роботы. Включена лента обезличенных сделок по 1 инструменту Си. Сегодня заметил, что КВИК тормозит. Начал думать из-за чего. Увидел, что файл info.log достиг 80 мегабайт. Файл curr_data.log около 10 мегабайт. Удалил все .dat файлы, удалил info.log и curr_data.log Запустил чистенький КВИК. Быстро файл info.log набрал опять под 100 мегабайт. Торможение никуда не делось. Переключение между вкладками происходит с подвисанием на 3-10 секунд. То есть каждая манипуляция в КВИКе сопровождается дикими торможениями.
Suntor, эта проблема появилась только сейчас, когда я перестал делать flush на каждой записи. До этого я несколько недель подряд записывал каждый день без перерыва и такой проблемы не было. Она абсолютно новая. Вызываю я функцию так:
Выключил flush. Почему-то на всех сегодняшних файлах стал появляться одинаковый глюк: вот такое искажение: неадекватная (неполная строчка). Плюс пропуск нескольких секунд. До ошибки время 184444, после ошибки 184449. Может быть я в это время его включал-выключал, но я увы не помню этот момент. Днём на 1 из файлов было то же самое. Раньше, когда flush работал, такого не было. Видоизменил функцию. Добавил в неё flush 1 раз в 100 записей по данной бумаге:
Код
count[paper]=(count[paper] or 0)+1
if count[paper]==100 then
rn[paper].handler:flush()
count[paper]=0
end
Спасибо, друзья. Проясняется, хотя мне очень тяжело с этим разбираться. Не то образование... Вот текущая редакция функции, которая пишет слепки стакана. Триместр сменился, если путь поменялся. В этом случае закрываем старый файл, открываем новый.
Suntor если я уберу flush при каждой записи, не появятся ли чрезмерные риски того, что какая-то часть данных не запишется? Ну например я принудительно остановил скрипт. Ведь в этом случае какие-то строчки потеряются? Или не потеряются?
Алексей написал: Таблица дескрипторов файлов (rn) у Вас - глобальная. Где-то вне функции rec_big_data Ваш скрипт, судя по всему, в нужный момент понимает, что нужно сменить номер триместра. Что Вам мешает в этот момент просто позакрывать все файлы, зная их дескрипторы из таблицы rn?
Добавил в функцию переменную files_qty - это количество бумаг, которые пишутся. Если размер таблицы rn больше files_qty, значит сменился триместр и надо закрывать старые файлы. Очевиден недостаток: при смене триместра функция один раз закроет хороший файл - файл новенького триместра. Потом ей придётся его переоткрывать. Спасибо за комментарии. Они очень помогают.
Как мне отлавливать средствами Луа, Windows или специальных программ открытые в данный момент луа-файлы? В Windows server 2003 эта функция не работает и не лечится. Я искал советы по данной проблеме, но они не сработали.
Спасибо за ответы. Разрешите задать ещё вопрос. Я открыл файл с помощью io.open. После этого я остановил скрипт. Файл останется открытым, верно? Если да, то следующий вопрос. Я запустил скрипт и снова открыл этот же файл с помощью io.open. Теперь у меня два открытых файла? --- И ещё один вопрос. Как мне принудительно закрыть файл, имея не дескриптор, а только путь file_path? --
Спасибо. подумаю И ещё вопрос. Я открываю много файлов с помощью dofile Файлы имеют вид Файлы огромных размеров. После исполнения dofile эти файлы остаются открытыми? Надо ли заботиться о том чтобы их закрывать?
Господа, прошу подсказать. Этой функцией я записываю текущую маркет дату
Код
function rec_big_data(file_path,value)
if rn==nil then rn={} end
if file_open==nil then file_open={} end
if file_open[file_path]==nil then
rn[file_path]=io.open(file_path,"a+")
file_open[file_path]=true
mm("QL:open file "..file_path)
end
rn[file_path]:write(value.."\n")
rn[file_path]:flush()
end
file_path меняется три раза в день (в его название включён тикер, текущая дата и номер триместра: утренняя сессия 1, дневная сессия 2, вечерняя сессия 3). вот пример historyGDM8 20180511-2.lua В функции нет закрытия файла, потому что файл становится огромным, и скрипту тяжело его постоянно открывать-закрывать. Робот пишет большое количество инструментов много дней подряд. Файлы остаются открытыми. Я замечаю, что виртуалка начинает тормозить. Думаю, что это из-за незакрытых файлов. Подскажите пожалуйста как грамотно закрывать файл в конце триместра (при переходе на новый файл) с помощью close()? Не могу сообразить, что в неё писать. Спасибо.
Господа, помогите пожалуйста советом. Хочу написать гибкий цикл, в котором можно возвращаться на шаг назад, и перебирать данные с разным шагом. Постарался описать это здесь:
Код
iterations=20
start=0
finish=100
step=(finish-start)/iterations
for i=start,finish,step do
--делаем расчёт.
if profit>0 then
--возвращаемся на step назад
--iterations=100 (шаг становится более мелким)
end
end
то есть если я при переборе большого массива данных (слепки стакана) наткнулся на прибыльный участок, то я хочу проанализировать его тщательно, с более мелким шагом. А потом, когда снова пошли убыточные участки, хочу вернуться на прежний шаг - обычный.
Мда.. переписал код. Теперь оперативная память не заполняется, но продолжительность расчёта возросла невероятно. Перебираю данные по Си за 3 дня. Раньше на 1 итерацию (перебор всех данных за 3 дня) уходила 1 секунда, теперь 8. У меня 10 фьючерсов, и в каждом переборе брут форсом 100 итераций. -- Моя цель была давать ему на обработку десятки и сотни дней...
Друзья, как вы можете прокомментировать такую информацию с сайта Луа про функцию loadstring
Цитата
The loadstring function is powerful; it must be used with care. It is also an expensive function (when compared to its alternatives) and may result in incomprehensible code. Before you use it, make sure that there is no simpler way to solve the problem at hand.
В нынешнем варианте мой скрипт бегает по полям гигантской таблицы, а теперь будет бегать по строчкам файла. Не получится ли чрезмерная нагрузка на процессор, замедление работы и т.д. Торгующий робот установлен там же где и считающий, поэтому для меня такие вещи важны.
Suntor, запустил первоначальный вариант кода на боевой виртуалке, на которой возникает проблема not enough memory. (подвисание квика было не на ней, а на ноутбуке).
Николай Камынин, пытаюсь сделать по вашему совету. Читать новую строчку в файле и сразу обрабатывать логику. Столкнулся с непонятным моментом. --- Данные хранятся в файле в таком виде:
Ранее я с помощью скрипта рисовал в начале t={ а в конце } и исполнял этот файл с помощью dofile() Получал таблицу, а потом объединял её с другими днями-таблицами. --- Теперь, чтобы не забивать оперативку, я делаю так:
Но прочтённые строки не воспринимаются как таблицы. Это стринг. Посоветуйте пожалуйста как быть. Спасибо.
Suntor Ваш код сразу вешает КВИК, и его приходится принудительно закрывать. так что результата никакого нет.
Николай Камынин, collectgarbage() надо ставить в таком виде как вы написали или в скобках ещё какие-то аргументы? --- И ещё. Господа, вопрос немного другой. Мне очень долго будет оптимизировать код по совету Николая "грузите в память лишь то что обрабатываете". Я плохой кодер, а код в нынешнем виде работает и справляется с анализом 5-7 дней (его выбивает когда я хочу прочесать больше данных) Мой вопрос следующий: можно ли обойти это ограничение Луа "not enough memory"? Или оно непобедимо?
Робот работает на виртуалке Windows Server 2003 Я обрабатываю луа-скриптом таблицу с гигантским количеством полей (запись слепков стакана за 10 дней и более). Робот при добавлении очередного дня-таблицы со слепками в общую огромную таблицу вылетает с ошибкой not enough memory, хотя оперативной памяти хватает. Я добавлял на виртуалку ещё 1 ГБ опер.памяти, чтобы наверняка хватало, но всё равно скрипт вылетает с этой ошибкой. Гуглил эту ошибку в интернете, нашёл такую ветку с обсуждением этой темы: https://github.com/minetest/minetest/issues/2988 Нашёл там такую фразу Lua has no problem consuming 2GiB, but LuaJIT bails at 1GiB. Вот: Я, увы, не сильно понял в чём дело и что такое LuaJIT. Но у меня вылетает скрипт как раз на 1 гигабайте оперативки. Прошу подсказать решение проблемы. Также я не понял что это за код, который советует использовать комментатор. Он превращает числа в строки? Но как я это могу применить у себя? Заранее спасибо.
Добрый день. У меня в файл записываются мелкие числа в таком виде: EuM8=7.5599999999996e-005. Это одно из полей таблицы. В дальнейшем робот обращается к этой таблице и не может прочитать это значение.
Вопрос 1. Как записывать мелкие числа в обычном виде?
Вопрос 2. Если пробовать работать с этим числом (кривым), то как его читать?
Добрый день. Пользуюсь колбеком OnTransReply При снятии заявки приходит такая строчка: 04/12/18 13:07:20,267 price=0;client_code=.....;balance=4;time=130720;status=3;qty=0;trans_id=930631256;account=;exchange_code=;quantity=0;firm_id=.........;flags=262145;result_msg=(210) Снято заявок: 1. Снято количество: 4. Нельзя снимать: 0.;brokerref=;order_num=0;R=930631256;server_trans_id=359;uid=.........;ordernum=0;
Как эту запись не перепутать с отчётом о зарегистрированной заявке? В вышеназванной строчке какой признак говорит о том, что пришло снятие? price=0, qty=0 или другие? Или достоверным является только result_msg=(210) Снято заявок: 1. Снято количество: 4. Нельзя снимать: 0
прошу подсказать. Я считаю сумму проторгованных контрактов из таблицы всех сделок. Мне интересны только сделки за последние 60 секунд. В только что написанном коде следующий алгоритм. Он внутри колбека OnAllTrade
Код
sum_vol=0
for n,w in pairs (simple_volume) do
vremya_diff=stime-simple_volume[n].time_time
if vremya_diff>60 then
simple_volume[n]=nil
else
sum_vol=(sum_vol or 0)+simple_volume[n].deal
end
end
simple_volume-это глобальная таблица. В ней есть микро-таблицы, посвящённые каждой сделке. В каждой из микро-таблиц есть поля time_time(время) и deal (объём)
Моё сомнение связано со строкой simple_volume[n]=nil
Я делаю перебор таблицы, и в ходе этого перебора удаляю элемент. Можно ли так делать, и не собьётся ли итоговый подсчёт суммы контрактов?
Добрый день. Есть ли в КВИКе такое явление: инвесторские ключи или инвесторский пароль? Я хочу дать КВИК человеку, чтобы он смотрел счёт, видел рынок, но не мог совершать сделки/отправлять заявки. То есть просмотровый режим
Подскажите пожалуйста. Немного запутался. Нужно ли мне держать открытой таблицу обезличенных сделок при работе с коллбеком OnAllTrade()? Или достаточно выставить птички в заказываемых инструментах? Спасибо.
Прошу подсказать, как вылечить эту проблему. График Открытого интереса выглядит так (количество открытых позиций): Пропуски свечей за сегодня за то время, пока КВИК был выключен. Брокер Открытие. --- Получение пропущенных данных включено: --- Кнопка Обновить нажималась, даже пришло сообщение что "Получены пропущенные данные". Но это не так. Дырки на графике остались.