Владимир, Вот к нашему разговору про инвестирование, посмотрел фонды у управляющей компании. Это самый лучший результат
Паевый фонд, Сырьевой сектор, Акции сырьевых компаний из разных стран, Динамика стоимости пая▲86.49% за 3 года.
Прогноз доходности▲14% за год, Уровень риска Высокий, Рекомендуемый срок от 3 лет.
И не факт что управляющий сможет повторить? Пересчет в годовые 28,83% это хороший результат для инвестора с кругленькой суммой. Но где тут управляющий, АУ, достаточно вспомнить что было с денежной массой и Сырьевыми рынками.
nikolz, Вы как всегда остроумны, а Ваши посты очень содержательны и полезны. И причём ту я? Это был всего лишь образ, фантазия, для простоты понимания. Сожалею что и такие вещи нужно разжёвывать. И уж точно они моего времени не стоят.
А говорю я в основном о возможностях, А каждый для себя решает чем ему пользоваться, а чем пользоваться.
Вот такое сообщение получил сегодня от управляющей компании:
Стратегии доверительного управления (ДУ) «Тактическая стратегия» и «Сбалансированная стратегия» больше не активны, потому что БПИФы в их составе были закрыты из-за инфраструктурных рисков. Инфраструктурный риск — это риск на неопределенно долгий срок потерять доступ к операциям с бумагами. Например, не иметь возможности продавать их и получать дивиденды и купоны.
Владимир написал: VPM, И ценности никакой нет: есть согласие продавца и покупателя, то бишь абсолютно субъективная вещь.
Пример. Рыбак живет на Аральском море решил приобрести лодку чтоб рыбачить, спрос на лодки огромный все живут рыбалкой - Ценность1. Аральском море высохло больше никто не рыбачит лодка ни кому не нужна нет спроса можно сдать на металлолом - Ценность2.
nikolz, Вот нашел, работа старая писал на луа 5.1, выкладываю как есть, перед использованием проверьте на соответствие 5.4.
Код
function Cached.SWISS_ARMY_KNIFE_INDICATOR()--SWISS ARMY KNIFE INDICATOR (John Ehlers)
--[[ выполняет все обычные функции обычных индикаторов, такие как сглаживание и генерация импульса.
Также делает некоторые необычные вещи, такие как остановка полосы и фильтрация отклонения полосы.
Как только вы запрограммируете этот индикатор, вы сможете использовать практически любой метод технического анализа.
Этот уникальный общий индикатор является результатом общих концепций цифровой обработки сигналов (DSP) для дискретных сетей сигналов,
которые появляются в различных формах в техническом анализе.
Передаточная функция дискретной линейной системы - это отношение выхода системы, деленное на вход.
--]]
--local rounding=rounding
--local Value=Value;
local pi=math.pi;
local exp=math.exp;
local cos=math.cos;
local sin=math.sin;
local sqrt=math.sqrt;
local floor=math.floor;
local Filt,Price={},{};
--local fPeriodDC=Cached.PeriodDC();
return function(I,FSettings,ds )
local I = I or 1;
local ds = ds or nil;
local FSettings = FSettings or {};
local v_t = FSettings.v_t or 'C';
local P = FSettings.period or 48;
local N = FSettings.N or 8;
local n = FSettings.n or 0;
local wid = FSettings.wid or "BP";
local delta1 = FSettings.delta1 or 0.1;
local avtoP = FSettings.avtoP or 0;
local rev = FSettings.rev or 1;
local wg = FSettings.bw_hp or 1; --полоса пропускания
local bw_ss = FSettings.bw_ss or 1;
local metod = FSettings.metod or 2; -- адаптации period данных
--Settings.pole_hp = 0
--Settings.pole_ss = 2
local x = FSettings.x or nil;
--------------------------------------
local price = x or Value(I, v_t, ds) or 0;
--------------------------------------
if I == 1 then
Price,Filt={},{};
Price[I],Filt[I]=p0,p0;
--fPeriodDC=Cached.PeriodDC()
end
--------------------------------------
local p1=Price[I-1] or price;
local p2=Price[I-2] or p1;
local pn=Price[I-n] or p2;
Price[I] = price;
--Vars:
local c0=1;
local c1=0;
local b0=1;
local b1=0;
local b2=0;
local a1=0;
local a2=0;
local alpha=0;
local beta1=0;
local gamma1=0;
---------------------------------
if avtoP == 1 then
local DC = fPeriodDC(I, {['v_t']=v_t,['period']=P,['N']=N,['wg']=wg,['bw']=bw_ss,['metod']=metod}, ds)
--if DC < 6 then DC=6 end
--if DC > P then DC=P end
P = round(floor(rev*DC),0)
end
---------------------------------
local filt=0;
local filt1=Filt[I-1] or 0;
local filt2=Filt[I-2] or filt1;
local fi=2*pi/P;
if wid == "EMA" then --INDICATOR
if I <= n then filt,filt1 = price,price; end
alpha = (cos(fi) + sin(fi) - 1) / cos(fi);
b0 = alpha;
a1 = 1 - alpha;
elseif wid == "SMA" then --INDICATOR
if I <= n then filt,filt1 = price,price; end
c1 = 1 / n;
b0 = 1 / n;
a1 = 1;
elseif wid == "Smooth" then --INDICATOR
if I <= n then filt,filt1 = price,price; end
c0 = 1 / 4;
b1 = 2;
b2 = 1;
elseif wid == "Gauss" then --INDICATOR
-- фильтр Гаусса является фильтром нижних частот,
-- позволяя проходить более низким частотам и ослаблять более высокие частоты.
-- Использование гауссовых фильтров - это движение к двойной цели:
-- уменьшить отставание и уменьшить отставание высокочастотных компонентов относительно отставания низкочастотных компонентов.
if I <= n then filt,filt1 = price,price; end
beta1 = 2.415*(1 - cos(fi));
alpha = -beta1 + sqrt(beta1*beta1 + 2*beta1);
c0 = alpha*alpha;
a1 = 2*(1 - alpha);
a2 = -(1 - alpha)*(1 - alpha);
elseif wid == "Butter" then --INDICATOR
-- Сглаживание, реализованное с помощью этого фильтра, является чрезвычайно скромным, отклоняя только компонент цикла 2 бара.
if I <= n then filt,filt1 = price,price; end
beta1 = 2.415*(1 - cos(fi));
alpha = -beta1 + sqrt(beta1*beta1 + 2*beta1);
c0 = alpha*alpha / 4;
b1 = 2;
b2 = 1;
a1 = 2*(1 - alpha);
a2 = -(1 - alpha)*(1 - alpha);
elseif wid == "HP" then
if I <= n then filt,filt1 = 0,0; end
alpha = (cos(fi) + sin(fi) - 1) / cos(fi);
c0 = 1 - alpha / 2;
b1 = -1;
a1 = 1 - alpha;
elseif wid == "2PHP" then
--является фильтром высоких частот, позволяя проходить более высоким частотам и ослаблять более низкие частоты.
if I <= n then filt,filt1 = 0,0; end
beta1 = 2.415*(1 - cos(fi));
alpha = -beta1 + sqrt(beta1*beta1 + 2*beta1);
c0 = (1 - alpha / 2)*(1 - alpha / 2);
b1 = -2;
b2 = 1;
a1 = 2*(1 - alpha);
a2 = -(1 - alpha)*(1 - alpha);
elseif wid == "BP" then
if I <= n then filt,filt1 = price,price; end
beta1 = cos(fi);
gamma1 = 1 / cos(4*pi*delta1 / P);
alpha = gamma1 - sqrt(gamma1*gamma1 - 1);
c0 = (1 - alpha) / 2;
b2 = -1;
a1 = beta1*(1 + alpha);
a2 = -alpha;
elseif wid == "BS" then --INDICATOR
if I <= n then filt,filt1 = price,price; end
beta1 = cos(fi);
gamma1 = 1 / cos(4*pi*delta1 / P);
alpha = gamma1 - sqrt(gamma1*gamma1 - 1);
c0 = (1 + alpha) / 2;
b1 = -2*beta1;
b2 = 1;
a1 = beta1*(1 + alpha);
a2 = -alpha;
end;
if I > n then
filt = c0*(b0*price + b1*p1 + b2*p2) + a1*filt1 + a2*filt1 - c1*pn;
end;
Filt[I] = filt;
return filt1,filt
end
end
Владимир написал: И ещё раз: не бывает в природе никакой "справедливой цены"! Что бы там ни "считали на опционах".
Я ни слова не сказал про законы мировоздания (природы), здесь скорее нужно оперировать такими понятиями как ценность. Есть цена, есть стоимость, и есть ценность. Ценность в блокадном Ленинграде на золотые изделия, предметы искусства, равнялась кусочку хлеба.
Владимир, Как Вы не поймете, я рассказываю о подходе очень простом. Кто может двинуть цену - значительные средства. На каком рынке проще провести крупные сделки - там где есть ликвидность, за ней гоняется чтоб набрать свою крупную позицию. Крупная Позиция набрана - защищать будет? Крупная Позиция набрана - будет движение в сторону наборной позиции или отдаст всю прибыль ретейлу? Чтоб набрать Крупную Позицию обязательно будут следы. Нашли следы встали в направлении крупной позиции позиции, нашу сделку защищает крупный игрок. Какое его движение интересует ну точно не тайм фрейм 10 секунд . Так формируются тренды. И мы по тренду. Теперь задача сводится определить, когда Крупную Позицию начнут распределять ретейлу. Если в двух словах, действует правило "перехода из рук в руки". Ретейл - мене организованная часть, Крупная позиция обладает значительными средствами и ведет свою игру.
Владимир написал: Кроме того, я лично никогда не пользуюсь конструкциями вида #sec - скрипт сам знает размеры всех своих массивов. Например, размеры стеков хранятся в их нулевых элементах. И все индексы у меня числовые - так, на всякий случай, чтобы не нарываться на потенциальные проблемы с ключами.
"размеры стеков хранятся в их нулевых элементах" - этот прием я перенял у Вас, активно его использую, но он не везде подходит. Проблема возникает при перезапуске, а что делать если скрипт запустил и оставил не выключая тут целая серия задач возникает.
Цитата
Владимир написал: А "знать как надо" очень просто: надо так, как это представляется правильным в данный момент. Напишите ТЗ, и сами всё увидите.
ТЗ это хорошо в моем есть симулятор рынка, не могу сказать сколько раз я его уже переделываю и Вот опять надо.
Владимир написал: А что такое "достаточно ликвидные инструменты" на срочном рынке? Я вот с недавнего времени стал торговать НА ВСЕХ фьючах одного тикера - в частности, на квартальных: H, M, U, Z. Закрылись вот недавно Z3, открываю Z4 - пусть даже его пока и в природе не существует. Появится - начнёт торговаться. И ликвидность у него месяц-другой будет почти никакая. А потом постепенно раскочегарится. Мой скрипт умеет торговать при ЛЮБОЙ ликвидности. Между прочим, средняя прибыль на сделку у малоликвидных обычно даже выше.
почему важна ликвидность, высокая ликвидность позволяет проводить в сделке более высокие объёмы, это одна из причин почему здесь сидит крупняк, а это в свою очередь заставляет работать алгоритмы о которых я пишу и реализую!
Владимир написал: Планировать что-либо, считать какие-то риски просто глупо: "Хочешь рассмешить Господа - расскажи ему о своих планах". И ещё: даже при торговле на 10-секундном таймфрейме скрипт может держать позицию неделями, месяцами, годами. А может и секундами.
Всем чем можем управлять это риск! От него и строим сделку.
Цитата
Владимир написал: А что такое "замораживание капитала"? Я бы предпочёл термин "вложение". Деньги должны работать. Причём на фондовом рынке можно вкладывать чуть ли не 100% имеющихся средств, но на срочном это, мягко говоря, чревато.
На срочном после дневного клиринга даже бывает > 100% вложение, но я такое не люблю и уменьшаю позиции. Кстати Вы не считаете показатель из таблицы "состояние счета" "% Испол.ГО". Не могу понять как правильно?
Владимир написал: Я уже говорил, что мой личный рекорд 90.4% в день. И много раз говорил, что рынку насрать, что там МНЕ нужно: любой из тикеров может в любой момент и взлететь и упасть со страшной силой
Ну тут работает Ваше правило 300 * 9 = 2700 или 1/2700 капитала с работала на 90.4% в день.
Владимир написал: Потому в кубышке, что у Вас в коде указано ТРИ инструмента, а не 20. А если у Вас на 20 тикеров тупо денег нет? Или, наоборот, хватает на 200?
Цитата
VPM написал: У меня их не 3 это для простоты изложения, но точно не 300, к примеру для фондового рынка я установил правило ~ 5% Капитала на инструмент, 100% / 20% <= 20 бумаг в портфеле.
На фондовом у меня инвестиционный подход. А рассказываю я про срочный (спекулятивный подход). Сейчас торгую руками отслеживаю в основном 4 тикера, которые котируются в USD, для того чтоб оценить результаты одним взглядом т.е. посчитать пункты. А от 300 * 9 через пять минут можно в обморок упасть Для сравнения на стадии отладки пишу в скрипт тоже 4 , позволяет сравнивать два подхода!
Владимир написал: А что такое "достаточно ликвидные инструменты" на срочном рынке? Я вот с недавнего времени стал торговать НА ВСЕХ фьючах одного тикера - в частности, на квартальных: H, M, U, Z. Закрылись вот недавно Z3, открываю Z4 - пусть даже его пока и в природе не существует. Появится - начнёт торговаться. И ликвидность у него месяц-другой будет почти никакая. А потом постепенно раскочегарится. Мой скрипт умеет торговать при ЛЮБОЙ ликвидности. Между прочим, средняя прибыль на сделку у малоликвидных обычно даже выше.
Вы же сами говорите об эффективности использования капитала, а у Вас получается какую - то часть замораживаете на месяц, пусть даже небольшую, а зачем?
У фьючерса есть еще одна особенность, чем дальше срок исполнения, тем больше отклонение от справедливой цены! По мере приближения срока исполнения его цена будет смещаться в сторону цены актива!
Владимир написал: Ха-ха-ха! Комиссии НИКАК не зависят от количества тикеров. Если я сделаю 100 сделок на одном тикере или по одной на сотне тикерах, комиссия будет та же самая (если средняя цена лота у этой сотни такая же). И что делать с Вашим "правилом 5%", если у Вас те самые ТРИ тикера? Держать почти все деньги в кубышке? А ведь капитал и портфель меняются каждый день, если не каждую минуту!
1) Почему в кубышке? 20 инструментов * 5% капитала = 100% Капитала на 20 инструментов. 2) Как не зависит, у каждого инструмента своя комиссия. Но я даже не об этом. Представим, дневной диапазон одного инструмента в среднем ходит в день на 100 пунктов что составляет 2% изменения в цене. Мой Вариант чтоб взять 100 пунктов мне нужен 1 контракт, (2%), если риск позволяет получить 500 пунктов мне нужно 5 контракт (5*2%) и т.д. Ваш вариант так как тайм фреймы для принятия решений небольшие, а удержание позиции не значительное, то ценна на них делает несколько небольших колебаний, для простоты скажем 0.5%, для того чтоб набрать 2% нужно сделать 4 сделки (4 комиссии).
Владимир написал: Glukator , И у меня этот файл просто содержит строки вида "класс, код", только там ещё валюта, содержимое портфеля (если тикер там есть), настройки разные. Но тоже выдерживается правило "одна строка - один тикер". Кроме того, есть другие строки - данные по кошельку, номер счёта, можно переопределить режим работы скрипта (боевой, тестовый, по историческим данным), добавить или отнять денег или тикеров и т.д. Короче, структура внешнего файла тоже тщательно продумана и столь же подробно описана, как и структура данных в самом скрипте.
У меня это просто отдельный класс (таблица), то что пользователь задает , отвечает на вопросы , где торговать?, чем торговать? Какие средства использовать? и т.д. Я до пересмотра этого еще не дошел (у маркетмейкера структура, а я один ) Возможно далее что то автоматизирую.
Но сейчас актуально проблема как правильно организовать работу с получением хранением и обработкой РЫНОЧНЫХ данных! Что делать с памятью которая растет значительно к концу торгового дня (сессии)? Именно этот пример и привожу!
Владимир написал: 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;
feed[i].sec_scale -- это параметр тиккера sec_scale feed[i]. -- это таблица необходимых параметров? получаю при инициализации и обновляю при каждом обращении к инструменту (feed[i].bid)
Здесь нужно сказать, что у меня не одна глобальная таблица, а несколько и по возможности локальных + классы. Может этим ввел в заблуждение? Пока не вижу смысла собирать все в одну (придерживаюсь своего взгляда, принципиальную схему я показывал Выше)
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 --Открыть позицию
Glukator написал: Пока у вас 3 инструмента, эта хренота даже будет работать. Как только у вас их станет 300, или даже 30, вас не спасут ни терабайт оперативки, ни дох**ядерный процессор, потому что все это будет жрать память как голодный слон, тормозить и глючить. Задолбаетесь глюки обходить.
У меня их не 3 это для простоты изложения, но точно не 300, к примеру для фондового рынка я установил правило ~ 5% Капитала на инструмент, 100% / 20% <= 20 бумаг в портфеле. В Вашем варианте Капитал =100% / 300 бумаг <= 0.33% капитала на 1 бумагу? Но мне помнится у Вас еще нужно 300 * 9 тайм фреймов, считайте сами на кого работаете (комиссии).
ДА и на срочном 300 инструментов не нужны достаточно ликвидных. А стоимость позиции регулируется количеством контрактов, и зависит от риска принимаемого в данной позиции! Согласен есть некоторые сложности CreateDataSource, но к моему удивлению оказались не такими тяжелыми как предполагал ранее, видимо потому что лежат на сервере. Получаю так ds:SetEmptyCallback(); С памятью надо подчищать пока пробую варианты.
Glukator написал: Цитата VPM написал: Цитата Владимир написал: Во-вторых, закладыывать список тикеров в код и, следоватеьльно, править код на любой чих есть просто безумие А как нужно? Создайте текстовый файл со списком тикеров, которыми собираетесь торговать, и считывайте его при старте скрипта. У меня, к примеру, этот файл просто содержит строки вида КодTQBR:ABIO TQBR:ABRD TQBR:ZVEZ
В чем разница считывать из файла, или читать таблицу прямо из скрипта, кроме как удобства? local sec = { 'BRG4','NGF4', 'GDH4', }; for i=1,#sec do
Владимир написал: В-третьих, использовать CreateDataSource значит обрекать себя на бесконечные глюки даже если тикеров в портфеле будет столь жалкое количество. Ну и т.д.
Ну если считать то к примеру Н4 то не одной сделки не сделаешь, нужно тогда историю записывать и сохранять!
DS[i][j][n] На мой взгляд все логично, у каждого инструмента есть несколько тайм фреймов, в каждом тайм фрейме есть несколько баров (индексов), такая вложенность (матрешка), а дальше идут переменные или еще таблицы! Что не так?
Glukator написал: А не так что "хочу упихать все в таблицы" и все тут. Правильно организовать данные - это большая работа, и делается она не из желания упихать все куда-нибудь, а из соображений удобства и быстроты доступа к этим данным в дальнейшем.
"Таблицы в Lua — это не одна из структур данных, — это единственная структура данных". "Таблицы - это всё. Хотя, на самом деле, таблицы это просто способ хранить множество пар "ключ-значение", а все остальное - это то, какие вы выбираете ключи и какие значения."
Glukator, Согласен, Ну конечно все так и делают! Именно этим и занимаюсь, собираю отдельные переменные в таблицы. Цель максимально локализовать переменные. От этого тоже отказался лишнее bar={}; bar[ticer][tf][inde[]={}; Все уже и так есть.
nikolz написал: На верхнем графики автоматически строятся уровни поддержки и сопротивления и линии регрессии.
Если Вы используете в качестве входного параметра регрессию, то можно попробовать фильтровать цену за интересующий Вас период. Это позволит значительно уменьшить отставание, по сравнению с регрессией, а второе изменяя период можно пробовать на разных частотах, или сразу спектр частот. Если будете пробовать поделитесь результатом.
Склоняюсь к варианту А (подход Владимир,), подход опробован, как утверждает Владимир, показывает отличный результат, такое дерево всегда можно в последующим более аккуратно наследовать в глобальную таблицу. Подход Б требует дополнительного ознакомления, что можно чего нельзя. И так решено подход А, соберу в четырех этажную таблицу переменные. bar={}; bar[ticer][tf][inde[]={};
Пересмотрел главу Окружение. "Поскольку окружение — это обычная таблица, то вы можете просто индексировать ее нужным ключом (именем переменной). Похожим образом можно присвоить значение глобальной переменной, чье имя вычисляется динамически, если написать _G[varname] = value."
Есть еще одна интересная "штука": "Поскольку _ENV — это обычная переменная, мы можем обращаться к ней и присваивать значения как и любой другой переменной. Присваивание _ENV=nil сведет на нет любой прямой доступ к глобальным переменным в оставшейся части куска. Это может пригодиться для контроля над тем, какие переменные использует ваш код" "Конечно, главной областью применения _ENV является изменение окружения, используемого фрагментом кода."
for n in pairs(_G) do print(n) end; А так можно узнать какие глобальные переменные используются. Понимание организационной структуры приводит к пониманию, установлению компромисса между быстродействием и производительностью, ну и не забываем про простоту кода.
"Едем дальше, видим больше!" 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)
nikolz написал: Могу посоветовать следующее. Написали что-то. Поставьте в начале блока N=os.clock()и в конце time=os.clock() -N и выведите time в сообщение. Вы узнаете сколько реально в секундах у вас выполняется этот блок. Если это разовый блок в начале запуска, то время вообще не колышет. Если время вас устраивает, то забудьте про этот блок и пишите дальше.
Да я так делаю, еще получаю используемую память, а в главное окно скрипта вывожу прямо в заголовок окна, удобно всегда перед глазами информация как работает скрипт.
"Повторение мать ученья"! Благодарю за обсуждение и ликбез, не которые мои сомнения развеялись, понятно стало в какую сторону копать. Надеюсь что обсуждение было полезно не только мне.
Владимир, Ну мой пример маленько о другом, о тех переменных которыми редко пользуемся, те которые можно отправить на небольшое хранение и потом достать. Допустим торговая система открыла позицию, создали таблицу с параметрами этой позиции, писать в файл эту таблицу не эффективно, так как будем часто обращаться к ней , другое дело позицию закрыли записали свою сделку в файл, и достаем когда уже когда обрабатываем сделки.
Такой подход встречал в работах Nikolay, Не очень понятно зачем лезть в поле глобальной переменной, предполагал что ради видимости. Но не как не могу себе предположить, что это более эффективно, тогда возможно нужно дерево сделать как Владимир, ("Волки сыты и овцы целы")?
Цитата
Владимир написал: Для меня давно очевидно, что чуть ли не единственная важная тема - это определение структур данных. Даже код скрипта базируется на этом! И это СЛОЖНАЯ тема. В частности, "таблица Lua" у меня представляет собой большое разветвлённое дерево уровней на пять, если не больше. А переменные туда целесообразно относить, где их удобнее всего использовать.
Игорь М, Да нет в книге то, не понятно как в жизни этим пользоваться, чем руководствоваться можно какой - то не большой пример?
Цитата
Игорь М написал: Вы можете добиться того же эффекта при помощи следующего кода, который в десятки раз эффективнее предыдущего: 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) )
Владимир написал: Небольшой парсер в main, заглатыающий исходные данные при запуске скрипта и небольшая функция, сбрасывающая в файл дамп текущего состояния каждые 3 минуты - всё, что требуется. Работает как часы, в любых версиях Квика и языка.
Если Вы про парсер который освещали в начале своих публикаций, то я на нем "зуб потерял"? Дамп текущего состояния, вообще не понятно что туда писать, почему через 3 минуты сохранять, нужен какой - то подход?
При организации структуры программы в виде классов, проявилась еще одна особенность lua! В случае обнаружения при выполнении ошибки, скрипт останавливается, там где раньше перепрыгивал через эту ошибку и продолжал выполнение. Нашел этому объяснение, хочу поделиться:
"Errare humanum est. Поэтому мы должны обрабатывать ошибки как можно лучше. Поскольку Lua — это язык расширения, часто встраиваемый в приложение, он не может просто аварийно завершить работу или завершить работу в случае возникновения ошибки. Вместо этого при возникновении ошибки Lua завершает текущий фрагмент и возвращается в приложение."
"Любое неожиданное условие, с которым сталкивается Lua, вызывает ошибку. Ошибки возникают, когда вы (то есть ваша программа) пытаетесь добавить значения, не являющиеся числами, вызвать значения, не являющиеся функциями, индексировать значения, не являющиеся таблицами, и т. д. (Вы можете изменить это поведение с помощью метатаблиц , как мы увидим позже.) " Стало чуть сложней искать, но появилась уверенность, что программа с ошибками не будет исполняться!
Владимир, Вы подняли сейчас, очень нужную техническую тему и даже не одну, там где для Вас вещи очевидные, для меня и таких как я полная "тьма".
Цитата
Владимир написал: Во-первых, формат данных в ОЗУ совершенно другой - там важна скорость, прямой доступ к данным. Во-вторых, не нужно сохранять всё - у меня объём таблицы в ОЗУ раз в пять больше, чем сохраняемых данных.
Вопрос такой, не вдаваясь сильно в детали, есть какие - то критерии оценки какие переменные куда целесообразно относить,