Избранное трейдера Игорь В.
Всех приветствую.Не буду скрывать индикатор Price Channel мне очень нравится и близок. Первые свои прибыльные торговые системы в 2010 году строил на TSLab именно с использованием этого индикатора.
Сегодня хочу вам представить бесплатного торгового робота именно на индикаторе Price Channel. Это робот позволит торговать трендовый алгоритм на ММВБ через Quik на рынках: фьючерсов и акций.
Анализируемые инструменты: ММВБ, FORTS, FOREX, мировые индексы.
Особенности работы приложения:
1. Высокая точность определения пробоя цены, даже если это был секундный пробой и цена вернулась к прежнему уровню.
2. Повтор уведомления, если оно не было прочитано.
3. Вычисления происходят на отдельном сервере. И даже если у телефона временно отсутствовало интернет соединение, вы получите уведомление при восстановлении связи с сервером.
4. Синхронизация с различными устройствами. Т.е. настроить целевые уровни можно на компьютере, подкорректировать на планшете, а уведомления получать на телефон. (Необходима авторизация единым логином на всех устройствах.)
Кому пригодилось — ставим лайки!))
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
Добавляю код сделанного мной индикатора Parabolik в котором параметр ускорение зависит от волатильности. Чем больше волатильность, тем больше увеличивается ускорение и индикатор быстрее «догоняет» цену. Подобные есть на просторах интернета для метатрейдера (и не бесплатно), для квика не встречал.
Видно, что он дает меньше перескоков (красный), чем обычный Parabolik (черный). Хорошо себя зарекомендовал для выходов из позиций, открытых по тренду. На вход в боковике конечно будет давать ложные сигналы, как и обычный Parabolik (но меньше!), создатель которого не рекомендовал только его использовать для открытия позиций.
Код индикатора:
Settings = { Name = "Parabolic ATR", Period_ATR=14, line = {{ Name = "Parabolic ATR", Type = TYPE_POINT, Color = RGB(255,0,0), Width = 2 } } } old_idx=0 long=false short=false revers=false function Init() return 1 end function OnCalculate(idx) if idx<Settings.Period_ATR then return nil else if idx==Settings.Period_ATR then psar={} psar[idx]=L(idx) long=true hmax=H(idx) per_ATR=Settings.Period_ATR local TR=0 for js=(idx-per_ATR),idx-1 do TR=(TR+H(js)-L(js)) end Old_ATR=TR/per_ATR revers=true else if idx~=old_idx then local TR=0 for js=(idx-per_ATR),idx-1 do TR=(TR+H(js)-L(js)) end local ATR=TR/per_ATR af=ATR/(Old_ATR+ATR) af=af/10 Old_ATR=ATR if long then if hmax<H(idx-1) then hmax=H(idx-1) end psar[idx]=psar[idx-1]+af*(hmax-psar[idx-1]) end if short then if lmin>L(idx-1) then lmin=L(idx-1) end psar[idx]=psar[idx-1]+af*(lmin-psar[idx-1]) end revers=true end if long and L(idx)<psar[idx] and revers then psar[idx]=hmax short=true long=false lmin=L(idx) af=Step revers=false end if short and H(idx)>psar[idx] and revers then psar[idx]=lmin long=true short=false hmax=H(idx) af=Step revers=false end end old_idx=idx return psar[idx] end 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"…}, … }