Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
09.01.2024 19:53:29
nikolz, Написаны они у меня практически все , отдельно оценить нельзя так как работают в составе какой то стратегии, активно пользуюсь Decycler только индикатором в основном однополосным. Но интересны не его примеры индикаторов, а его фильтры, посмотрите "швейцарский складешок", если не найдете я более точно на пишу. А Вам зачем?
Пользователь
Сообщений: Регистрация: 19.02.2022
09.01.2024 20:09:08
Цитата
VPM написал: , я просто пошутил, да и результаты нужны статистически значимые (ведь задача стоит сделать стабильный доход!)
Цитата
Владимир написал: , А как быть с экспирациями? С банкротством? С долгими годами ожидания, когда позиция выйдет в плюс?
Мой ответ был как в анекдоте про математиков. Совершенно точный и совершенно бесполезный :) Я ж нигде не сказал, что сам так делаю? =)
Вот два примера из моего, так сказать, недавнего опыта: 1. В ноябре я накосячил в скрипте в самых базовых вещах, где и накосячить, казалось бы, нельзя. В результате он нахватал в портфель всякого говна, часть из которого к декабрю закрылось в плюс, а остальное ушло в глубокую жопу. После чего я совершенно спокойно закрыл эти убыточные позиции, чтобы высвободить средства и отлаживать скрипт дальше в "боевом" режиме, пусть и с меньшим депозитом - пусть выкручивается сам, сволочь такая ) 2. Эта сволочь купила UCSS, который решил слинять с биржи, за 3 дня до этого события. После предупреждения брокера о том, что фирма планирует сделать ручкой, также вручную закрылся в убыток (правда, совсем смешной - что-то около 150 рублей), после чего у скрипта появился "блеклист" для тикеров, с которыми вообще никогда не надо связываться.
Зато вот с начала декабря, когда косяки были выпилены, скрипт-таки начал реализовывать изначальную задумку. И практически все, что было куплено - продано с профитом, только пара тикеров болтается в портфеле со смешной просадкой от -1,5 до -4%, да периодически что-то покупается и продается.
Пользователь
Сообщений: Регистрация: 15.06.2023
09.01.2024 20:15:24
Glukator, А вы сделки каким либо образом оцениваете, я имею ввиду результат?
Пользователь
Сообщений: Регистрация: 15.06.2023
09.01.2024 20:23:16
Ну к примеру сделка прошла (не обязательно закрытие но и уменьшение позиции) я сохраняю в таблицу такие показатели (Выиграла +1 Проиграла -1,), то есть количество выиграны и проигранных сделок, плюс сам результат, это позволяет делать оценку торговой системы, как я уже приводил?
Пользователь
Сообщений: Регистрация: 19.02.2022
09.01.2024 20:26:36
Цитата
VPM написал: , А вы сделки каким либо образом оцениваете, я имею ввиду результат?
Элементарно - по доходности в процентах годовых. У меня задана целевая доходность 25% годовых, которая в большинстве случаев перекрывается с огромным запасом. Вот к примеру выдержка из лога:
Есть какие то первые результаты за период которые можно оценить? Ральфа Винца не читали?
Пользователь
Сообщений: Регистрация: 25.09.2020
09.01.2024 21:12:48
Glukator, А я делаю именно так. За исключением случаев, когда так нельзя делать.
Я немного делаю явных косяков: всё-таки программист почти полвека. У меня был более тяжёлый случай: в биржевых делах я не разбираюсь, и говно от хороших тикеров отличаю только по ликвидности: если народ там ковыряется, значит, и нам можно. Да и кто заранее может сказать, что говно, а что нет. И потом я заметил, что нормальные тикеры хорошо торгуются иногда вылетают из портфеля, снова заходят, а вот говно тоже торгуется, но постепенно оседает в портфеле, связывая всё больше денег. Процесс настолько медленный, что я заметил это где-то через полгода. И тогда я ввёл рейтинги тикеров, которыми управлял через контекстное меню тикера: "говно", "мусор" и так далее до "отличного". И немного перенастроил алгоритм, чтобы "говно" из портфеля скрипт старался выводить, а хорошие тикеры, наоборот, старался придержать а портфеле. А уж разрешение тикеру покупать или продавать изначально было заложено в меню - это два бита, 4 состояния. Очень удобно. Например, где-то за неделю до экспирации я перевожу тикер в "говно", и он спокойно выводится в 0.
Пользователь
Сообщений: Регистрация: 19.02.2022
09.01.2024 21:12:59
Цитата
VPM написал: Есть какие то первые результаты за период которые можно оценить? Ральфа Винца не читали?
Не читал, и даже не знаю, кто это, и зачем он мне надо. Результаты мои скромные на скромном депозите :) С 12.12.2023 (сейчас уточнил по логам, когда я выпилил убыточные позиции), результат следующий: - всего сделок: 50 (сделкой считается удержание позиции от открытия до закрытия); - прибыльных: 50, убыточных: 0; - лучший результат: 113.81; - худший результат: 0.21; - суммарный результат: 622.83. - оценка портфеля на 12.12.2023: 13167.70. Итоговая доходность схемы: 622.83 / 13167.70 / 28 * 365 = 61.6% гг.
Пользователь
Сообщений: Регистрация: 15.06.2023
09.01.2024 21:24:24
РАЛЬФ ВИНС - "Математика управления капиталом" Результат приличный! Только годовые считать узкая оценка! Но об в следующий раз.
Пользователь
Сообщений: Регистрация: 19.02.2022
09.01.2024 22:28:03
Цитата
Владимир написал: , А я делаю именно так. За исключением случаев, когда так нельзя делать.
В принципе при хорошем входе в позицию и достаточном количестве свободных средств это не такая уж проблема - поболтается да и продастся рано или поздно.
Цитата
Владимир написал: я ввёл рейтинги тикеров, которыми управлял через контекстное меню тикера: "говно", "мусор" и так далее до "отличного". И немного перенастроил алгоритм, чтобы "говно" из портфеля скрипт старался выводить, а хорошие тикеры, наоборот, старался придержать а портфеле. А уж разрешение тикеру покупать или продавать изначально было заложено в меню - это два бита, 4 состояния. Очень удобно. Например, где-то за неделю до экспирации я перевожу тикер в "говно", и он спокойно выводится в 0.
Красивое решение. У меня пока попроще, простое бинарное разложение: можно/нельзя торговать в принципе. Тупо через два файла - в одном общий список тикеров, в другом - запрещенные. Присмотрюсь, может, тоже придется рейтинги вводить. В биржевых делах разбираться мне тоже лень. Другое дело скрипт написать - упражнение для ума, а если с пользой для кошелька выйдет, так и вовсе хорошо.
Да с чего бы? Самый правильный показатель. И любую доходность я буду сравнивать с ключевой ставкой, потому что не вижу смысла в схеме с доходностью меньше ее (нахрена все эти сложности с торговлей, когда тупо с накопительного счета можно больше получить?).
Пользователь
Сообщений: Регистрация: 25.09.2020
09.01.2024 22:38:25
Glukator, В принципе, даже при нехорошем входе можно работать - вот резерв по деньгам необходим всегда, особенно на фьючерсах. И у меня один общий список по всем тикерам, а уж можно/нельзя - это в его паспорте указывается и в диалоге редактируется.
Пользователь
Сообщений: Регистрация: 30.01.2015
10.01.2024 08:01:25
У меня робот с начала года показал это: стратегия "купил и держи " показала бы в этом случае (275.28-273.5)/273.28 -ком=0.72% У робота получилось переиграть эту стратегию =1.3% -------------------- А это картинка за декабрь 2023
стратегия "купил и держи" показала бы (273-276)/273= -1.5% робот показал =32% ---------------------------- Особо интересно то, что рынок при этом сменил тренд с падающего на растущий. Сначала провалился на (276-255)/276=7.6% Потом вырос на (273-255)/255=7% Если сначала войти в шорт а потом в лонг, то получим всего 14.6% ---------------- Робот собрал на логах 15% и на шортах 17%.
Пользователь
Сообщений: Регистрация: 15.06.2023
10.01.2024 10:52:18
----- Чтение таблицы из файла в массив или таблицу --message(filename) local f,err = io.open(filename,"r")--"r": режим чтения (используется по умолчанию); if not f then return nil,err end local tbl = assert(load("return "..f:read("a")))--"a": режим дозаписи в конец файла f:close()
Никак не могу понять, что изменилось в lua 5.4 и перестала работать строка, подскажите что тут не так?
local tbl = assert(load("return "..f:read("a")))
Пользователь
Сообщений: Регистрация: 15.06.2023
10.01.2024 11:23:03
file:read (···)
Считывает файл fileв соответствии с заданными форматами, которые определяют, что читать. Для каждого формата функция возвращает строку или число с прочитанными символами или завершается ошибкой , если она не может прочитать данные в указанном формате. (В последнем случае функция не считывает последующие форматы.) При вызове без аргументов она использует формат по умолчанию, который считывает следующую строку (см. ниже).
Доступные форматы
« a»: читает весь файл, начиная с текущей позиции. В конце файла возвращается пустая строка; этот формат никогда не подводит.
Пользователь
Сообщений: Регистрация: 19.02.2022
10.01.2024 12:28:06
Цитата
VPM написал: local tbl = assert(load("return "..f:read("a")))
Ой, жопа какая... Я в упор не понял, что вы хотели сделать.
Пользователь
Сообщений: Регистрация: 15.06.2023
10.01.2024 12:38:50
Glukator, Я этим пользовался в lua 5.1 при переходе на 5.4 перестало работать, вот смысл:
Цитата
Используем преобразование таблицы в и сохраняем на диске результаты.
-- Сохранение таблицы или массива в файл function table.save(tbl,filename) local f,err = io.open(filename,"w") if not f then return nil,err end f:write((tbl)) f:close() return true end
В результате на диске мы получим файл, в котором в терминах синтаксика языка Lua описана наша таблица. Зачем сохранять в синтаксисе Lua? Причин две:
универсальность
элегантный способ чтения таблицы из файла
Вот функция, читающая файл и возвращающая сохранённую в нем таблицу:
-- Чтение таблицы из файла в массива или таблицу function table.read(filename) local f,err = io.open(filename,"r") if not f then return nil,err end local tbl = assert(loadstring("return " .. f:read("*a"))) f:close() return tbl() end
Все просто - читаем файл и запускаем его на выполнение
Вот как это выглядит:
table.save({11,22,33,{"gh",'jk'},44},"e:\\1.dat") -- пишем t = table.read("e:\\1.dat") -- читаем
Пользователь
Сообщений: Регистрация: 15.06.2023
10.01.2024 13:14:12
Вроде как заработало , кому нужно вот
для 5.1 local tbl = assert(loadstring("return "..f:read("*a"))) для 5.4 local tbl = assert(load("return "..f:read("a")))
Пользователь
Сообщений: Регистрация: 25.09.2020
10.01.2024 13:19:49
Glukator, Я тоже ничего не понял, да такой ужас и не хочется понимать. assert, да ещё и load, и это на файловых операциях, проще которых и не бывает в природе. АХХХРЕНИТЕЛЬНО "элегантный способ"!
Пользователь
Сообщений: Регистрация: 30.01.2015
10.01.2024 13:37:40
Цитата
VPM написал: , Я этим пользовался в lua 5.1 при переходе на 5.4 перестало работать, вот смысл:
Цитата
Используем преобразование таблицы в и сохраняем на диске результаты. -- Сохранение таблицы или массива в файл function table.save(tbl,filename) local f,err = io.open(filename,"w") if not f then return nil,err end f:write( (tbl)) f:close() return true end В результате на диске мы получим файл, в котором в терминах синтаксика языка Lua описана наша таблица. Зачем сохранять в синтаксисе Lua? Причин две: универсальность элегантный способ чтения таблицы из файла Вот функция, читающая файл и возвращающая сохранённую в нем таблицу: -- Чтение таблицы из файла в массива или таблицу function table.read(filename) local f,err = io.open(filename,"r") if not f then return nil,err end local tbl = assert(loadstring("return " .. f:read("*a"))) f:close() return tbl() end Все просто - читаем файл и запускаем его на выполнение Вот как это выглядит: table.save({11,22,33,{"gh",'jk'},44},"e:\\1.dat") -- пишем t = table.read("e:\\1.dat") -- читаем
если Вы записали в файл fT таблицу T так, как она записана в скрипте Lua, то просто загрузите этот файл в скрипт так: loadfile(fT)
Пользователь
Сообщений: Регистрация: 15.06.2023
10.01.2024 13:41:31
Ну здесь все просто, если читать из файла f:read("a") получим строковой формат, перевод в функцию и чтение из функции позволяет работать в формате таблицы. Не знаю насчет элегантности, но очень удобно при дальнейшей обработке.
Пользователь
Сообщений: Регистрация: 15.06.2023
10.01.2024 14:01:25
Цитата
nikolz написал: если Вы записали в файл fT таблицу T так, как она записана в скрипте Lua, то просто загрузите этот файл в скрипттак:loadfile(fT)
Я вообще не понимаю в чем различие loadfile от load в каком случае чем пользоваться (может есть какие то критерии) ???
Пользователь
Сообщений: Регистрация: 25.09.2020
10.01.2024 14:21:48
VPM, АХХХРЕНИТЕЛЬНО удобно! Во-первых, формат данных в ОЗУ совершенно другой - там важна скорость, прямой доступ к данным. Во-вторых, не нужно сохранять всё - у меня объём таблицы в ОЗУ раз в пять больше, чем сохраняемых данных. В-третьих, данные в файле предназначены не только для компа, но и для человека - я, например, прекрасно вижу и свой портфель, и свой кошелёк, открыв этот файл в любом текстовом редакторе. И поправить там могу всё, что душе угодно. Небольшой парсер в main, заглатыающий исходные данные при запуске скрипта и небольшая функция, сбрасывающая в файл дамп текущего состояния каждые 3 минуты - всё, что требуется. Работает как часы, в любых версиях Квика и языка.
написал: если Вы записали в файл fT таблицу T так, как она записана в скрипте Lua, то просто загрузите этот файл в скрипттак:loadfile(fT)
Я вообще не понимаю в чем различие loadfile от load в каком случае чем пользоваться (может есть какие то критерии) ???
load - загрузка из переменной string loadfile - загрузка из файла на диске ======================= Выкладываю для вас решение для вывода таблицы в файл и загрузки таблицы из файла в скрипт
Код
function value2text(t,s) --преобразование таблицы в скрипт
local s1=""; --новое значение
local n=string.len(s); local z=string.sub(s,n);
local m= type(t);
if m=="string" then
s1='"'..tostring(t)..'"'; elseif m=="number" then s1=tonumber(t); elseif t==nil then s1="nil";
elseif m=="table" then local f;
for j,v in pairs(t) do
local x=v;
if f then s1=s1.."," end f=1;
if type(j)~="number" then s1=s1..'\n["'..tostring(j)..'"]='; end
s1=value2text(x,s1);
end
if z=='}' then s1='\n{'..s1..'}'; else s1='{'..s1..'}' end
end
return s..s1;
end
-------------------- это пример вывода и загрузки с распечаткой значений из таблиц
local t2={6,7,8,9}
local t={1,2,3,4,5,"asd",t2} -- это таблица которую выводим в файл
----------вывод в файл
local fn=p3.."test999.lua"
fLog=io.open(fn,"w"); fLog:write("t1="..value2text(t,"").."\n");fLog:flush()
fLog:close();
-----------ввод из файла
dofile(fn);
----------------прочитали таблицу из файла в таблицу t1
--теперь печатаем из введенной таблицы значения и сравниваем их со значениями в t2 и t
local t3=t1[7]
local s1=t1[6];
print(t1[1],s1,t3[3])
результат: это содержимое файла test999.lua:
Код
t1={1,2,3,4,5,"asd",{6,7,8,9}}
это печать значений
Код
1 asd 8
Пользователь
Сообщений: Регистрация: 15.06.2023
10.01.2024 14:44:25
Владимир, Вы подняли сейчас, очень нужную техническую тему и даже не одну, там где для Вас вещи очевидные, для меня и таких как я полная "тьма".
Цитата
Владимир написал: Во-первых, формат данных в ОЗУ совершенно другой - там важна скорость, прямой доступ к данным. Во-вторых, не нужно сохранять всё - у меня объём таблицы в ОЗУ раз в пять больше, чем сохраняемых данных.
Вопрос такой, не вдаваясь сильно в детали, есть какие - то критерии оценки какие переменные куда целесообразно относить,
При организации структуры программы в виде классов, проявилась еще одна особенность lua! В случае обнаружения при выполнении ошибки, скрипт останавливается, там где раньше перепрыгивал через эту ошибку и продолжал выполнение. Нашел этому объяснение, хочу поделиться:
"Errare humanum est. Поэтому мы должны обрабатывать ошибки как можно лучше. Поскольку Lua — это язык расширения, часто встраиваемый в приложение, он не может просто аварийно завершить работу или завершить работу в случае возникновения ошибки. Вместо этого при возникновении ошибки Lua завершает текущий фрагмент и возвращается в приложение."
"Любое неожиданное условие, с которым сталкивается Lua, вызывает ошибку. Ошибки возникают, когда вы (то есть ваша программа) пытаетесь добавить значения, не являющиеся числами, вызвать значения, не являющиеся функциями, индексировать значения, не являющиеся таблицами, и т. д. (Вы можете изменить это поведение с помощью метатаблиц , как мы увидим позже.) " Стало чуть сложней искать, но появилась уверенность, что программа с ошибками не будет исполняться!
Пользователь
Сообщений: Регистрация: 15.06.2023
10.01.2024 15:08:01
Цитата
Владимир написал: Небольшой парсер в main, заглатыающий исходные данные при запуске скрипта и небольшая функция, сбрасывающая в файл дамп текущего состояния каждые 3 минуты - всё, что требуется. Работает как часы, в любых версиях Квика и языка.
Если Вы про парсер который освещали в начале своих публикаций, то я на нем "зуб потерял"? Дамп текущего состояния, вообще не понятно что туда писать, почему через 3 минуты сохранять, нужен какой - то подход?
Пользователь
Сообщений: Регистрация: 25.09.2020
10.01.2024 15:39:36
VPM, Для меня давно очевидно, что чуть ли не единственная важная тема - это определение структур данных. Даже код скрипта базируется на этом! И это СЛОЖНАЯ тема. В частности, "таблица Lua" у меня представляет собой большое разветвлённое дерево уровней на пять, если не больше. А переменные туда целесообразно относить, где их удобнее всего использовать. А уж парсер склепать вообще не проблема. Дамп текущего состояния - на случай отвисания Квика, отключения электричества и просто на всякий случай. 3 минуты - как кому нравится. Сейчас код посмотрел - у меня дамп сбрасывается каждые сто секунд. А писать туда нужно то, чтобы после перезапуска скрипта иметь возможность продолжить работу с того места, где остановился.
Пользователь
Сообщений: Регистрация: 18.12.2017
10.01.2024 15:42:31
Цитата
VPM написал: "Errare humanum est. Поэтому мы должны обрабатывать ошибки как можно лучше...
По вашему предыдущему вопросу в этой же книге есть пояснение: "Многие программисты пытаются писать нечто подобное: value = loadstring("return " .. varname)(). Если, скажем, varname равно x, то результатом конкатенации будет "return х", что при выполнении даст нам желаемый результат. Однако, этот код включает в себя создание и компиляцию нового куска кода, что является довольно затратным. Вы можете добиться того же эффекта при помощи следующего кода, который в десятки раз эффективнее предыдущего: value = _G[varname]".
Пользователь
Сообщений: Регистрация: 18.12.2017
10.01.2024 15:48:53
Цитата
VPM написал: Я вообще не понимаю в чем различие loadfile от load в каком случае чем пользоваться (может есть какие то критерии) ???
Всё из той же книги: "Функция load похожа на loadfile, за исключением того, что она берет кусок кода не из файла, а из строки (Примечание: В Lua 5.1 функция loadstring выполняет роль load)".
Пользователь
Сообщений: Регистрация: 15.06.2023
10.01.2024 16:24:57
Игорь М, Да нет в книге то, не понятно как в жизни этим пользоваться, чем руководствоваться можно какой - то не большой пример?
Цитата
Игорь М написал: Вы можете добиться того же эффекта при помощи следующего кода, который в десятки раз эффективнее предыдущего: value = _G[varname]".
Это что писать в глобальную переменную? Ну к примеру вот:
Код
local Order={}
function Order:new() -- проинициализируем поля, процедуры и фунции нашего класса
---- Создает экземпляр теперь уже объекта, описывает поля объекта и присваивает полям начальные значения.
local obj = {
[0]=0,
['id']=0,--['symbol']='X',
[1]={
['d']='0',
['t']='0',
['dir']='X',
['qty']=0,
['op']=0,
['id']=0
},
};
----далее превращаем таблицу в класс
setmetatable(obj,self)
---- объект получает доступ к методам класса
self.__index = self
---- возвращаем наш объект (экземпляр класса)
return obj
end
function Order:save(path) -- пишем
table.save(self,path)
end
Сделал класс, написал под него метод , вот использую
Код
local order=Order:new()
order:save(path..'\\1.dat')
order:printf()
local ord = table.read(path..'\\1.dat')
Log:info( 'table.read '..type(ord)..' '..tostring(ord[0])..' '..tostring(ord.id) )
Ну ведь удобно же.
Пользователь
Сообщений: Регистрация: 15.06.2023
10.01.2024 16:41:20
Цитата
nikolz написал: load - загрузка из переменной string loadfile - загрузка из файла на диске
Такой подход встречал в работах Nikolay, Не очень понятно зачем лезть в поле глобальной переменной, предполагал что ради видимости. Но не как не могу себе предположить, что это более эффективно, тогда возможно нужно дерево сделать как Владимир, ("Волки сыты и овцы целы")?
Цитата
Владимир написал: Для меня давно очевидно, что чуть ли не единственная важная тема - это определение структур данных. Даже код скрипта базируется на этом! И это СЛОЖНАЯ тема. В частности, "таблица Lua" у меня представляет собой большое разветвлённое дерево уровней на пять, если не больше. А переменные туда целесообразно относить, где их удобнее всего использовать.
Пользователь
Сообщений: Регистрация: 25.09.2020
10.01.2024 18:34:47
VPM, Да никуда не деться от дерева, если этих самых varname будут десятки, а то и сотни тысяч.
Пользователь
Сообщений: Регистрация: 15.06.2023
10.01.2024 21:03:43
Владимир, Ну мой пример маленько о другом, о тех переменных которыми редко пользуемся, те которые можно отправить на небольшое хранение и потом достать. Допустим торговая система открыла позицию, создали таблицу с параметрами этой позиции, писать в файл эту таблицу не эффективно, так как будем часто обращаться к ней , другое дело позицию закрыли записали свою сделку в файл, и достаем когда уже когда обрабатываем сделки.
Пользователь
Сообщений: Регистрация: 15.06.2023
10.01.2024 21:24:39
И так если провести промежуточную черту о выше сказанном:
И все же остался не раскрыт вопрос как эффективно, распоряжаться памятью, хотя не которые моменты прорезались?
Пользователь
Сообщений: Регистрация: 30.01.2015
10.01.2024 21:26:11
, Без обид, но Вы очевидно не представляете как реализована запись в файл в Винде. Если Вы часто читаете файл, то Вы читаете его из памяти, а не с диска. Поэтому разницы никакой нет. Да и вы же за скоростью не гонитесь. Или что я упустил в Ваших рассуждениях?
Пользователь
Сообщений: Регистрация: 15.06.2023
10.01.2024 21:31:38
nikolz, Наоборот прозрел, за скоростью не гоняюсь , тогда чем можно руководствоваться и как наилучшим (оптимальным) образом организовать память?
Пользователь
Сообщений: Регистрация: 25.09.2020
10.01.2024 22:02:21
VPM, И что же это за "те переменные, которыми редко пользуемся"? Я вот тестировал свой скрипт на 20К тикерах. Если у каждого из них только по 10 параметров - вот уже и 200 тысяч переменных. А ведь их НАМНОГО больше! И общие данные (имя, класс, на какую валюту торгуется, можно ли им вообще торговать, сколько лотов закуплено, размер лота и т.д.), и данные по его таймфреймам (а у каждого таймфрейма есть свечи, а на каждом могут быть свои сделки), текущий курс, цена спроса и предложения, шаг цены, данные по ликвидности и прочая, и прочая, и прочая. Подумаешь, "торговая система открыла позицию"! Да у меня два раза в секунду такое может происходить! А сделки обрабатывать и вообще 4 раза в секунду. АБСОЛЮТНО ВСЁ должно быть под рукой! А вот сохранять на диск из "этого всего" нужно только жалкую часть. Памяти это, кстати, жрёт совсем немного - несколько мегов. А на диске объёмы и вообще смехотворные.
Пользователь
Сообщений: Регистрация: 15.06.2023
10.01.2024 22:20:51
Владимир, Ну тогда получается, что и голову "ломать" не стоит, пихай все в оперативную и все дела? Ну да еще можно подчищать так?
Пользователь
Сообщений: Регистрация: 25.09.2020
10.01.2024 22:43:46
VPM, Естественно, всё в ОЗУ. Файл нужен только при запуске и для лога по заявкам и сделкам.
Пользователь
Сообщений: Регистрация: 30.01.2015
11.01.2024 06:58:32
Цитата
VPM написал: , Наоборот прозрел, за скоростью не гоняюсь , тогда чем можно руководствоваться и как наилучшим (оптимальным) образом организовать память?
С памятью все просто. ------------------- На диск надо писать лишь то, что хотите сохранить для истории и что не хранится в архивах КВИК. Как правило - это результаты реальной торговли. Но и это можно не сохранять так как они есть в отчете брокера. И только в отчете брокера Вы увидите что было реально. -------------------- Кроме того, в отдельный файл можно записать исходные данные для торговли. Это позволяет не изменять их в скрипте. ----------------- Могу посоветовать следующее. Написали что-то. Поставьте в начале блока N=os.clock() и в конце time=os.clock() -N и выведите time в сообщение. Вы узнаете сколько реально в секундах у вас выполняется этот блок. Если это разовый блок в начале запуска, то время вообще не колышет. Если время вас устраивает, то забудьте про этот блок и пишите дальше.
Пользователь
Сообщений: Регистрация: 15.06.2023
11.01.2024 08:20:01
Цитата
nikolz написал: Могу посоветовать следующее. Написали что-то. Поставьте в начале блока N=os.clock()и в конце time=os.clock() -N и выведите time в сообщение. Вы узнаете сколько реально в секундах у вас выполняется этот блок. Если это разовый блок в начале запуска, то время вообще не колышет. Если время вас устраивает, то забудьте про этот блок и пишите дальше.
Да я так делаю, еще получаю используемую память, а в главное окно скрипта вывожу прямо в заголовок окна, удобно всегда перед глазами информация как работает скрипт.
"Повторение мать ученья"! Благодарю за обсуждение и ликбез, не которые мои сомнения развеялись, понятно стало в какую сторону копать. Надеюсь что обсуждение было полезно не только мне.
Пользователь
Сообщений: Регистрация: 30.01.2015
11.01.2024 15:48:53
Хвалюсь. ------------------------------ Сегодня мой робот на сбере показал такую картинку с начала года.
Т е c 3.01.2024 профит 2.44%, из них 1.72 - лонг и 0.72 -шорт. Стратегия "купил и держи" дала бы 1%.
Пользователь
Сообщений: Регистрация: 19.02.2022
12.01.2024 19:12:05
Цитата
nikolz написал: Хвалюсь. ------------------------------ Сегодня мой робот на сбере показал такую картинку с начала года.
Т е c 3.01.2024 профит 2.44%, из них 1.72 - лонг и 0.72 -шорт. Стратегия "купил и держи" дала бы 1%.
Чем тут хвалиться? Этой уродливой картинкой, по которой единственное, что можно понять, - что она опасна для глаз смотрящего? У меня цыгане на соседней улице живут, так вот от их шмоток в глазах меньше рябит.
написал: Хвалюсь. ------------------------------ Сегодня мой робот на сбере показал такую картинку с начала года.
Т е c 3.01.2024 профит 2.44%, из них 1.72 - лонг и 0.72 -шорт. Стратегия "купил и держи" дала бы 1%.
Чем тут хвалиться? Этой уродливой картинкой, по которой единственное, что можно понять, - что она опасна для глаз смотрящего? У меня цыгане на соседней улице живут, так вот от их шмоток в глазах меньше рябит.
написал: Хвалюсь. ------------------------------ Сегодня мой робот на сбере показал такую картинку с начала года.
Т е c 3.01.2024 профит 2.44%, из них 1.72 - лонг и 0.72 -шорт. Стратегия "купил и держи" дала бы 1%.
Чем тут хвалиться? Этой уродливой картинкой, по которой единственное, что можно понять, - что она опасна для глаз смотрящего? У меня цыгане на соседней улице живут, так вот от их шмоток в глазах меньше рябит.
Это Ваша проблема. Сочувствую.
Но ведь прав Думаете, что хоть один человек на форуме кроме вас может понять что на ней изображено?
Мы видим просто кучу рябящих в глазах линий, циферки какие-то и снизу надпись сбербанк )))
Просто представьте, что не вы ее создали и изначально не знаете что на ней изображено, не реально же разобраться в ней.
Пользователь
Сообщений: Регистрация: 25.09.2020
13.01.2024 12:05:53
Glukator, Ну как же "Чем тут хвалиться?" - картинка весьма информативная! 1. Уже сам факт наличия картинки говорит о том, что роботу не доверяют принятие решений: ему-то уж точно никакие картинки не нужны, они - для человека. 2. А раз картинка для человека, то она действительно "уродлива и опасна для глаз смотрящего": яркие цвета, да ещё и на чёрном фоне быстро посадят зрение даже у орла. 3. Дикое нагромождение прямых и кривых линий означает полное неумение выделить и подать в удобном виде действительно важную информацию, в нём не сможет разобраться не только "хоть один человек на форуме", но и сам автор этого кошмара. 4. Фраза "сегодня робот на сбере показал такую картинку с начала года" означает, что: а) Это не отчёт за год по всему портфелю, а лишь один сраный тикер, за период, который длился как раз "без году неделя". б) Тем не менее, он длился-таки эту неделю, даже больше, а информация для принятия решений нужна здесь и сейчас, буквально в эту секунду. Следовательно, картинка практически полностью загажена тем, что "было-было-было, но прошло" - это уже мусор, "преданья старины глубокой", которые не только не нужны, но и вредны для принятия решений - недаром скрипту это дело не доверяют. 5. Автор не просто приводит сравнение с техникой "купил и держи", но и хвалится этим. Стало быть, успешно конкурировать даже с этой убогой стратегией у него получается далеко не всегда. Это стратегия моей сестры - она в год совершает примерно столько же сделок, сколько я в день, живёт на дивиденды (кстати, довольно успешно), но даже она время от времени что-то продаёт, балансирует портфель. И для этого ей никакой скрипт нафиг не нужен - даже мой, она его использовать не хочет, хотя не раз видела его "в деле" -.ей и так хорошо.
Вывод: картинка вполне достаточна для вынесения приговора. Того самого, который "окончательный и обжалованию не подлежит".
Пользователь
Сообщений: Регистрация: 15.06.2023
15.01.2024 12:47:12
"Едем дальше, видим больше!" 1) Структура: Итак, вплотную подошли к вопросу организации структуры данных в скрипте.
Цитата
Владимир написал: Для меня давно очевидно, что чуть ли не единственная важная тема - это определение структур данных. Даже код скрипта базируется на этом! И это СЛОЖНАЯ тема.
Из того что выше обсуждалось можно сделать вывод, есть два подхода:
А) Создать внутреннею переменную (таблицу) и уже внутри нее строить дерево.
Цитата
Владимир написал: В частности, "таблица Lua" у меня представляет собой большое разветвлённое дерево уровней на пять, если не больше. А переменные туда целесообразно относить, где их удобнее всего использовать.
Б) Создать в глобальном окружении, служебные поля для переменных данного скрипта; Про такой подход подсказал Игорь М, описан автором языка в его книге, и применяется разработчиками QUIK при создании модуля qlua. Вот такие две записи идентичны:
local varname = 20 local value = load or loadstring("return " .. varname)() print(value)
Более эффективная: _G[varname] = value local value = _G[varname] print(value)