В прошлый раз http://smart-lab.ru/blog/330910.php зашла речь о поиске соответствия шаблону (или паттерну) через корреляцию. В трейдинге нет строгих соответствий, поэтому интересуюсь индикаторами, которые также не “ездят по рельсам”.
Для визуализации решил разработать индикатор для квика, который будет вычислять корреляцию между заданным шаблоном и ценами открытия баров (решил сделать по ценам открытия). Ссылка на скачивание ниже.
Как пользоваться. Добавляется индикатор в квик стандартным способом. Нужно создать в папке с квиком подпапку «LuaIndicators» (если её еще нет, в ней квик ищет пользовательские индикаторы). Скопировать туда скаченный файл индикатора «CorIndicator.lua», предварительно его разархивировав. Запустить квик и кликнуть правой кнопкой мыши на открытом окне с графиком, куда планируется добавить индикатор. В выпадающей меню выбрать «добавить график (индикатор)». Далее в списке выбрать индикатор «CorIndicator», установить галочку «новое окно» и нажать «да». Окно настроек можно оставить без изменений нажав «сохранить» или внести свои настройки.
В прошлый раз http://smart-lab.ru/blog/329488.php предложил добавить к скользящим средним каких-нибудь сигналов/индикаторов, чтобы использовать в стратегии для примера. Но ни от кого идей не поступило.
Подумав в указанном направлении, решил добавить в стратегию поиск шаблона/паттерна. Для поиска шаблона буду использовать корреляцию. Такая идея у меня была давно, но никак не доходили руки её проверить. Поэтому устрою проверку её эффективности в стратегии, используемой для примера. Появляется какая-то польза и для меня, так как результат мне не известен и полученные наработки (код) можно будет использовать в дальнейшем.
Сама идея проста – задаем последовательность значений, описывающих некоторое изменение цены, например:
Tpl = { 1, 2, 3, 4, 5, 4, 4.5, 3.5, 4, 3 };
Если указанную последовательность изобразить графически, то получим картинку, показанную на рисунке.
Продолжаем разработку универсального робота!
Выкладываю код 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"…}, … }
Подумал, что многие не знают, как подступиться к языку 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» переопределяю цвет, иначе они с фоном сливаются.
К сожалению, по указанной здесь причине тслаб пришлось оставить (хотя для тестирования на истории это хорошая программа), попытался перейти на проги от cofite.ru, но с ними все закончилось гораздо быстрее — не то (хотя в чем-то даже лучше тслаба). И тут узнаю про qlua, понял, что это то, что надо — не слишком сложно и очень функционально, но запал уже иссяк конечно. Ведь была потрачена уйма сил и времени, не только на изучение этих программ, но и на тестирование идей и т.п.
Как было отмечено в предыдущей части – вся суть технического анализа со всеми его индикаторами сводится к пересечению линий. Например, быстрая скользящая средняя пересекает медленную скользящую среднюю; цена пересекает уровень или любую линию какого-нибудь индикатора; RSI пересек уровень 70% и т.д. Ну пусть даже и есть исключения – напишем под них отдельные функции, главное, что наше обобщение будет охватывать 90% случаев ))).
Итак, из чего же состоят сигналы пересечения линий? А состоят они из событий и состояний. Событие – это факт пересечения, состояние – это фактическое расположение линий относительно друг друга.
На рисунке показано, как это выглядит геометрически на примере пересечения скользящих средних. А с точки зрения программирования эти события и состояния удобно представить в виде битовых флагов – сопоставить каждому из них определенный бит числа и если он установлен, то событие или состояние имеется и наоборот.Как известно, у всего сотворенного человеком есть свои ограничения и недостатки, поэтому, не смотря на то, что робот универсальный – идеал ему только снится. Но все же, робот, который пытается приблизиться к универсальности, должен основываться на максимально универсальных его составляющих частях.
По своей сути все роботы, торгующие на рынках, в конечном счете делают однотипные финальные операции, ради которых они и разрабатываются, эти операции заключаются в простых действиях – выставление заявок, снятие заявок, изменение их параметров и тому подобное – то есть круг операций не велик. А значит, нам требуется ограниченное количество функций, которые будут способны выполнить эти финальные операции. Даже если некоторые функции будут иметь несколько версий с различными вариациями, все равно их количество измеряется максимум двузначным числом.
А в чем же здесь универсальность? А универсальность будет заключаться в торговых заданиях, которые будут обрабатывать эти функции. Торговые задания – определенная структура с данными, содержащая всю необходимую информацию – что, сколько, где, когда и в каком направлении торговать. Получая такую информацию функции должны выполнять все автоматически, а так как они работают с однотипной структурой, то тоже являются универсальными. Но это конечно в идеале, как будет на самом деле – покажет разработка.
Все «прокладки» между квиком и роботом, типа TSLab, LiveTrade и т.п. ни к чему хорошему не ведут – требуют денег, времени, добавляют глюков и увеличивают риски, а также накладывают определенные ограничения. А для написания полноценных роботов не хватает знаний, умений и главное времени. Поэтому появилась идея.
В настоящее время QLUA – доступная и бесплатная технология алгоритмизации торговли. Язык QLUA прост и функционален для алгоритмизации большинства торговых идей, встроен в QUIK – самую распространенную торговую платформу на наших рынках.
С QLUA не надо думать, как «прикрутить» робота к рынку, как передавать и синхронизировать данные, заявки и т.п. – отпадает куча вопросов, которые на начальном этапе способны погубить энтузиазм любого начинающего алготрейдера. Можно использовать библиотеки, написанные и на других языках программирования, а значит, есть в каком направлении развиваться, правда, здесь я вообще не силен.
Сам я не программист. Обычно мое программирование происходит следующим образом: посмотреть в интернете как компилировать и/или исполнять программный код на выбранном языке программирования, при необходимости скачать и крякнуть требуемое ПО, посмотреть в интернете синтаксис, составить код, запустить, исправить ошибки, запустить и решить требуемую задачу.