Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
16.01.2024 13:54:54
Цитата
Владимир написал: Кроме того, я лично никогда не пользуюсь конструкциями вида #sec - скрипт сам знает размеры всех своих массивов. Например, размеры стеков хранятся в их нулевых элементах. И все индексы у меня числовые - так, на всякий случай, чтобы не нарываться на потенциальные проблемы с ключами.
"размеры стеков хранятся в их нулевых элементах" - этот прием я перенял у Вас, активно его использую, но он не везде подходит. Проблема возникает при перезапуске, а что делать если скрипт запустил и оставил не выключая тут целая серия задач возникает.
Цитата
Владимир написал: А "знать как надо" очень просто: надо так, как это представляется правильным в данный момент. Напишите ТЗ, и сами всё увидите.
ТЗ это хорошо в моем есть симулятор рынка, не могу сказать сколько раз я его уже переделываю и Вот опять надо.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
16.01.2024 13:38:49
Ну и еще одно
Цитата
Владимир написал: А что такое "достаточно ликвидные инструменты" на срочном рынке? Я вот с недавнего времени стал торговать НА ВСЕХ фьючах одного тикера - в частности, на квартальных: H, M, U, Z. Закрылись вот недавно Z3, открываю Z4 - пусть даже его пока и в природе не существует. Появится - начнёт торговаться. И ликвидность у него месяц-другой будет почти никакая. А потом постепенно раскочегарится. Мой скрипт умеет торговать при ЛЮБОЙ ликвидности. Между прочим, средняя прибыль на сделку у малоликвидных обычно даже выше.
почему важна ликвидность, высокая ликвидность позволяет проводить в сделке более высокие объёмы, это одна из причин почему здесь сидит крупняк, а это в свою очередь заставляет работать алгоритмы о которых я пишу и реализую!
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
16.01.2024 13:07:34
Цитата
Владимир написал: И что, свободные деньги на срочном рынке заморожены? Нет, это резерв! Чтобы потом не было мучительно больно.
Согласен здесь если устраивает результат за период , то чем меньше под риском тем лучше!
Цитата
Владимир написал: Наконец, не бывает в природе никакой "справедливой цены".
Даже считают на опционах.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
16.01.2024 13:03:31
Цитата
Владимир написал: Планировать что-либо, считать какие-то риски просто глупо: "Хочешь рассмешить Господа - расскажи ему о своих планах". И ещё: даже при торговле на 10-секундном таймфрейме скрипт может держать позицию неделями, месяцами, годами. А может и секундами.
Всем чем можем управлять это риск! От него и строим сделку.
Цитата
Владимир написал: А что такое "замораживание капитала"? Я бы предпочёл термин "вложение". Деньги должны работать. Причём на фондовом рынке можно вкладывать чуть ли не 100% имеющихся средств, но на срочном это, мягко говоря, чревато.
На срочном после дневного клиринга даже бывает > 100% вложение, но я такое не люблю и уменьшаю позиции. Кстати Вы не считаете показатель из таблицы "состояние счета" "% Испол.ГО". Не могу понять как правильно?
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
16.01.2024 12:55:20
Цитата
Владимир написал: Я уже говорил, что мой личный рекорд 90.4% в день. И много раз говорил, что рынку насрать, что там МНЕ нужно: любой из тикеров может в любой момент и взлететь и упасть со страшной силой
Ну тут работает Ваше правило 300 * 9 = 2700 или 1/2700 капитала с работала на 90.4% в день.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
16.01.2024 12:51:47
Цитата
Владимир написал: Потому в кубышке, что у Вас в коде указано ТРИ инструмента, а не 20. А если у Вас на 20 тикеров тупо денег нет? Или, наоборот, хватает на 200?
Цитата
VPM написал: У меня их не 3 это для простоты изложения, но точно не 300, к примеру для фондового рынка я установил правило ~ 5% Капитала на инструмент, 100% / 20% <= 20 бумаг в портфеле.
На фондовом у меня инвестиционный подход. А рассказываю я про срочный (спекулятивный подход). Сейчас торгую руками отслеживаю в основном 4 тикера, которые котируются в USD, для того чтоб оценить результаты одним взглядом т.е. посчитать пункты. А от 300 * 9 через пять минут можно в обморок упасть Для сравнения на стадии отладки пишу в скрипт тоже 4 , позволяет сравнивать два подхода!
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
16.01.2024 12:23:54
Цитата
Владимир написал: И для отладки куда выгоднее сразу делать как надо. И вообще работу нужно начинать с составления ТЗ.
Это так, вот только задача и заключается у знать как надо? Сейчас делаю подход от обратного.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
16.01.2024 12:20:31
Цитата
Владимир написал: Короче: профессионал воровать не умеет - ему проще самому написать то, что нужно. А чайники нехай ковыряются в кодах - не поможет!
Я не про воровство, я чтоб не портили задумку автора, а потом жаловались , что не так все работает, про не опытность!
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
16.01.2024 12:15:50
Цитата
Владимир написал: А что такое "достаточно ликвидные инструменты" на срочном рынке? Я вот с недавнего времени стал торговать НА ВСЕХ фьючах одного тикера - в частности, на квартальных: H, M, U, Z. Закрылись вот недавно Z3, открываю Z4 - пусть даже его пока и в природе не существует. Появится - начнёт торговаться. И ликвидность у него месяц-другой будет почти никакая. А потом постепенно раскочегарится. Мой скрипт умеет торговать при ЛЮБОЙ ликвидности. Между прочим, средняя прибыль на сделку у малоликвидных обычно даже выше.
Вы же сами говорите об эффективности использования капитала, а у Вас получается какую - то часть замораживаете на месяц, пусть даже небольшую, а зачем?
У фьючерса есть еще одна особенность, чем дальше срок исполнения, тем больше отклонение от справедливой цены! По мере приближения срока исполнения его цена будет смещаться в сторону цены актива!
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
16.01.2024 12:08:20
Цитата
Владимир написал: Ха-ха-ха! Комиссии НИКАК не зависят от количества тикеров. Если я сделаю 100 сделок на одном тикере или по одной на сотне тикерах, комиссия будет та же самая (если средняя цена лота у этой сотни такая же). И что делать с Вашим "правилом 5%", если у Вас те самые ТРИ тикера? Держать почти все деньги в кубышке? А ведь капитал и портфель меняются каждый день, если не каждую минуту!
1) Почему в кубышке? 20 инструментов * 5% капитала = 100% Капитала на 20 инструментов. 2) Как не зависит, у каждого инструмента своя комиссия. Но я даже не об этом. Представим, дневной диапазон одного инструмента в среднем ходит в день на 100 пунктов что составляет 2% изменения в цене. Мой Вариант чтоб взять 100 пунктов мне нужен 1 контракт, (2%), если риск позволяет получить 500 пунктов мне нужно 5 контракт (5*2%) и т.д. Ваш вариант так как тайм фреймы для принятия решений небольшие, а удержание позиции не значительное, то ценна на них делает несколько небольших колебаний, для простоты скажем 0.5%, для того чтоб набрать 2% нужно сделать 4 сделки (4 комиссии).
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
16.01.2024 11:16:32
Цитата
Владимир написал: Glukator , И у меня этот файл просто содержит строки вида "класс, код", только там ещё валюта, содержимое портфеля (если тикер там есть), настройки разные. Но тоже выдерживается правило "одна строка - один тикер". Кроме того, есть другие строки - данные по кошельку, номер счёта, можно переопределить режим работы скрипта (боевой, тестовый, по историческим данным), добавить или отнять денег или тикеров и т.д. Короче, структура внешнего файла тоже тщательно продумана и столь же подробно описана, как и структура данных в самом скрипте.
У меня это просто отдельный класс (таблица), то что пользователь задает , отвечает на вопросы , где торговать?, чем торговать? Какие средства использовать? и т.д. Я до пересмотра этого еще не дошел (у маркетмейкера структура, а я один ) Возможно далее что то автоматизирую.
Но сейчас актуально проблема как правильно организовать работу с получением хранением и обработкой РЫНОЧНЫХ данных! Что делать с памятью которая растет значительно к концу торгового дня (сессии)? Именно этот пример и привожу!
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
16.01.2024 10:56:56
Цитата
Владимир написал: VPM , Ну неужели не очевидно? НЕ НАДО КОД ПРАВИТЬ! Скину я, скажем, Борьке, последнюю версию скрипта, и он тут же будет работать, не меняя в нём ни единой запятой!
Согласен, но я так делаю пока для себя и для отладки , просто так удобней пока, и от этого принципиально не что не меняется. Но а если передавать код другому лицу, еще и пароль поставлю, чтоб не лазили!
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
16.01.2024 10:52:09
DS[1][4][n].cc=n>1 and round(DS[i][j]:C(n) - DS[i][j]:C(n-1), feed[i].sec_scale) or 0;
feed[i].sec_scale -- это параметр тиккера sec_scale feed[i]. -- это таблица необходимых параметров? получаю при инициализации и обновляю при каждом обращении к инструменту (feed[i].bid)
Здесь нужно сказать, что у меня не одна глобальная таблица, а несколько и по возможности локальных + классы. Может этим ввел в заблуждение? Пока не вижу смысла собирать все в одну (придерживаюсь своего взгляда, принципиальную схему я показывал Выше)
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
16.01.2024 10:38:34
Цитата
VPM написал: И как вы будете искать нужный инструмент в этом индексированном массиве? Каждый раз будете в цикле перебирать?
Именно так при получении данных и их подготовке.
DS[1][4][n].cc=n>1 and round(DS[i][j]:C(n) - DS[i][j]:C(n-1), feed[i].sec_scale) or 0; 1 -- первый тикер, 4 тайм фрейм, n- последний бар , n-1 предпоследний бар. Я не понимаю что Вас смущает здесь?
А далее просто
if rule[i].open_buy and OrderSmart[i].position<=0 then --Открыть позицию
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
16.01.2024 10:28:40
Цитата
Glukator написал: Пока у вас 3 инструмента, эта хренота даже будет работать. Как только у вас их станет 300, или даже 30, вас не спасут ни терабайт оперативки, ни дох**ядерный процессор, потому что все это будет жрать память как голодный слон, тормозить и глючить. Задолбаетесь глюки обходить.
У меня их не 3 это для простоты изложения, но точно не 300, к примеру для фондового рынка я установил правило ~ 5% Капитала на инструмент, 100% / 20% <= 20 бумаг в портфеле. В Вашем варианте Капитал =100% / 300 бумаг <= 0.33% капитала на 1 бумагу? Но мне помнится у Вас еще нужно 300 * 9 тайм фреймов, считайте сами на кого работаете (комиссии).
ДА и на срочном 300 инструментов не нужны достаточно ликвидных. А стоимость позиции регулируется количеством контрактов, и зависит от риска принимаемого в данной позиции! Согласен есть некоторые сложности CreateDataSource, но к моему удивлению оказались не такими тяжелыми как предполагал ранее, видимо потому что лежат на сервере. Получаю так ds:SetEmptyCallback(); С памятью надо подчищать пока пробую варианты.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
16.01.2024 10:10:11
Цитата
Цитата
Glukator написал: Цитата VPM написал: Цитата Владимир написал: Во-вторых, закладыывать список тикеров в код и, следоватеьльно, править код на любой чих есть просто безумие А как нужно? Создайте текстовый файл со списком тикеров, которыми собираетесь торговать, и считывайте его при старте скрипта. У меня, к примеру, этот файл просто содержит строки вида КодTQBR:ABIO TQBR:ABRD TQBR:ZVEZ
В чем разница считывать из файла, или читать таблицу прямо из скрипта, кроме как удобства? local sec = { 'BRG4','NGF4', 'GDH4', }; for i=1,#sec do
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
16.01.2024 00:00:32
Цитата
Владимир написал: Как минимум, это i и j должны быть local, а не sec и tf.
Согласен i,j пропустил, (но они вроде и так локальные для цикла), sec и tf видимость ведь позволяет держать локальными?
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
15.01.2024 23:48:23
Цитата
Владимир написал: В-третьих, использовать CreateDataSource значит обрекать себя на бесконечные глюки даже если тикеров в портфеле будет столь жалкое количество. Ну и т.д.
Ну если считать то к примеру Н4 то не одной сделки не сделаешь, нужно тогда историю записывать и сохранять!
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
15.01.2024 23:44:32
Цитата
Владимир написал: Во-вторых, закладыывать список тикеров в код и, следоватеьльно, править код на любой чих есть просто безумие
А как нужно?
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
15.01.2024 23:17:13
DS[i][j][n] На мой взгляд все логично, у каждого инструмента есть несколько тайм фреймов, в каждом тайм фрейме есть несколько баров (индексов), такая вложенность (матрешка), а дальше идут переменные или еще таблицы! Что не так?
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
15.01.2024 23:03:25
Цитата
Glukator написал: А не так что "хочу упихать все в таблицы" и все тут. Правильно организовать данные - это большая работа, и делается она не из желания упихать все куда-нибудь, а из соображений удобства и быстроты доступа к этим данным в дальнейшем.
"Таблицы в Lua — это не одна из структур данных, — это единственная структура данных". "Таблицы - это всё. Хотя, на самом деле, таблицы это просто способ хранить множество пар "ключ-значение", а все остальное - это то, какие вы выбираете ключи и какие значения."
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
15.01.2024 22:53:43
Glukator, Я не пишу новый код, оптимизирую старый, переосмысливаю, какие - то моменты. У меня сейчас организовано так
local sec = { 'BRG4','NGF4', 'GDH4', }; local tf = { INTERVAL_M1, ---- 1 минута INTERVAL_M4, ---- 4 минуты INTERVAL_H1, ---- 1 час INTERVAL_D1, ---- 1 день --INTERVAL_W1, ---- 1 неделя --INTERVAL_MN1, ---- 1 месяц };
local DS = {};
for i=1,#sec do --Заказываю Данные DS[i]={}; for j=0,#tf do DS[i][j] = Source(cl[1],sec[i],tf[j]); --CreateDataSource
--сюда же ответы от алгоритмов присваиваю local Pdf = f[i][j].pdf( n, {period=4,v_t='M',up=1.5, dw=-1.5}, DS[i][j] ) DS[i][j][n].pdf=Pdf;
Отсюда и структура
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
15.01.2024 21:51:00
Glukator, Согласен, Ну конечно все так и делают! Именно этим и занимаюсь, собираю отдельные переменные в таблицы. Цель максимально локализовать переменные. От этого тоже отказался лишнее bar={}; bar[ticer][tf][inde[]={}; Все уже и так есть.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
15.01.2024 16:16:11
Цитата
nikolz написал: На верхнем графики автоматически строятся уровни поддержки и сопротивления и линии регрессии.
Если Вы используете в качестве входного параметра регрессию, то можно попробовать фильтровать цену за интересующий Вас период. Это позволит значительно уменьшить отставание, по сравнению с регрессией, а второе изменяя период можно пробовать на разных частотах, или сразу спектр частот. Если будете пробовать поделитесь результатом.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
15.01.2024 16:05:59
Склоняюсь к варианту А (подход Владимир,), подход опробован, как утверждает Владимир, показывает отличный результат, такое дерево всегда можно в последующим более аккуратно наследовать в глобальную таблицу. Подход Б требует дополнительного ознакомления, что можно чего нельзя. И так решено подход А, соберу в четырех этажную таблицу переменные. bar={}; bar[ticer][tf][inde[]={};
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
15.01.2024 15:48:07
Пересмотрел главу Окружение. "Поскольку окружение — это обычная таблица, то вы можете просто индексировать ее нужным ключом (именем переменной). Похожим образом можно присвоить значение глобальной переменной, чье имя вычисляется динамически, если написать _G[varname] = value."
Есть еще одна интересная "штука": "Поскольку _ENV — это обычная переменная, мы можем обращаться к ней и присваивать значения как и любой другой переменной. Присваивание _ENV=nil сведет на нет любой прямой доступ к глобальным переменным в оставшейся части куска. Это может пригодиться для контроля над тем, какие переменные использует ваш код" "Конечно, главной областью применения _ENV является изменение окружения, используемого фрагментом кода."
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
15.01.2024 14:19:59
Цитата
VPM написал: Более эффективная:_G[varname] = value; local value = _G[varname]; print(value)
Явно кокая - то ошибка, или это простое присвоение или профессор что то напутал? Возможно это имелось ввиду? Не понятно.
_G[varname] = varname; local value = _G[varname] ; print(value)
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
15.01.2024 14:07:26
nikolz, Ну это просто аппроксимация в черном ящике? Если конечно в учителях не паттерны.
Цитата
nikolz написал: Графики использую для обучения. Этот робот реализует NN -"обучение с учителем"
Цитата
nikolz написал: белая линия - это суммарный профит зеленая линия - это лонгсиняя - это шортштриховые линии - это текущий расчет.
Не понятно в чем мерите и относительно чего?
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
15.01.2024 13:39:45
for n in pairs(_G) do print(n) end; А так можно узнать какие глобальные переменные используются. Понимание организационной структуры приводит к пониманию, установлению компромисса между быстродействием и производительностью, ну и не забываем про простоту кода.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 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)
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
11.01.2024 08:20:01
Цитата
nikolz написал: Могу посоветовать следующее. Написали что-то. Поставьте в начале блока N=os.clock()и в конце time=os.clock() -N и выведите time в сообщение. Вы узнаете сколько реально в секундах у вас выполняется этот блок. Если это разовый блок в начале запуска, то время вообще не колышет. Если время вас устраивает, то забудьте про этот блок и пишите дальше.
Да я так делаю, еще получаю используемую память, а в главное окно скрипта вывожу прямо в заголовок окна, удобно всегда перед глазами информация как работает скрипт.
"Повторение мать ученья"! Благодарю за обсуждение и ликбез, не которые мои сомнения развеялись, понятно стало в какую сторону копать. Надеюсь что обсуждение было полезно не только мне.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
10.01.2024 22:20:51
Владимир, Ну тогда получается, что и голову "ломать" не стоит, пихай все в оперативную и все дела? Ну да еще можно подчищать так?
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
10.01.2024 21:31:38
nikolz, Наоборот прозрел, за скоростью не гоняюсь , тогда чем можно руководствоваться и как наилучшим (оптимальным) образом организовать память?
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
10.01.2024 21:24:39
И так если провести промежуточную черту о выше сказанном:
И все же остался не раскрыт вопрос как эффективно, распоряжаться памятью, хотя не которые моменты прорезались?
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
10.01.2024 21:03:43
Владимир, Ну мой пример маленько о другом, о тех переменных которыми редко пользуемся, те которые можно отправить на небольшое хранение и потом достать. Допустим торговая система открыла позицию, создали таблицу с параметрами этой позиции, писать в файл эту таблицу не эффективно, так как будем часто обращаться к ней , другое дело позицию закрыли записали свою сделку в файл, и достаем когда уже когда обрабатываем сделки.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Такой подход встречал в работах Nikolay, Не очень понятно зачем лезть в поле глобальной переменной, предполагал что ради видимости. Но не как не могу себе предположить, что это более эффективно, тогда возможно нужно дерево сделать как Владимир, ("Волки сыты и овцы целы")?
Цитата
Владимир написал: Для меня давно очевидно, что чуть ли не единственная важная тема - это определение структур данных. Даже код скрипта базируется на этом! И это СЛОЖНАЯ тема. В частности, "таблица Lua" у меня представляет собой большое разветвлённое дерево уровней на пять, если не больше. А переменные туда целесообразно относить, где их удобнее всего использовать.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
10.01.2024 16:41:20
Цитата
nikolz написал: load - загрузка из переменной string loadfile - загрузка из файла на диске
Вроде уловил смысл.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 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 15:08:01
Цитата
Владимир написал: Небольшой парсер в main, заглатыающий исходные данные при запуске скрипта и небольшая функция, сбрасывающая в файл дамп текущего состояния каждые 3 минуты - всё, что требуется. Работает как часы, в любых версиях Квика и языка.
Если Вы про парсер который освещали в начале своих публикаций, то я на нем "зуб потерял"? Дамп текущего состояния, вообще не понятно что туда писать, почему через 3 минуты сохранять, нужен какой - то подход?
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
10.01.2024 14:56:17
При организации структуры программы в виде классов, проявилась еще одна особенность lua! В случае обнаружения при выполнении ошибки, скрипт останавливается, там где раньше перепрыгивал через эту ошибку и продолжал выполнение. Нашел этому объяснение, хочу поделиться:
"Errare humanum est. Поэтому мы должны обрабатывать ошибки как можно лучше. Поскольку Lua — это язык расширения, часто встраиваемый в приложение, он не может просто аварийно завершить работу или завершить работу в случае возникновения ошибки. Вместо этого при возникновении ошибки Lua завершает текущий фрагмент и возвращается в приложение."
"Любое неожиданное условие, с которым сталкивается Lua, вызывает ошибку. Ошибки возникают, когда вы (то есть ваша программа) пытаетесь добавить значения, не являющиеся числами, вызвать значения, не являющиеся функциями, индексировать значения, не являющиеся таблицами, и т. д. (Вы можете изменить это поведение с помощью метатаблиц , как мы увидим позже.) " Стало чуть сложней искать, но появилась уверенность, что программа с ошибками не будет исполняться!
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
10.01.2024 14:44:25
Владимир, Вы подняли сейчас, очень нужную техническую тему и даже не одну, там где для Вас вещи очевидные, для меня и таких как я полная "тьма".
Цитата
Владимир написал: Во-первых, формат данных в ОЗУ совершенно другой - там важна скорость, прямой доступ к данным. Во-вторых, не нужно сохранять всё - у меня объём таблицы в ОЗУ раз в пять больше, чем сохраняемых данных.
Вопрос такой, не вдаваясь сильно в детали, есть какие - то критерии оценки какие переменные куда целесообразно относить,
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
10.01.2024 14:01:25
Цитата
nikolz написал: если Вы записали в файл fT таблицу T так, как она записана в скрипте Lua, то просто загрузите этот файл в скрипттак:loadfile(fT)
Я вообще не понимаю в чем различие loadfile от load в каком случае чем пользоваться (может есть какие то критерии) ???
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
10.01.2024 13:41:31
Ну здесь все просто, если читать из файла f:read("a") получим строковой формат, перевод в функцию и чтение из функции позволяет работать в формате таблицы. Не знаю насчет элегантности, но очень удобно при дальнейшей обработке.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 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")))
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 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 11:23:03
file:read (···)
Считывает файл fileв соответствии с заданными форматами, которые определяют, что читать. Для каждого формата функция возвращает строку или число с прочитанными символами или завершается ошибкой , если она не может прочитать данные в указанном формате. (В последнем случае функция не считывает последующие форматы.) При вызове без аргументов она использует формат по умолчанию, который считывает следующую строку (см. ниже).
Доступные форматы
« a»: читает весь файл, начиная с текущей позиции. В конце файла возвращается пустая строка; этот формат никогда не подводит.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 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
09.01.2024 21:24:24
РАЛЬФ ВИНС - "Математика управления капиталом" Результат приличный! Только годовые считать узкая оценка! Но об в следующий раз.