Продолжаем разработку универсального робота!
Выкладываю код 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"…},
…
}
Робот на каждом шаге смотрит индекс последнего бара в таблице TBar и проверяет проведены для него вычисления в таблице TDat или нет, в зависимости от этого делает необходимые вычисления.
3 Задаваемые значения (типа периодов индикаторов, настроек робота и т.п.) помещаются в таблицу значений TVal. Ниже вызывается фунция funVal, которая дополняет таблицу значений – сделал, чтобы задавать значения, касающиеся моей личной стратегии – так удобней, в открытой версии функция пуста).
4 Таблица TSrv – содержит время сервера в трех форматах, в коде все описано. Таблица TStm содержит параметры сигналов времени – последовательно разбиваете сутки на периоды (начиная от 00:00:00), в которые указываете, что можно делать роботу, сигналы расписаны в файле с информацией (можно добавлять дополнительно строки, но надо чтобы время шло последовательно – разнобой пока не обрабатывается). Время и дата в роботе представляется в 3-х видах: обычная текстовая строка (стараюсь в имени переменной добавлять префикс St), таблица формата DateTime (стараюсь в имени переменной добавлять префикс DT), целое число формата Posix – количество секунд прошедшее с какой-то даты (стараюсь в имени переменной добавлять префикс Px). Префиксы кажется есть везде, кроме Bar:T(i) (здесь DateTime по умолчанию создает квик) и Dat[i].T (здесь не стал менять традицию и использую обозначение T, но формат Posix).
5 Таблица TSec содержит параметры инструмента, вероятно в ней же будут помещаться параметры позиций, так как они относятся к инструменту.
6 Во вспомогательных функциях имена указанных таблиц представляются без буквы «T», ну и по тексту могу где-то «T» не указывать. Имена вспомогательных функций начинаются с символов Fun…
Функция main
1 Сначала подключаем источник данных, потом делаем проверки, далее идет основной цикл робота, который «крутится» с заданной задержкой.
2 Внутри цикла робот определяет количество баров в источнике данных TVal.N и вызывает две функции – одна осуществляет расчет на истории FunCompleted (рассчитывает каждый бар до текущего незавершенного бара), другая осуществляет расчет только для текущего бара FunCurrent. В этих функциях никакой код менять не надо, но они вызывают другие 4 функции (FunNewBar1, FunNewBar2, FunOldBar1, FunOldBar2) в которые и нужно вносить необходимый вам код.
3 Указанные функции выполняют следующее (после окончания паузы конечно):
FunNewBar1 – выполняется один раз при появлении нового незавершенного текущего бара (например, если торговля будет вестись от цены открытия бара, то расчеты надо делать в этой функции).
FunNewBar2 – выполняется каждый раз при снятии с паузы для незавершенного текущего бара (если необходимо что-то контролировать постоянно – с максимальной скоростью, например стакан, то это надо делать в этой функции).
FunOldBar1 – выполняется всего один раз при запуске робота для вычисления предистории (при вычислениях часто идет обращение к вычислениям на предыдущих барах, поэтому при начале вычислений на первых барах истории надо задать значения к которым будет обращаться робот — предистория, обычно хотя бы нули, чтобы у робота алгоритм сошелся, здесь это и задается). Количество баров предистории задается параметром TVal.Hpre – обычно это как минимум 1 бар.
FunOldBar2 – выполняется один раз для каждого бара на истории и для только что завершенного текущего бара. Когда текущий бар завершается, то он становится историей и для него один раз вызывается эта функция. Количество баров истории, для которых надо все рассчитать задается параметром TVal.H – обычно это количество, необходимое для того, чтобы все сигналы стратегии адекватно определились. Если торговать по завершенным барам, то основной алгоритм надо расположить в этой функции – это кстати будет и наш случай наверное, будем осуществлять анализ по закрытым барам (но это еще обсудим).
В функциях параметр i – это номер бара для которого проводится вычисление – бар для которого вызвана функция. Функции для каждого бара, если выполняются условия требующие вызова и описанные выше, вызываются автоматически, при написании кода не надо беспокоиться о вызове, надо просто оперировать индексом бара i для которого вызвана функция.
4 Еще есть параметр TVal.Hplus – он задает количество баров на которые растягивается «хвост» индикаторов – нужно чтобы эти бары были в источнике данных. Сумма TVal.H + TVal.Hplus + TVal.Hpre – это то минимально необходимое количество баров, которое требуется для запуска робота.
5 Таким образом, весь процесс задания стратегии в роботе будет происходить в указанных в п.3 четырех функциях, в них надо вычислить необходимые параметры (сигналы) и вызвать торговые функции с этими сигналами. Если для вычисления понадобится какая-то особенная функция, то её надо написать и добавить в код робота, после чего вызывать в указанных четырех функциях.
Сигналы
Первичный сигнал пересечения скользящих средних использующий 8 бит вычисляется в переменной Dat[i].beepFS, его биты описывал в этой статье http://smart-lab.ru/blog/325075.php .
Сигнал Dat[i].beepFS пересчитывается в сигнал Dat[i].beepTr использующий 4 бита (это будет сигнал тренда) этот сигнал попроще – определяет только направления низ и верх, а равенство исключает, для нашего случая заморачиваться на равенстве линий нет смысла:
(1000) = состояние в (0100) - событие в (0010) - событие н (0001) = состояние н
Далее
1 По индикаторам. Я сторонник, чтобы используемые индикаторы вычислялись в роботе, поэтому значения быстрой и медленной скользящих средних вычисляются отдельной функцией FunSMA, которая записывает значения SMAf и SMAs в массив Dat для бара с индексом i. При желании конечно можно брать значения индикаторов с графиков, но это более муторно – появляется привязка к графику и для этого все равно понадобится какая-нибудь функция.
2 По быстродействию. Планирую отрабатывать робота на минутных таймфреймах с паузой не менее 1 секунды, думаю для терминала квик достаточно раз в секунду анализировать ситуацию, если нужна скорость, то это уже не квик ))), для таймфреймов побольше наверное проблем не должно быть.
3 Контроль. После запуска и остановки робота в папке создается файлик в который сбрасывается содержимое таблицы TDat – это чтобы можно было анализировать, что у него там внутри происходит. Каждый раз создаются новый файл – к имени добавляется время.
4 Остальное описание можно посмотреть в коде, если что не понятно, спрашивайте.
5 Для запуска робота надо выполнить в квике файл OUR.lua (квик к серверу можно и не подключать, конечно, надо обратить внимание на настройки робота – например, на инструмент, котировки которого должны быть в наличии), все файлы должны находиться в одной папке. Как запускать – можно посмотреть здесь http://smart-lab.ru/blog/325678.php .
Последние дни занимался функцией, которая будет парсить котировки, чтобы сделать возможность тестирования стратегий на истории. Затем эти котировки будут заливаться в таблицу TBar и робот сможет по ним прогонять алгоритм. Далее надо разрабатывать функции, которые будут вычислять торговый сигнал и обрабатывать его – торговать, а также подсчитывать профит (хаха…) при тестировании на истории.
Подумал, что к пересечению скользящих средних нужно еще что-нибудь добавить – какие будут предложения – какие сигналы/индикаторы еще использовать в стратегии для примера?
Знания программирования не нужны, проще, чем тслаб.
В робот можно загнать до 50-ти различных систем на разных тикерах для диверсификации.