Избранное трейдера Igr
Продолжаем разработку универсального робота!
Выкладываю код 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"…}, … }
--Параметры: p_classcode=«SPBFUT» --Код класса p_seccode=«RIH5» --Код инструмента p_account="...." --Код счета p_clientcode="...." --Клиенткий код p_count=2 --Размер позиции p_spread=170 --Проскальзывание
is_run = true count = 0
function main() while is_run do sleep(100) robot() end end
function robot() local N1=getNumCandles(«MA1-RIH5») local N2=getNumCandles(«MA2-RIH5») local N=getNumCandles(«RIH5») t1,n1,i1=getCandlesByIndex(«MA1-RIH5», 0, N1-3, 2) t2,n2,i2=getCandlesByIndex(«MA2-RIH5», 0, N2-3, 2) t,n,i=getCandlesByIndex(«RIH5», 0, N-1, 1) --сигнал на продажу (первый мувинг пересекает втрой сверху вниз if t1[0].close>t2[0].close and t1[1].close<t2[1].close then Trade(«S»,count+p_count,t[0].close-p_spread) end --сигнал на покупку (первый мувинг пересекает второй снизу вверх if t1[0].close<t2[0].close and t1[1].close>t2[1].close then Trade(«B»,p_count-count,t[0].close+p_spread) end end
function Trade(a_oper,a_count,a_price) if a_count>0 then t = { [«CLASSCODE»]=p_classcode, [«SECCODE»]=p_seccode, [«ACTION»]=«NEW_ORDER», [«ACCOUNT»]=p_account, [«CLIENT_CODE»]=p_clientcode, [«TYPE»]=«L», [«OPERATION»]=a_oper, [«QUANTITY»]=tostring(a_count), [«PRICE»]=tostring(a_price), [«EXPIRY_DATE»]=«GTS», [«TRANS_ID»]=«1» } res=sendTransaction(t) message(«Количество до »..tostring(count).." количество сделки "..tostring(a_count).." тип операции"..a_oper,1) if a_oper==«B» then count=count+a_count else count=count-a_count end message(«Количество после »..tostring(count),1) end end
function OnStop(stop_flag) is_run=false stop_flag=1 end
Подумал, что многие не знают, как подступиться к языку Qlua и запустить робота в квике. А между тем, это настолько просто, что даже не требует ничего кроме квика, виндусовского блокнота и знаний самого Qlua.
Qlua – это скриптовый язык поддерживаемый квиком, в основе язык lua 5.1 (в моем квике версия такая).
Скрипты, написанные на Qlua – это обычные текстовые файлы, которые имеют расширение «.lua». То есть можно сделать файл в обычном блокноте и после сохранения поменять в нем расширение с «.txt» на «.lua». Если внутрь этого файла записать инструкции кода на языке Qlua, то квик будет выполнять их.
Для удобства написания инструкций кода лучше пользоваться не виндусовым стандартным блокнотом, а например Notepad++, который можно скачать официально и бесплатно здесь https://notepad-plus-plus.org/download/v6.9.1.html. Он позволяет включить подсветку синтаксиса различных языков программирования, в том числе и lua, что очень помогает при написании кода.
В Notepad++ в «Опции -> Настройки» можно выбрать русский язык, а в «Опции -> Определение стиля» установить для lua понравившийся стиль отображения. Я для «Язык -> lua» ставлю стиль «Выбрать стиль -> Bespin» и еще в окошке «Стиль» для последних трех «FUNC» переопределяю цвет, иначе они с фоном сливаются.
Settings={ Name = "Fractal_Chennal", period=5, line={ { Name = "Level_High", Type =TYPE_LINE,-- = LINE --линии = DASH -- тире = POINT -- точки Width = 1, Color = RGB(0,255, 0)--green }, { Name = "Level_Low", Type =TYPE_LINE, Width = 1, Color = RGB(255,0,0)--root }}} idx_prosl=0 function Init() return 2 end function OnCalculate(idx) if idx==1 then P = math.floor(Settings.period/2)*2+1 message("Код бумаги: "..getDataSourceInfo().sec_code.." ; период индикатора: "..P,1) t_H,t_L={},{} end if idx~=nil and idx>P then if idx_prosl~=idx then local l=idx-P for l=l,idx-1 do t_H[l]=H(l) t_L[l]=L(l) end if t_H[#t_H-(P-1)/2]==math.max(unpack(t_H,#t_H-P+1,#t_H)) then H_ind_value=t_H[#t_H-(P-1)/2] end if t_L[#t_L-(P-1)/2]==math.min(unpack(t_L,#t_L-P+1,#t_L)) then L_ind_value=t_L[#t_L-(P-1)/2] end end else H_ind_value=nil L_ind_value=nil end idx_prosl=idx return H_ind_value, L_ind_value endКак пользоваться:
Начало здесь.
Это третья часть интервью со старшим менеджером алгоритмических стратегий большого хедж-фонда. В первой части мы обсуждали теоретическую стадию создания алгоритмической стратегии. Во второй части говорили о передаче стратегии «в производство». Это интервью вызвало много вопросов у наших читателей, ответы на которые были выделены в отдельный пост.
1.Как вы отслеживаете и управляете вашими моделями в боевых условиях? Какие дополнительные проверки и процедуры используются?
Я верю в ручное отслеживание прибыли/убытков в качестве инструмента диагностики. Мне нужно знать, каждый день, точный источник моих прибылей/убытков. Что подорожало, что подешевело, насколько и почему. Это дает мне уверенность, что модель работает, как должна, и это действует как система предупреждения плохих новостей.
В этой статье хочу рассказать об удобствах работы с сайтом налоговой nalog.ru и о преимуществах и простоте работы с его онлайн кабинетом для физических лиц.
Приходя на биржу и торгуя различными инструментами, готовьтесь не только получать прибыль от своих вложений, но и платить налоги от своей прибыли. И пусть брокер удерживает весь налог за вас, так что лично вам не нужно что-либо делать, все равно взять налоги под свой контроль и видеть отчеты по всем периодам всегда полезно.
Если же вы открыли ИИС и претендуете на налоговый вычет, то познакомиться с налоговой вам придется в любом случае. И как оказалось, сделать это сейчас очень просто.
Скажу сразу, через личный кабинет физического лица на сайте ФНС nalog.ru вы можете:
Первую часть интервью смотрите здесь.
Что нужно учесть при запуске стратегии в производство?
Новичкам нужно обратить внимание на соответствие «реальному миру» — на нюансы типа дней экспирации и праздников. Когда вы калибруете систему на исторических данных, можно допускать аппроксимацию без таких дней. Но когда вы переходите к реальной торговле, то не можете быть небрежным, все должно быть максимально точно.
Другой аспект заключается в том, что скорость критична. Я не могу рассчитывать модель в реальном времени (градиентный поиск очень медленный), поэтому нужно все сократить до линейных аппроксимаций изменений. Все это влечет за собой много матричных манипуляций.
Обычно создается исполнительный прототип, который делает все правильно, но не очень эффективно. Затем я поручаю моим сотрудникам-инженерам сделать производительную версию стратегии на языке Python или даже С, используя библиотеки для реального рынка, которые они создавали и совершенствовали годами. И эта версия подключается к моей торговой системе, для запуска данной стратегии «в бой».