Избранное трейдера MrD
Эта оценочная функция может быть эффективно вычислена и она нечувствительна к выбросам. Она может быть существенно более точна, чем неробастный метод наименьших квадратов для несимметричных и гетероскедастичных данных и хорошо конкурирует с неробастным методом наименьших квадратов даже для нормально распределенных данных в терминах статистической мощности.
Метод признан «наиболее популярной непараметрической техникой оценки линейного тренда»
Как говорится, трудно уснуть, пока в интернете кто-то не прав.
Случайны ли эти самые тренды? Таки нет вопроса более актуального на сегодняшний день:)
Возьмем часовую историю за 10 лет и проведем тот самый технический анализ: выделим все серии подряд идущих белых (черных) баров. Далее будем считать, сколько у нас получится серий из 1 белой (черной) свечи, сколько из двух, трех и т.д. Для сбербанка получается следующая картина:
Зеленым цветом окрашены серии растущих баров, черным — падающих. И, о, чудо! Серий из двух баров почти ровно в 2 раза меньше, чем серий из 1 бара… а серий из 3 баров опять же в два раза меньше, чем серий из 2 баров и т.д. Паскаля, Ньютона, Да Винчи сюда....
В общем, вполне себе такое случайное блуждание за 10 лет с точки зрения орлов и решек. Кстати, эта картина одинакова для всех бумаг, которые я посмотрел, и не зависит от объема торгов. Везет тому, кто знает о завтрашнем аресте Ходорковского и идет шортить акции Юкоса… для него никаких случайностей нет.
Размерность Минковского — это один из способов задания фрактальной размерности ограниченного множества в метрическом пространстве, определяется следующим образом:Размерность Минковского имеет так же другое название — box-counting dimension, из-за альтернативного способа ее определения, который кстати дает подсказку к способу вычисления этой самой размерности. Рассмотрим двумерный случай, хотя аналогичное определение распространяется и на n-мерный случай. Возьмем некоторое ограниченное множество в метрическом пространстве, например черно-белую картинку, нарисуем на ней равномерную сетку с шагом ε, и закрасим те ячейки сетки, которые содержат хотя бы один элемент искомого множества.Далее начнем уменьшать размер ячеек, т.е. ε, тогда размерность Минковского будет вычисляться по вышеприведенной формуле, исследуя скорость изменения отношения логарифмов.
- где N(ε) минимальное число множеств диаметра ε, которыми можно покрыть исходное множество.
Settings = { Name = "xBollinger_LinReg", period = 40, deviation=2, line= { { Name = "xBollinger_LinReg", Color = RGB(0, 0, 255), Type = TYPE_LINE, Width = 2 }, { Name = "xBollinger_LinReg", Color = RGB(192, 0, 0), Type = TYPE_LINE, Width = 2 }, { Name = "xBollinger_LinReg", Color = RGB(0, 128, 0), Type = TYPE_LINE, Width = 6 } } } function c_FF() local AMA={} local CC={} return function(ind, _p,_ddd) local period = _p local index = ind local vol = 0 local sigma = 0 local sigma2 = 0 local aav = 0 local bb = 0 local ZZZ = 0 if index == 1 then AMA={} CC={} CC[index]=(C(index)+H(index)+L(index))/3 AMA[index]=(C(index)+O(index))/2 return nil end ------------------------------ AMA[index]=AMA[index-1] CC[index]=(C(index)+H(index)+L(index))/3 if index < (_p) then return nil end period =_p if index < period then period = index end --------------- sigma=0 sigma2=0 aav=0 ZZZ=0 for i = 0, period-1 do ZZZ=CC[index+i-period+1] aav=aav+ZZZ sigma=sigma+ZZZ*(-(period-1)/2+i) sigma2=sigma2+(-(period-1)/2+i)^2 end bb=sigma/sigma2 aav=aav/period AMA[index]=aav+bb*((period-1)/2) sigma=0 sigma2=0 sigma3 = 0 for i = 0, period-1 do ZZZ=CC[index+i-period+1] sigma2=aav+bb*(-(period-1)/2+i) sigma=sigma+(ZZZ-sigma2)^2 end sigma=(sigma/period)^(1/2) return AMA[index]-sigma*_ddd,AMA[index]+sigma*_ddd, AMA[index] end end function Init() myFF = c_FF() return 3 end function OnCalculate(index) return myFF(index, Settings.period,Settings.deviation) end
Settings = { Name = "xLinRegP", period = 128, deviation=2, line= { { Name = "xLinRegP", Color = RGB(128, 128, 255), Type = TYPE_LINE, Width = 4 }, { Name = "xLinRegP", Color = RGB(192,128,128), Type = TYPE_LINE, Width = 4 }, { Name = "xLinRegP", Color = RGB(96, 128,96), Type = TYPE_LINE, Width = 4 } } } ---------------------------------------------------------- ---------------------------------------------------------- ---------------------------------------------------------- function cached_FF() local AMA={} local CC={} local II2 = 0 local II4 = 0 return function(ind, _p,_ddd) local period = _p local index = ind local vol = 0 local sigma = 0 local sigma2 = 0 local sigma3 = 0 local sigma4 = 0 local aav = 0 local aa = 0 local bb = 0 local cc = 0 local ZZZ = 0 local ttt = 0 if index == 1 then AMA={} CC={} CC[index]=(C(index)+H(index)+L(index))/3 AMA[index]=(C(index)+O(index))/2 II2=0 II4=0 for i = 0, period-1 do ttt=(-(period-1)/2+i)^2 II2=II2+ttt II4=II4+ttt^2 end return nil end ------------------------------ AMA[index]=AMA[index-1] ---------------------------------- CC[index]=(C(index)+H(index)+L(index))/3 --------------------- if index < (Size()-2) then return nil end ---------------------------------------------------- sigma=0 sigma2=0 sigma3=0 sigma4=0 aav=0 ZZZ=0 for i = 0, period-1 do ZZZ=CC[index+i-period+1] aav=aav+ZZZ sigma=sigma+ZZZ*(-(period-1)/2+i) ttt=(-(period-1)/2+i)^2 sigma3=sigma3+ZZZ*ttt end ------------------------ bb=sigma/II2 cc=(sigma3-aav*II2/period)/(II4-II2*II2/period) aa=(aav-cc*II2)/period aav=aav/period AMA[index]=aa+bb*((period-1)/2)+cc*((period-1)/2)^2 ------- парабола ------------------------------- sigma=0 sigma2=0 sigma3 = 0 for i = 0, period-1 do ZZZ=CC[index+i-period+1] sigma2=aa+bb*(-(period-1)/2+i)+cc*(-(period-1)/2+i)^2 ------- парабола sigma=sigma+(ZZZ-sigma2)^2 end sigma=(sigma/period)^(1/2) for i = 1, period-1 do ZZZ=aa+bb*(-(period-1)/2+i)+cc*(-(period-1)/2+i)^2 SetValue(index+i-period+1, 3, ZZZ) SetValue(index+i-period+1, 2, ZZZ+sigma*_ddd) SetValue(index+i-period+1, 1, ZZZ-sigma*_ddd) end SetValue(index+0-period+1, 3, nil) SetValue(index+0-period+1, 2, nil) SetValue(index+0-period+1, 1, nil) ---------------------------------- return AMA[index]-sigma*_ddd,AMA[index]+sigma*_ddd, AMA[index] end end ---------------------------- ---------------------------- ---------------------------- ---------------------------- ---------------------------- ---------------------------- ---------------------------- ---------------------------- ---------------------------- function Init() myFF = cached_FF() return 3 end function OnCalculate(index) return myFF(index, Settings.period,Settings.deviation) end
Продолжаем разработку универсального робота!
Выкладываю код OUR-0.3, который в настоящий момент еще далеко не полный – это только основа, скачать можно здесь https://yadi.sk/d/l3uic67yruCxa
Код прокомментирован подробно, но дам дополнительное описание общего плана, чтобы логику работы робота можно было представить.
Итак, по порядку:
Робот состоит из двух файлов: OUR.lua содержит основные функции (OnInit, main, коолбэки – пока только один OnStop), FunOUR.lua содержит вспомогательные функции – все остальные. Дополнительно приложен файл с информацией и файл с образцом котировок.
Функция OnInit
1 Первоначально котировки с сервера поступают в источник – таблицу с барами TBar (там все заполняется автоматически при подключении источника).
2 Далее робот делает различные вычисления, результаты которых он помещает в таблицу с данными TDat (также туда копируются параметры баров из TBar), эту таблицу нужно заполнять самому, ключи таблицы на свое усмотрение, но конечно часть ключей в алгоритм уже заложены, это «key»,«O»,«H»,«L»,«C»,«V»,«T» от них идут все вычисления. TDat – это таблица, содержащая таблицы по каждому бару, ключ соответствует номеру бара в источнике. Структура такого типа:
TDat = { [1321] = {"O","H","L","C","SMAf","SMAs"…}, [1322] = {"O","H","L","C","SMAf","SMAs"…}, … }