Nikolay написал: Очиститься, а точнее, цитируя: "локальная переменная перестает существовать, как только заканчивается ее область видимости, позволяя сборщику мусора освободить память, занимаемую ее значением". Блок же закончился. И в вышеупомянутой книге - это описывается.
Nikolay написал: Что касается примера, основной вопрос - зачем? Какую задачу это решает. Создавать объект ради объекта - это тупиковый путь, хоть и популярный лет 20 назад. А во многих языках даже обязательный. Но это не относится к Lua. Да, здесь многое завязано на таблицы, если не почти все, если считать _G. Но это не значит, что нет других объектов first class citizen.
На мой взгляд это из области "написал и забыл"!
Мы один раз продумали структуру данных, а дальше через присвоение пользуемся - "по образу и подобию", не задумываясь почему там таблица не обновилась, где ты там забыл переменную локализовать, + "синтаксический сахар". Это просто удобно при использовании портфеля из бумаг.
"Структура с методами это простейший вариант объекта". т.е. создавая таблицу мы уже создали объект.
"Что же нам это дает? Вся сила мета таблиц в мета методах".
Пока в этом только разбираюсь, но у меня рабочий вариант которым пользуюсь - фреймворк HackTrade! Написан по этому принципу, и я не устаю "петь дифирамбы" его автору: надежность, лаконичность, скорость, минимализм, минимальное потребление памяти...
nikolz, Вы как то все пытаетесь усложнить, ну смотрите если "Таблицы в Lua —... — это единственная структура данных", из которой легко выводятся все остальные, то зачем изобретать очередной "велосипед", если это прекрасно работает, а примеры описываются первоклассными специалистами. Берем и пользуемся!
Да под запутался опять с видимостью переменных, а она напрямую зависит с очисткой. К истокам!
Цитата
Игорь М написал: Да какой сарказм-то... Я реально думаю, что автор будет впечатлён тем, что его фраза "Таблицы в Lua —... — это единственная структура данных" способна вызвать действие "перевожу все переменные в формат таблицы луа". Что это такое "перевожу все переменные в формат таблицы луа", как и зачем?
Так вот выше я показываю пример:
Цитата
Вот пример организации таблицы.
local pos={}; function pos:new() -- проинициализируем поля, процедуры и функции нашего класса ---- Создает экземпляр теперь уже объекта, описывает поля объекта и присваивает полям начальные значения. local obj = { [0]=0, ['d']='0', ['t']='0', ['o']='x', ['q']=0, ['p']=0, ['id']=0, ['f']=nil, tp=function(self,v) if self.q>0 then return self.p+v elseif self.q<0 then return self.p-v else return 0 end end, sl=function(self,v) if self.q>0 then return self.p-v elseif self.q<0 then return self.p+v else return 0 end end, }; ----далее превращаем таблицу в класс setmetatable(obj,self) ---- объект получает доступ к методам класса self.__index = self ---- возвращаем наш объект (экземпляр класса) return obj end
Цитата
Вот пример организации таблицы.
local pos={}; function pos:new() -- проинициализируем поля, процедуры и функции нашего класса ---- Создает экземпляр теперь уже объекта, описывает поля объекта и присваивает полям начальные значения. local obj = { [0]=0, ['d']='0', ['t']='0', ['o']='x', ['q']=0, ['p']=0, ['id']=0, ['f']=nil, tp=function(self,v) if self.q>0 then return self.p+v elseif self.q<0 then return self.p-v else return 0 end end, sl=function(self,v) if self.q>0 then return self.p-v elseif self.q<0 then return self.p+v else return 0 end end, }; ----далее превращаем таблицу в класс setmetatable(obj,self) ---- объект получает доступ к методам класса self.__index = self ---- возвращаем наш объект (экземпляр класса) return obj end
"ООП, "которого нет" Структура с методами это простейший вариант объекта. Метод это функция, сохраненная в элементе таблицы. Метатаблица способна менять обычное поведение других таблиц.
Что же нам это дает?
Вся сила метатаблиц в метаметодах. Метаметоды - Это "магические" методы, которые позволяют менять существующее поведение таблицы. "Магические" они потому, что их логика зависит от того, как они называются."
Да забыл сказать, таблицу луа организую с помощью setmetatable, может они плохо чистятся? Вот пример организации таблицы.
local pos={}; function pos:new() -- проинициализируем поля, процедуры и функции нашего класса ---- Создает экземпляр теперь уже объекта, описывает поля объекта и присваивает полям начальные значения. local obj = { [0]=0, ['d']='0', ['t']='0', ['o']='x', ['q']=0, ['p']=0, ['id']=0, ['f']=nil, tp=function(self,v) if self.q>0 then return self.p+v elseif self.q<0 then return self.p-v else return 0 end end, sl=function(self,v) if self.q>0 then return self.p-v elseif self.q<0 then return self.p+v else return 0 end end, }; ----далее превращаем таблицу в класс setmetatable(obj,self) ---- объект получает доступ к методам класса self.__index = self ---- возвращаем наш объект (экземпляр класса) return obj end
Посмотрел Вас на дзене, кое что интересного нашел для себя, переделаю работу со временем.
Касаемо памяти, выше я привел пример индикатора, это основной мой подход, он написан так чтоб можно было использовать и торговом алгоритме без переделок, так я и делаю. Нет я конечно понимаю что там есть область констант которые будут накапливаться, да еще передача целого массива данных, она хоть и локальна но все равно растет, особенно на малых тайм фреймах.
Можете здесь что то посоветовать, в организации переменных и их очистке? Я собственно начинал эту веточку с организации очередей, но Вы и Владимир не советовали с этим связываться?
VPM написал: Прислушался к автору, "Таблицы в Lua — это не одна из структур данных, — это единственная структура данных.", перевожу все переменные в формат таблицы луа, не знаю поможет?
Но все это лирика, а вот организация структуры данных в программе, оказывается не простым делом в луа. В очередной раз поймал утечку памяти в скрипте. 1000кВ на старте до 30000кВ на конец дня Такое поведение, раньше замечалось при наличии ошибки в программе, которую луа по какой то причине пропускает.
Прислушался к автору, "Таблицы в Lua — это не одна из структур данных, — это единственная структура данных.", перевожу все переменные в формат таблицы луа, не знаю поможет?
Другая проблема локальная переменная внутри блока не обновляется, помнит свое первое значение, в формате таблицы обновляется в качестве локальной нет? Кто то знаком с такой проблемой?
Поясню для всех, о чем собственно разговор (или обо всем и по порядку).
Так как мы занимаемся алгоритмической торговлей, то один из подходов для успешной торговли, это получение цифровой модели поведения цены. А что еще нужно, у Вас есть функция получаете ответ и торгуете!
Упрощенное представление модели, это разложение источника на примитивы. В тех. анализе: - низкочастотная составляющая (тренд) - это средние, регрессия и т.д.; - высокочастотная составляющая - это осцилляторы. В сумме это модель.
Мое утверждение что скрин отражает лишь одну из компонент более сложной модели. TGB, усмотрел в этом модель.
1) За период находит Мах Мин; 2) Проводится нормировка; 3) Усредняем полученный результат, получаем задержку в 1 бар; 4) Применяем преобразование Фишера (усиление сигнала на хвостах, перевод к норм. распределению, что позволяет оперировать аппаратом т. вероятности) 5) Компенсация отставания.
Гасит низко частотные колебания, сохраняя при этом высоко частотную компоненту с минимальной задержкой. Я искал замену стандартному схоластику, работает точнее и с минимальным отставанием.
TGB, Ну вот добрались и до "модели рынка", а все начиналось с безобидной статистической экспрес оценки сделок торговой системы.
Ну давайте сначала, речь идет о преобразовании данных, с применением прямого преобразования Фишера:
Утверждение 1) "Преобразование Фишера, изменяет плотность распределения любой волны таким образом, что оно приближается к нормальному (гауссову) распределению"; Утверждение 2) Преобразование Фишера, увеличивает идентификацию маловероятного события - “черного лебедя”;
В приведённом примере, торговая стратегия, основана (не на событии) на предсказании возвращения назад к норме (к своей средней), после выявленного маловероятного события "черного лебедя".
Нету здесь не вероятностной модели рынка, не еще какой либо, скорее это фильтр (detrender), который можно интерпретировать и как стратегию во флате.
P. S. Скрипт выводит 6 линий: 2 это придельные для наглядности нужно перевести значение на 1.5; сам ответ функции; опережающая линия компенсация отставания; гистограммы зеленая и красная отражают ускорение. Ниже 0 - медведи, выше 0 - быки.
Это полноценная торговая стратегия, конечно применять без дополнительного фильтра нужно осторожно. Функция циклическая сильно зависит от периода оценки. Я использую как дополнительный фильтр для оценки зон пере(куплено/продано).
nikolz написал: Оказывается, выборочное распределение этой преобразованной переменной следует нормальному распределению .
Ну так вот же
Цитата
VPM написал: "Преобразование Фишера, изменяет плотность распределения любой волны таким образом, что оно приближается к нормальному (гауссову) распределению". Код local trasform_fisher=function()--преобразования Фишера (Fisприводятсяher Transform) --Преобразование Фишера имеет вид: 0.5* (log( (1 + x) / (1 - x) ) )
local log=math.log local F={}; F[1] = 0 local start=true return function(I,x)
if I == 1 or start then F={}; F = 0; start=false end x = x and (x>=1 and 0.999 or x 1 and F[I-1] or 0) local fich = (1-x)~=0 and 0.25*log((1+x)/(1-x)) + 0.5*f1 or 0 F = fich return F--fich end end
nikolz написал: Можете пояснить, как Вы вычисляете Коэффициент корреляции Пирсона и какое он имеет отношения к цене акций?
Так выше же представлен код? это полноценный индикатор, сейчас работает у меня, нужно ему прикрутить голову, и все пробуйте. Там и все есть расчеты, Кроме модуля оценки несущей частоты, но он не нужен. Цену Лучше брать медианную или по другому усреднённую, по умолчанию это СLOSE, на больших тайм фреймах будет перерисовывать.
Я же в своей торговой системе применяю этот подход иначе. Суть, в определении зон перепроданости / перекуплености (вместо стандартного стохастика), так как данный алгоритм имеет отставание 1-2 бара, и компенсация еще убирает 1 бар. Фактически "шагаем в ногу со временем"!
nikolz написал: И где Вы его применили в своем роботе? Покажите.
Поправил, публикую как есть. подключил у себя
Это скрипт на стратегию Выведение торговли стратегий от Функций Распределения Вероятности опубликованную Джон Эхлерс в его статье, скрипт простой написан мною. О чем разговор: Суть стратегии от автора, определение маловероятного события, т.е. выброса цены в зону > 3G or <-3G. В примере приведенным nikolz, это Зарплата директора 450 тысяч. Это событие является сигналом на совершение сделки. Так как событие статистически значимое, то нужно ожидать возврата цены к ее среднему значению. В общем и все.
nikolz написал: И где Вы его применили в своем роботе? Покажите.
Робот звучит гордо!
Свой подход я публиковал выше, модульность в написании робота обсуждалась здесь.
Мой подход; 1) Торговая стратегия - это набор правил (на открытие, закрытие и т.д.); 2) Торговая система - это набор торговая стратегий; 3) Робот - это голова, ноги (чтоб можно было убежать вовремя), руки (что бы сделки совершать), в общем полная самостоятельность;
Я пишу подробно что бы можно было изъясняться на одном языке, а не поучаю.
У меня запрограммирована одна токая Торговая стратегия - "Выведение Торговли Стратегий От Функций Распределения Вероятности". Она очень простая. При на писании допустил концептуальную ошибку, сейчас не пользуюсь - отключил, нужно править.
nikolz, за приведенные ссылки спасибо, полистаю на досуге.
Касаемо моих замечаний:
1) Знание мои так себе, (последние четверть века занимался другими вещами). 2) Книгу Вам привел потому, что там не только описаны распределения, моменты и много еще чего, но и то как пользоваться, а главное приводятся запрограммированные примеры (берете код и пробуете, можно даже в квике). 3) Касаемо Вашего примера, нужно вспомнить правило 3 сигм (куда с какой вероятностью попадаю результаты), ну и конечно, простое среднее здесь применять нельзя, ну про Вы сами накидали ссылок. 4) Ни о каком распределение Фишера речи нет, я говорю о необходимости подготовки данных прежде чем использовать нормальное распределение, одним из таких является - Преобразование Фишера.
"Преобразование Фишера, изменяет плотность распределения любой волны таким образом, что оно приближается к нормальному (гауссову) распределению".
Код
local trasform_fisher=function()--преобразования Фишера (Fisприводятсяher Transform)
--Преобразование Фишера имеет вид: 0.5* (log( (1 + x) / (1 - x) ) )
local log=math.log
local F={}; F[1] = 0
local start=true
return function(I,x)
if I == 1 or start then F={}; F[I] = 0; start=false end
x = x and (x>=1 and 0.999 or x<=-1 and (-0.999) or x) or 0
local f1=(I>1 and F[I-1] or 0)
local fich = (1-x)~=0 and 0.25*log((1+x)/(1-x)) + 0.5*f1 or 0
F[I] = fich
return F[I]--fich
end
end
nikolz, я у Вас спрашивал про методы робастного оценивания или ссылку где посмотреть? Ну да ладно.
Не знаю как уж там Росстат считает не хочу вдаваться, но Ваш пример некуда не годится, это распространенное смысловое заблуждение. Вы бы ещё среднею температуру по больнице по считали бы.
Если вкратце, то среднее у нормального распределения ==0, в Вашем примере расчет простого среднего служит для привидения к такому виду и не для каких других целей. В трейдинге самое простое привидение считают доходности р1/р2 - 1, при этом нужно удалить тренд. Преобразование Фишера любые переменные приводит к такому виду. Я не хочу азбукой заниматься, вот ссылка John R. Hauser "Numerical Methods for Nonlinear Engineering Models" с примерами написанными на луа 5.1, если интересно смотрите можно и поэкспериментировать.
Можно подвести промежуточный итог, на тему обсуждаемую выше. Собрал небольшую программу, в основе лежит функция поиска приложенная Nikolay, за что ему скажем отдельное спасибо! Пока не очень разобрался как работает, но работает супер, (а к хорошему привыкаешь быстро ).
То, для чего и как, много сказано выше, здесь лишь о своей реализации. Подход: на оси времени графика есть текущее значение цены, правая сторона от текущее значение цены - это зона прогнозов; леваявая сторона - это история, определяя период тестирования определяем зону тестирования.
Я в своих подходах, зону тестирования еще делю на две. 1) фон - служит для определения того что происходит на рынке при старте торгового алгоритма; и для разгона алгоритмов использующих историю данных. 2) собственно сам тест то что сообственно обсуждалось выше.
Для прогона теста задаю количество дней тестируемых, сдвигаю индекс на таймфрейме дня, находим начальную дату и время. (Установил ограничения только внутридневные не больше 60 мин. такова пока особенность ф. поиска). От общего итератора пока тоже отказался, просто в алгоритм добавил счетчик для сдвига индексов тайм фреймов. Прогоняем стратегию, результат W/L обрабатываю методом описанным выше получаю экспресс оценку, торговой стратегии, если необходимо то и торговой системы целиком. Да добавил визуализацию вывод на график сигналов и параметров RM.
Теперь обрабатывает портфель из бумаг, в общем то и все, еще раз спасибо Nikolay, и удачной торговли!
Nikolay написал: Отлаживать не так и сложно, если в необходимых местах осуществлять проверки на тип данных, сами данные. Выводит отладочную информацию в лог. Сразу будет видно, где что не так.
Не поверите другой раз не могу лог загрузить из-за объема после дня работы скрипта. Да тип данных начал добавлять согласен.
Цитата
Nikolay написал: Как я написал выше - самый надежный, и самый простой вариант - это циклом пройтись от первого или последнего бара, проверяя время каждого бара. Как только оно пересечется с искомым - вот он ваш индекс.
И тут не все благополучно, поджидают подводные камни, так как время открытия бара разное на разных тф. на клиринге расходится. Уже молчу про выпадающее бары.
Алгоритм мне понравился, нужно привыкнуть и погонять, пока смущает сложность, Вы сами в самом начале писали про надежность. Я несколько скриптов бросал с хорошими идеями из-за сложности, поиск ошибок занимает значительное время, теперь все упрощаю, что бы было понятно с первого взгляда.
Nikolay написал: Ну так все зависит от задачи. Алгоритм простой. Можно все еще проще сделать. Просто циклом бежать от последнего к первому бару и найти тот, где время входит в бар.
Задачу не очень наверно понятно описываю, попробую по другому.
Так как торговля внутридневная , то анализ делаем дневного бара на истории которую хранит квик. наименьший день которую хранит квик будет определять наименьший тф М1, так как все тф. меньше дневного входят в него, то прогоняя цену ds[M1]:C(index) по разным тф. >M1 < D1, можно оценивать т.входа, т.выхода, стоплосс, такепрофит, оценивать алгоритмы и много чего, с выводом необходимых меток на график.
Как я делал был 1 инструмент, данные читал с графика, задавал точку входа да и просто циклом пробегал, беря цену закрытия с М1, по свечам допустим Н1, при этом необходимо свечи разных тф синхронизировать(т.е. если если наступил новый час нужно перевести минуту и час)
Писатель с меня еще тот, если что не понятно написал лучше спросите.
Понятно, написал и забыл не получится покрупней мере у меня
А что делать с ценной открытия, это даже не техническая ошибка. Не хочется таких слов произносить, но другие не находятся - это выглядит как "прямая манипуляция рынком". Но это уже вопрос к разработчикам? Как такое возможно?
Проба пера, вот время заказа os.time({hour = 9, min = 00, sec = 0, day = 14, month = 11, year = 2023})
ответ с 4 тайм фреймах [Tue Nov 14 15:50:16 2023] Trace: Source: SPBFUT, BRZ3, 1 [Tue Nov 14 15:50:16 2023] Trace: Source: SPBFUT, BRZ3, 5 [Tue Nov 14 15:50:16 2023] Trace: Source: SPBFUT, BRZ3, 120 [Tue Nov 14 15:50:16 2023] Trace: Source: SPBFUT, BRZ3, 1440 [Tue Nov 14 15:50:16 2023] Info: BRZ3; 1; 65537! [Tue Nov 14 15:50:16 2023] Info: [65537] 14/11/2023; 9:0:0; o[65537]=83.42; h[65537]=83.43; l[65537]=83.33; c[65537]=83.35 [Tue Nov 14 15:50:16 2023] Info: BRZ3; 5; 65537! [Tue Nov 14 15:50:16 2023] Info: [65537] 14/11/2023; 9:0:0; o[65537]=83.42; h[65537]=83.43; l[65537]=83.33; c[65537]=83.4 [Tue Nov 14 15:50:16 2023] Info: BRZ3; 120; 5516! [Tue Nov 14 15:50:16 2023] Info: [5516] 14/11/2023; 10:0:0; o[5516]=83.4; h[5516]=83.42; l[5516]=83.03; c[5516]=83.27 [Tue Nov 14 15:50:16 2023] Info: BRZ3; 1440; 1093! [Tue Nov 14 15:50:16 2023] Info: [1093] 14/11/2023; 0:0:0; o[1093]=83.43; h[1093]=83.43; l[1093]=82.42; c[1093]=82.82
На минутных отрабатывает, на Н2 идет сбой? Цена открытия сессии на D1 14/11/2023; 0:0:0; o[1093]=83.43; на M1 M5 [65537] 14/11/2023; 9:0:0; o[65537]=83.42;
nikolz написал: Основное из которых то, что на фондовом рынке действует нормальный закон плотности вероятности цены.
по меньший мере не корректно . Ну что значить "на фондовом рынке действует нормальный закон"?
Нормальный закон распределения наиболее формализован описан в литературе, Для того чтоб им можно было пользовать в наших целях, делается преобразования (доходности, лог доходности, приращения, преобразование Фишера...) В данный момент речь идет не про анализ динамики цен, про анализ сделок. Распределение сделок по времени(Wines/Loss) можно отнести к нормальному закону?
Нет я сейчас не про статистику управляющего хедж-фондом, это я видел и Вашу работу это все супер. Я про экспресс оценку, опубликована в статье John F. Ehlers "Evaluating TradingSystems", ну а без мат ожидания системы никуда. проще сразу сделать перевод.
Nikolay, я накидал алгоритм принципиально описав в сообщении 23.10.2023 16:41:34, на текущих данных все пойдет.
Стратегия описанная А. Элдером в его книгах, внутри дневная чтоб можно было получить оценку. Диверсификация портфеля 5% капитала на инструмент т.е. не более 20 бумаг. Прислушался к Вашему совету на кидал итератор для тестера, данные получаю через подписку с сервера. И чего только не натерпелся прогоняя исторические данные за несколько дней.
Алгоритм применил следующий 1) Получаю Индекс на D1 2) Сдвигаю индекс на количество дней для теста получаю дату начало. 3) на M1 определяю индекс на 0900 4) На внутридневных интервалах получаю цену закрытия М1, те смотрю как распределялась цена на других тайм фреймах, с визуализацией.
Все медленно прогоняю и просматриваю.
Нужно определить цену открытия сессии на 0900 имея перед глазами тайм фрейм H2, и Вот оно 0800 с ценами, так погодите сессия закрыта.
На выходе любой стратегии, после совершения сделки, мы имеем результат Wines/Loss. Именно его и обрабатываем для оценки показателей торговой системы. эти данные так же используются при расчете количества в сделке.
Nikolay написал: Не очень понятен вопрос. Как получить бар, зная дату и время?
Ну да Квик хранит свечи в виде массивов данных и разработчики предлагают чтоб получить свечу с ее данными нужно найти вначале индекс в массиве. И начинаются пляски с бубнами Но часто нужно ответить на вопрос какой была цена в 1200 на такую то дату?
Nikolay, Собственно поэтому я и пытаюсь более детально описать подход и загвозки связанные с ним.
Цитата
Nikolay написал: Так что если тестируете, то либо это надо делать часто (не скатившись в переобучение), либо должно быть самообучение с коротким горизонтом.
Вы не поняли, нет никакого обучения не какого AI даже не четкую не применяю, все максимально упрощено. сам алгоритм описан выше. Подход "система нескольких окон" заключается беру дневную свечу и внутри дня прогоняю меньшие таймфреймы, к примеру 1 час как цена распределялась за день, таймфрейм к примеру 1 минута внутри одного часа и т.д.
Стратегия входов и выходов это преодоление пороговых значений. Какая здесь может быть подгонка прогоняю 5 дней. Статистику считаю по сделкам.
Касаемо стационарности я имел ввиду привидение к нормальному распределению входных данных (цены). Описывать не чего все давно описано. Я лишь говорю про подход. Нормальное распределение является стационарным?
Karina Dmitrieva написал: В папку archive директории QUIK сохраняется информация (исторические данные) обо всех открытых графиках (в имени *.dat файла: класс, название инструмента, таймфрейм).По своему усмотрению Вы можете удалить всю папку archive или же конкретный файл. Но многие пользователи хранят данную информацию, чтобы была возможность просмотреть более дальнюю историю по инструментам, поскольку сам сервер QUIK хранит всего 3000 свечей, а Рабочее место QUIK умеет накапливать локально до 65000 свечей (для каждого инструмента и таймфрейма).Таким образом, при удалении данных о графиках (локально история будет очищена), но при подключении терминала QUIK к серверу и построении графика произойдет перезаказ архивов графиков с сервера (с количеством 3000 свечей + текущая торговая сессия).
Т.е. если, открыт график, "то локально до 65000 свечей (для каждого инструмента и таймфрейма)". можно использовать для анализа в наших целях. Получить эти свечи можно по индексу массива.
А как их получить цену зная дату и время дате свечи???
Если внутридневные стратегии еще куду ни шло, то уже средний срок без бэк - теста, и не туда и не сюда.
Экспресс показатели, ну это в первую очередь 1) мат. ожидание системы (должно быть положительно не важно какое значение но +); 2) Количество сделок (Выигрыш/Проигрыш) для расчета коэффициента процент выигрышных сделок; 3) Профит / Лосс, для расчета профит фактора. Я еще считаю оптимальную фракцию и средние показатели за сделку. Прошла сделка пересчет. Для экспресс анализа достаточно первых 3.
Далеко не секрет чтоб успешно торговать, нужна торговая система (набор стратегий), и совсем не важно ручная это торговля или алгоритм. Собрав торговую систему хотелось бы ее оценить, для этого применяется тестирование на исторических данных. Для оценки систем используют ряд показателей. Казалось бы что проще, загрузил, откатил индекс назад и прокатился по ним с применением стратегий. Квик хранит историю данных. Но не тут то было