Создание индикаторов на языке луа. Все для терминала QUIK

Продолжаю отвечать на ваши вопросы.

Вопрос: Есть ли какой-нибудь простенький примерчик с анализом волатильности и торговлей на пробой?

Сейчас мы этот примерчик напишем. Предположим, мы хотим покупать бумагу, когда котировки пробивают некий верхний уровень и продавать, когда пробивает некий нижний уровень. Уровни определяем путем прибавления (для верхнего уровня) или вычитания (для нижнего уровня) средней волатильности за определенное количество свечей от цены закрытия предыдущей свечи.

Для определения средней волатильности мы применим индикатор ATR (Average true rage). Стоит заметить, что в Quik-e, что бы программа на qpile или qlua могла брать с графика данный, график должен быть открыт (в том числе и индикатор). Поэтому давайте прямо сейчас откроем какой нибудь график, например, ЛУКОЙЛ:

И добавим к нему индикатор:

Там же можно настроить цвет линий:

Параметры, например, количество периодов:

И ввести идентификатор:

Идентификатор нужен, что бы мы могли обратиться к нему в программе. В дальнейшем можно редактировать параметры индикатора щелкнув по графику правой кнопкой мыши и во всплывшем меню выбрать «Параметры графика»:

Аналогично можно отредактировать параметры свечек (Price), так же задав для них идентификатор:

А теперь будем учиться получать данные с графиков. Для начала со свечек:

local N= getNumCandles("MyPrice")

t, n, i= getCandlesByIndex("MyPrice", 0, N- 2, 2)

message("Предыдущая свеча close=".. t[ 0]. close, 1)

message("Текущая свеча close=".. t[ 1]. close, 1)

Данный скрипт выдаст два числа: сначала закрытие предыдущей свечи, а потом закрытие текущей:

А затем для текущей свечи:

Стоит заметить, что значение close текущей свечи постоянно меняется, так как она еще не сформирована. Так же могут меняться higt и low у этой свечи. А вот предыдущая и все те, что левее их, остаются прежними - они уже сформированы.

Теперь разберем конструкции:

local N= getNumCandles("MyPrice")

t, n, i= getCandlesByIndex("MyPrice", 0, N- 2, 2)

Сначала мы получаем количество свечей. Дело в том, что функция getCandlesByIndex требует указывать, с какой по счету свечи мы получаем данные, а счет начинается с самой левой свечки. Она имеет номер 0, а самая права, текущая, соответственно N-1 - на единицу меньше количества свечек.

Теперь о синтаксисе функции getCandlesByIndex. У нее четыре параметра. Первый - идентификатор графика, который мы ставили выше. Если у нас несколько графиков, то мы как раз сможем их различать по этому идентификатору. Второй параметр - номер линии, для свечей тут должен стоять нуль. Третий - с какой свечи мы начинаем получать свечи, ее номер. В нашем случае это N-2 - мы хотим получить предпоследнюю и последнюю свечки. И, наконец, четвертый параметр - количество свечек, которые мы хотим получить.

Таким образом, если мы хотим получить только одну текущую свечу мы можем воспользоваться вот таким вот кодом:

Обратите внимание, что функция getCandlesByIndex возвращает целых три значения. Самое первое, как вы уже поняли, это сама таблица свечей. Второе значение - это количество свечей в полученной таблице. Казалось, бы зачем оно нужно? Вроде как количество должно быть равно четвертому параметру, не? Не всегда. Как вы думаете, сколько свечей вернет вот такая конструкция:

Вовсе не 10, так как начиная со свечи N-3 мы имеем только три свечки, поэтому программа выдаст:

А вот если мы напишем:

local N= getNumCandles("MyPrice")

t, n, i= getCandlesByIndex("MyPrice", 0, N- 3, 2)

То количество свечей будет равно 2.

А вот что это за третье возвращенное значение? А это так называемая легенда - подпись графика:

По умолчанию это название бумаги, но можно отредактировать и поставить свое название.

Аналогично мы можем брать данные и с индикатора:

local N= getNumCandles("MyATR")

t, n, i= getCandlesByIndex("MyATR", 0, N- 2, 2)

message("Предыдущее значение индикатора ".. t[ 0]. close, 1)

message("Текущее значение индикатора ".. t[ 1]. close, 1)

Таким образом, мы можем получить значения свечей и индикатора и вычислить уровни на пробой.

Далее вопрос: а как торговать на пробой уровней? Можно использовать стоп лоссы. Они как раз сработают при пробое: купят при пробое вверх и продадут при пробое вниз. Стоп лосс выставляется практически точно так же, как и обычная заявка (см..aspx?id=773), только в поле ACTION ставиться значение NEW_STOP_ORDER, а так же обязательно заполняются поля STOP_ORDER_KIND, STOPPRICE и EXPIRY_DATE.

После прихода очередной свечи может возникнуть необходимость переставить стоп лоссы (если они еще не сработали). Для преставления стоп лоссов мы удаляем старые стоп лоссы и выставляем новые. Как удалять см. урок 6 (). Стоп заявки удаляться точно так же, как и обычные, только ACTION ставиться KILL_STOP_ORDER.

Что бы не выставлять повторно стоп заявки, будем запоминать номер выставленной заявки, а если заявка удалена или исполнена - снимать этот номер. Для этого в процедуре OnStopOrder (это предопределенное имя) будем анализировать флаги. Как анализировать флаги см. урок 4 ().

Может возникнуть вопрос: А как обеспечить, что бы проверка сигнала была только на каждой новой свече? Вообще, можно воспользоваться функциями CreateDataSource и SetUpdateCallback, но до них мы еще дойдем. А пока, в простейшем примере торговли на пробоях с анализом волатильности, который находиться в приложении 1, я сделал проще: старые уровни для пробоя запоминаются в момент выставления стоп ордеров. Когда новые уровни отличаются от старых (а это может быть только с приходом новой свечи, так как уровни рассчитываются по предпоследней свече, а она не меняется), робот пересматривает стопы, в случае необходимости удаляет и выставляет новые.

Робот в примере создан так, что он может докупать либо допродавать (увеличивать позицию). Таким образом, если цена идет в одну сторону, то позиция увеличиваться, если пошел в обратную сторону, стала уменьшаться. Это весьма разумная стратегия управления капиталом - постепенный вход в позицию. Контроля, до каких пор робот может наращивать позицию - не предусмотрено, так как это простой учебный пример.

Вопрос: Все таки для начинающих никак не подходит работа со стаканом — на истории стакан не потестить, лучше рассмотреть работу со свечками, например стратегию по скользящим средним — как получать свечки и значения скользящих средних..... чего не избежать при использовании вашего примера..

По работе со свечами, могу дополнить обещанным чуть выше описанием функций CreateDataSource и SetUpdateCallback. Эти функции позволяют создать CALLBACL функцию и привязать ее к графику. Эта функция будет вызываться каждый раз, как только на графике произойдут какие либо изменения. Вот пример:

p_classcode= "TQBR" --Код класса

p_seccode= "LKOH" --Код инструмента

Служебные переменные

is_run = true

function cb(index)

local t = ds: T(index)

local str = "свеча № ".. tostring (index).. " из ".. tostring (ds: Size()).. " open=".. ds: O(index)

str = str.. " high=".. tostring (ds: H(index)).. " low=".. tostring (ds: L(index))

str = str.. " close=".. tostring (ds: C(index)).. " объем: ".. tostring (ds: V(index))

str = str.. " дата и время=".. tostring (t.day).. ".".. tostring (t.month).. ".".. tostring (t.year).. " ".. tostring (t.hour).. ":".. tostring (t.min)

str = str.. ":".. tostring (t.sec).. " и ".. tostring (t.ms).. " мс"

message(str, 1)

function main()

ds= CreateDataSource(p_classcode, p_seccode, INTERVAL_M1)

ds: SetUpdateCallback(cb)

while is_run do

sleep(100)

function OnStop(stop_flag)

is_run= false

Запустите его и каждый тик на графике вы будете получать вот такое вот сообщение:

Каким образом при помощи данной функции мы можем отследить приход новой свечи? Очень просто. Если изменился номер текущей свечи, либо ее дата и время, то это новая свеча.

Вопрос. Интересно не само программирование, тут просто логика... а именно разбор наиболее часто применяемых, стандартных операторов языка и их синтаксис.

На самом деле мы уже разобрали достаточно много конструкций qlua. Но вот работу с окнами еще не разбирали. Помните, на qpile робот назывался «портфелем» и имел специальную таблицу-окно, в которую можно было выводить различную информацию, например, сообщать пользователю о ходе работы робота?

Вот так, например, выглядела эта таблица для робота, который мы разбирали на уроке Стохастик с фильтром на Qpile (часть 2) (http://сайт/community/article.aspx?id=246):

На qlua Тоже можно создавать такие окна, при чем не одно, как на qpile, а несколько. Различаются такие окна по дескрипторам. Дескриптор - это его идентификационный номер, который возвращает функция AllocTable(). После того, как при помощи функции AllocTable() был создан дескриптор, он может быть использован для создания окна. Сначала мы объявляем заголовки при помощи функции AddColumn, затем при помощи CreateWindow мы открываем это окно. После чего можем добавлять в него строки, например, при помощи функции InsertRow.

Давайте переделаем пример, который при каждом изменении графика выводил сведения о текущей свече в сообщение. Пусть теперь он выводит нам тоже самое в таблицу:

p_classcode= "SPBFUT" --Код класса

p_seccode= "GZZ4" --Код инструмента

Служебные переменные

is_run = true

function cb(index)

local t = ds: T(index)

row = InsertRow(id, - 1)

local str= tostring (t.day).. ".".. tostring (t.month).. ".".. tostring (t.year).. " ".. tostring (t.hour).. ":".. tostring (t.min).. ":".. tostring (t.sec)

SetCell(id, row, 1, tostring (index))

SetCell(id, row, 2, tostring (ds: O(index)))

SetCell(id, row, 3, tostring (ds: H(index)))

SetCell(id, row, 4, tostring (ds: L(index)))

SetCell(id, row, 5, tostring (ds: C(index)))

SetCell(id, row, 6, tostring (str))

SetCell(id, row, 7, tostring (ds: V(index)))

message(str, 1)

function main()

id= AllocTable()

AddColumn(id, 1, "№ свечи", true , QTABLE_INT_TYPE, 11)

AddColumn(id, 2, "open", true , QTABLE_DOUBLE_TYPE, 10)

AddColumn(id, 3, "high", true , QTABLE_DOUBLE_TYPE, 10)

AddColumn(id, 4, "low", true , QTABLE_DOUBLE_TYPE, 10)

AddColumn(id, 5, "close", true , QTABLE_DOUBLE_TYPE, 10)

AddColumn(id, 6, "datetime", true , QTABLE_STRING_TYPE, 20)

AddColumn(id, 7, "volume", true , QTABLE_DOUBLE_TYPE, 15)

message(tostring (CreateWindow(id)), 1)

ds= CreateDataSource(p_classcode, p_seccode, INTERVAL_M1)

ds: SetUpdateCallback(cb)

while is_run do

sleep(100)

function OnStop(stop_flag)

is_run= false

А вот результат работы этой программы:

На этом урок окончен, но мы с вами не прощаемся, до новых встреч.

Прикрепленные файлы

Как известно, трейдеры на всех рынках используют индикаторы, более того, популярность данного метода анализа достигла таких масштабов, что сегодня уже невозможно встретить терминалы или аналитические приложения без стандартного набора инструментов.

Тем не менее, если спекулянт по разным причинам решает поменять торговый терминал, он неизбежно столкнётся с трудностями начиная от различий в интерфейсе программы и заканчивая полным непониманием нового языка программирования. Подобная ситуация возникает и при переходе с MetaTrader (далее MT) на Quik, при этом самым первым вопросом многих трейдеров, привыкших к MT, является запрос «как установить индикаторы для Quik?».

Прежде всего, разберёмся, что конкретно подразумевается под данным вопросом. Если имеется ввиду установка индикатора на график, то здесь нет ничего сложного, в следующем параграфе публикации как раз представлена подробная инструкция по настройке. Если же речь идёт про установку пользовательского алгоритма, который отсутствует в стандартном наборе, то в данном случае всё будет немного сложнее, чем в MT.

Дело в том, что до 2013 года в Quik нельзя было вообще создавать свои индикаторы, поэтому пользователи были вынуждены просить разработчиков добавить в новую версию или обновление необходимые инструменты, при этом, если кому-то нужен был редкий и непопулярный алгоритм, можно было и не дождаться его появления вовсе.

Позже появилась возможность писать свои индикаторы на языке программирования под названием «Lua». Чтобы подобный алгоритм (собственный или загруженный из сети) появился в перечне квика, необходимо создать специальную папку «LuaIndicators» в основной папке терминала, в которую и будут устанавливаться все подобные файлы.

Как добавить индикаторы для Quik на рабочее окно

Чтобы лучше усвоить последовательность действий, рассмотрим пример настройки привычного индикатора CCI, с которым знаком практически каждый пользователь терминала MT. Если же кто-то из читателей вообще не имел опыта торговли даже на демо-счетах, рекомендуем прочитать соответствующую публикацию или справку по данному алгоритму.

Итак, после того, как было открыто окно графика нужного инструмента, необходимо при помощи правой кнопки мыши вызывать контекстное меню и нажать «Добавить график (индикатор)», как это представлено на рисунке выше. Также можно выполнить команду в главном меню «Экспорт данных→Графики→ Добавить график (индикатор). Результат будет идентичен:

Открылось одноимённое окно, в котором представлены индикаторы для Quik, источник данных, а также список окон, куда можно добавить нужный алгоритм. Выбираем слева CCI, а так как он является осциллятором, в перечне окон нажимаем на пункт «новое окно». В данном случае индекс товарного канала отобразится в новом подвальном окне. Если бы нам потребовалась скользящая средняя, то качестве окна необходимо было бы выбрать «окно 1». Как можно заметить, последовательность действий сложнее, чем в MT, но это скорее дело привычки. Далее нажимаем «ок» и автоматически переходим в окно настроек:

В разделе «общие» программа предлагает пользователю задать название окна, вариант представления индикатора (линия, бар, пунктир и т.д.), цветовую гамму и прочие незначительные настройки. В «Параметрах» определяется период (в барах, а не единицах времени) и метод расчёта значений. Во вкладках «Дополнительно» и «Уровни» применительно к CCI можно задать сдвиг графика и сигнальные горизонтальные уровни. Если всё было сделано верно, получим следующий результат:

Что ещё следует учесть, изучая индикаторы для Quik

Перед тем, как принимать решение о переходе на квик, нужно учесть несколько важных моментов, во-первых, индикаторы в данном терминале нельзя строить на базе других алгоритмов, как это можно делать в других программах, в т.ч. и в MT. А это значит, что часть систем, построенных на стандартных индикаторах, придётся переписывать.

Во-вторых, пользователи MT и Quik так и не смогли придти к общему мнению на предмет того, какой язык программирования эффективнее и функциональнее. Весомые аргументы приводятся как с одной, так и с другой стороны, в частности, главное преимущество терминалов MT – это их неразрывная связь с языками программирования mql (4 и 5), которые оптимизированы специально под соответствующие версии программы и являются одними из самых простых для изучения «с нуля».

С другой стороны, язык Lua, при помощи которого создаются индикаторы для Quik, применяется во многих других приложениях. Поэтому если трейдер его освоит, то сможет применить знания и для решения других задач, чего не скажешь, например, о языке mql4, сфера применения которого крайне ограничена.

Также нужно сразу определиться, зачем вообще нужен квик, ведь для торговли на форекс (межбанковском валютном рынке) он не подходит и может быть полезен только для торговли на срочном рынке валютными фьючерсами, в основном же, им пользуются трейдеры на фондовом рынке.

Кстати об акциях, на самом деле, здесь тоже все не так просто, как кажется. Дело в том, что некоторые брокеры, предоставляющие доступ на соответствующий рынок, начинают внедрять терминал MT5, поэтому многие клиенты, которые ранее торговали на форексе, могут не переучиваться и спокойно пользоваться привычной платформой. Даже если ранее в торговле применялся MT4, перейти с него на MT5 не составит труда.

Какие можно сделать выводы

В качестве заключения отметим, что в квике превосходно работает любой индикатор, так как пользователь получает прямой поток котировок, а это значит, что в отличие от МТ4, графики не проходят через дополнительные фильтры, и каждая мелкая сделка будет учтена алгоритмом без исключений.

Кроме этого, в Quik без сбоев работают все индикаторы, предназначенные для анализа объёмов, в то время как в МТ4 трейдер по умолчанию вынужден довольствоваться тиковыми объёмами, и то, сомнительного качества, так как котировки предварительно проходят через вышеупомянутые фильтры дилинговых центров. Все эти нюансы являются сильными сторонами рассмотренной сегодня биржевой платформы в контексте построения индикаторных систем.

Но по традиции, без минусов также не обошлось, в частности, к главным недостаткам как самого квика, так и индикаторов, можно отнести сложность написания последних вследствие особенностей языка Lua. Кроме этого, пока пользователи MT4 накапливали опыт, создавая и тестируя тысячи алгоритмов, разработчики квик длительное время добавляли индикаторы только по просьбе и заказам пользователей.

Поэтому если трейдер принял решение «а уйду я из ДЦ к обычному брокеру и перенесу свою стратегию на новый терминал», придётся изрядно потратиться финансово даже на то, чтобы переписать необходимые индикаторы (работа программистов стоит не дёшево).

Можно, конечно, и самому освоить программирование, но в данном случае придётся ещё некоторое время работать с МТ, пока не получится создать необходимые индикаторы для Quik, так как, прочитав несколько самоучителей по языку Lua, не получится сразу реализовать свои идеи, не допуская при этом ошибок. Источник:

Социальные кнопки для Joomla

Популярное:

  • 14.11.2013 06:32 | Индикатор разворота - определяем конец тренда 52758
  • 02.04.2015 10:04 | Индикатор VSA читает рынок как открытую книгу 49618
  • 23.09.2014 11:08 | Конструктор советников форекс позволит создать любой торговый робот 46460

Тема сегодняшней публикации - скриптовый язык QLUA. QLUA - мощнейший инструмент для написания торговых роботов. И сегодня мы обсудим его плюсы и минусы. Посмотрим как написать простой индикатор и первого робота на нём. В начале своего пути долго выбирал среду разработки, искал эффективное и в тоже время простое решение для написания торговых роботов и советников. Этот путь занял несколько лет, и что я только не перепробовал в то время. Excel, Metastock, TsLab. Но в итоге остановился на QLua, справедливо решив, что это то, что мне нужно.

1) Почему стоит выбрать QLua.

2) Немного истории и о преимуществах QLua в сравнении с предшественником QPile.

3) Написание индикаторов на QLua.

4) Написание робота на QLua под Quik

5) Заключение


1. Почему стоит выбрать QLua.

Постараюсь коротенько описать плюсы и минусы. Начать стоит с того, что в рамках РФ самый распространенный терминал для торговли акциями и фьючерсами является Quik. Если отталкиваться от того, что наш терминал Quik, то выбор будет между: программами для тестирования, языками высокого уровня и встроенными языками в терминал Qlua , QPile.

Если сравнивать с системами, где алгоритм выстраивается путем построения блок-схем, то преимуществом Qlua является отсутствие платы за использование торговой системы как в TsLab и нет необходимости в использовании доп. «прокладок» как Wealth-lab. В системах построения из блоков таких как: TsLab, Wealth-lab и т.д. проблематично выстраивать сложные системы, а для уменьшения количества блоков и получения доп. функций требуется знание высокоуровневых языков типа: C#, Pascal для написания кубиков вручную.

Если рассматривать написание роботов на таких языках как: C#, Delphi , то здесь однозначным минусом является сложность написания кода и его размер для создания простейшего робота. Скриптовые же язык QLua или Qpile позволяют реализовать идею в более короткие сроки.

Сценарный язык (язык сценариев, жарг. скриптовый язык, от англ. scripting language) - высокоуровневый язык сценариев (англ. script) - кратких описаний действий, выполняемых системой. Сценарий - это программа, имеющая дело с готовыми программными компонентами, что очень сильно упрощает написание кода торгового робота. То есть для получения данных по значению закрытия свечи достаточно написать строчку кода типа: ds:C(20) все, и мы получаем значение закрытия двадцатой свечи инструмента. Нет необходимости писать «километры» кода. При этом доступен весь функционал как в полноценном языке программирования.

Из минусов можно отметить, что QLua используется только в рамках терминала Quik и данный язык не доступен для работы с другими терминалами и торговыми системами. Так же учитывая, что Quik является только терминалом и не позволяет производить тестирование торговых алгоритмов. В QLua нет простого решения для тестирования роботов, как это можно сделать в рамках таких платформ как: TsLab и Wealth-Lab.


2. Немного истории и о преимуществах QLua в сравнении с предшественником QPile.

До QLua был QPile, в общем–то он и сейчас есть. Интерпретатор скриптового языка QPile был разработан ARQA Technologies в 2002г. и развивался до 2012г., позже в терминал Quik был добавлен Lua интерпретатор. Так же есть вероятность, что компания ARQA Technologies возможно в ближайшем будущем откажется от дальнейшей поддержки QPile. Qpile как и Qlua является скриптовым языком и обладает рядом возможностей. По праву он является первым языком для написания роботов и советников для терминала Quik. Является простым для изучения и функциональным инструментом, но обладает рядом минусов.

И так, какими плюсами обладает QLua в сравнении с QPile:

У QLua нет задержки на обработку торговой логики робота в 1сек. Это конечно не критично для среднесрочных стратегий, но для написания скальперских роботов может стать критичным.

У QLua есть многопоточность. Реализовано это в виде основного потока торговой логики и функций обратного вызова(«колбэков»).

Есть возможность писать и подключать библиотеки на других языках, сам Lua кстати написан на Си

Появилась возможность писать пользовательские индикаторы и использовать их как стандартные.

Синтаксис языка немного похож на JavaScript и C#, отсюда удобство работы с операторами переменными и т.д.

Скрипты обычно интерпретируются, а не компилируются. QLua обладает JIT-компиляторами так как в его основе лежит язык Lua. Что позволяет прятать исходный код, в то время как у Qpile он всегда открыт. Ссылка как компилятор для скрытия исходного кода Qlua


3. Написание индикаторов на QLua.

(1) Пользовательский индикатор

Как уже упоменалось выше в рамках терминала Quik существует два скриптовых языка это: Qpile и QLua. Qpile являестя более ранним языком, который появился в Quik и на нем нельзя было писать индикаторы. Позже разработчики расширили функционал и добавили QLua, в рамках которого стало возможным писать индикаторы. В данной части статье пойдет речь о создании индикатора под Quik.

Индикатор на QLua представляет из себя файл с расширением *.lua или *.luac и визуально ничем не отличается от робота. Исключением является его месторасположение. Для того чтобы Quik увидел индикатор его надо разместить в папке LuaIndicators. Папка LuaIndicators должна храниться в корне папки Квика, если ее там нет, то ее надо создать. Для того чтобы быстро открыть папку Квика надо нажать на его ярлык на рабочем столе правой кнопкой мыши и выбрать «Расположение файла».

И так перейдем к созданию индикатора. Для этого нам понадобится любой текстовый редактор типа Notepade.

Индикатор на QLua для Quik состоит из трех основных частей.

Первая часть это объявление и заполнение глобального массива Settings , который содержит в себе переменные параметров индикатора, тип линии для отображения, толщину, цвет. В массиве Settings располагаются пользовательские переменные для изменения параметров индикатора из пользовательского интерфейса Квика.

Вторая часть это функция Init , она запускается один раз при инициализации индикатора. Возвращает количество линий индикатора.

Третья часть функция OnCalculate(index) получает на вход номер свечи. Она запускается интерпретатором столько раз сколько свечей на графике и возвращает численное значение индикатора. Если линий несколько в индикаторе, то несколько численных значений. Для удобства понимания кода там будут комментарии. Для комментирования строки в QLua используется «--». Все содержимое после двух дефисов интерпретатором кода на QLua не воспринимается.

--[[ Многострочные комментарии располагаются между символами двух дефисов и квадратных скобок ]]-- Settings= { Name = "Channel", -- название индикатора period=5, -- параметр индикатора line= { { Name = "High", Type =TYPE_LINE, Width = 1, Color = RGB(120,90, 140) }, { Name = "Low", Type =TYPE_LINE, Width = 1, Color = RGB(120,90,140) } } }

Здесь мы описали массив настроек, ввели название индикатора, параметры описали параметры двух линий индикатора Именно эти параметры будут доступны в пользовательском индикаторе для изменения при загрузке индикатора на Qlua в Quik

  • (1)Название индикатора
  • (2)Установка значения для переменной period
  • (3)Установка цвета по умолчанию для линии High
  • (4)Название линии индикатора, которое мы прописали в ячейке «line» нашего листа настроек
  • (5)Тип линии который мы установили для использования по умолчанию Type =TYPE_LINE
  • (6)Толщина линии индикатора Width = 1
function Init() return 2 end -- выводить на график будем две линии --[[ В функции OnCalculate мы рассчитаем индикатор Price Channel – это две линии построенные по экстремумам значений свечей за определенное количество баров. То есть первое значение, которое будем рассчитывать это максимальное значение за period в нашем случае он равен пяти, а второе значение, которое будет возвращать функция это минимальное значение за period. Итак приступим к расчету. ]]-- function OnCalculate(index) local high=0 local low=0 Period = math.floor(Settings.period) if index<=Period then high=H(index) low=L(index) for i=index , 1 , -1 do if H(i)>high then high=H(i) end if low>L(i) then low=L(i) end end else high=H(index) low=L(index) for i=index , (index+1)-Period , -1 do if H(i)>high then high=H(i) end if low>L(i) then low=L(i) end end end return high , low end

Создаем в редакторе файл с расширением lua записываем в него код и сохраняем его в папке LuaIndicators , после этого у нас появится новый индикатор и его можно будет добавить к себе на график как стандартный индикатор Quik (1)


4. Написание робота на QLua под Quik

Написание торгового робота на QLua ведется в обычном текстовом редакторе, так же как и для написания индикатора. Отличие будет в структуре кода и в том, что располагать робот можно в любом удобном для вас месте на компьютере. В роботе является обязательной только одна функция main.

И так приступим. Напишем робота с простым алгоритмом. Рассчитаем внутри робота скользящую среднюю и будем принимать решение о покупке/продаже одного лота по инструменту исходя из количества в клиентском портфеле при закрытии прошлого бара ниже/выше среднего значения посчитанного по закрытию минутных баров инструмента. То есть при пересечении close бара средней снизу вверх проверим количество контрактов в портфеле по инструменту, и если оно меньше одного, то докупим разницу до одного контракта в лонг. Обратная ситуация при пересечении close закрытого бара среднего значения сверху вниз. Отправим транзакцию для получения одного лота в шорт по клиентскому портфелю.

Переменная для прырывания цикла при срабатывании функции обратного вызова OnStop is_run = true -- присванивание переменным начальных базовых значений торгового алгоритма Account = "NL0011100043" -- торговый счет Class_Code = "QJSIM" -- класс торгуемого инструмента Sec_Code = "SBER" -- код торгуемого инструмента TF = INTERVAL_M1 -- торговый таймфрейм g_lots = 1 -- количество торгуемых лот function main() -- подписываемся на получение данных свечей по инструменту в массив ds ds = CreateDataSource(Class_Code, Sec_Code, TF) while is_run do sleep(1000) -- обрабатываем цикл с задержкой 1сек. ds:SetEmptyCallback() -- обновляем данные по инструменту в массиве ds local serv_time=tonumber(timeformat(getInfoParam("SERVERTIME"))) -- помещене в переменную времени сервера в формате HHMMSS if isConnected()==1 and serv_time>=10000 and serv_time<235000 then -- проверка наличия соеденения с сервером и поподания в торговое окно -- место для размещения торговой логики -- расчет значения скользящей средней local SMA = 0 local period = 20 local count_candle = ds:size() if count_candle>20 then local sum = 0 for i=0 , period-1 do sum = sum + ds:C(count_candle-i) end SMA = sum / period local lots = get_lots() -- получение количества лот в клиентском портфеле по инструменту if ds:C(count_candle)>SMA and lots(g_lots*(-1)) then -- получение минимального шага цены для организации величины проскальзываня в ордере local step=tonumber(getParamEx(Class_Code, Sec_Code, "SEC_PRICE_STEP").param_value) local price_order = ds:C(count_candle)-(step*20) -- цена для ордера будет = цена закрытия - 20-ть минимальных шагов инст. send_order("S", math.abs(g_lots+lots) , price_order) end end end end end -- функция возвращает количество лот в клиентском портфеле по заданному инструменту function get_lots() local lots = 0 local n = getNumberOf("futures_client_holding") local futures_client_holding={} for i=0,n-1 do futures_client_holding = getItem("futures_client_holding", i) if tostring(futures_client_holding["sec_code"])==Sec_Code then lots=tonumber(futures_client_holding["totalnet"]) end end return lots end ---------------------- -- отправка транзакции function send_order(operation, quantity, price) -- получение минимального шага цены для округления цены отправляемого ордера local step=tonumber(getParamEx(Class_Code, Sec_Code, "SEC_PRICE_STEP").param_value) local trans_params = { CLIENT_CODE = Account, CLASSCODE = Class_Code, SECCODE = Sec_Code, ACCOUNT = Account, TYPE = "L", TRANS_ID = tostring(1), OPERATION = tostring(operation), QUANTITY = tostring(math.abs(quantity)), PRICE = tostring(math.floor(tonumber(price)/step)*step), -- округление цены при отправлении транзакции ACTION = "NEW_ORDER" } local res = sendTransaction(trans_params) if string.len(res) ~= 0 then message("Error: "..res,3) return 0 else return trans_id end end function OnStop(stop_flag) is_run=false stop_flag=1 ds:Close() end function timeformat(time_unf) local in1, in2=0,0 local time_form=0 in1=string.find(time_unf,":" , 0) if in1~=nil and in1~=0 then in2=string.find(time_unf,":" , in1+1) time_form=string.sub(time_unf, 0 ,in1-1)..string.sub(time_unf, in1+1 ,in2-1)..string.sub(time_unf, in2+1 ,string.len(time_unf)) end return time_form end

После редактирования кода сохраняем его в удобном для вас месте с расширением lua. Для запуска робота надо зайти в Сервисы ->Lua скрипты




  • (1)Добавляем скрипт из сохраненнго места
  • (2)Проверяем его появление в таблице запущенных скриптов, после запуска появится зеленая стрелка индицирующая работу скрипта
  • (3)Запускаем его в работу
  • (4)Проверяем в поле отсутствие ошибок при работе


5. Заключение

Подводя итоги хочется сказать, что если используется для торговли терминал Quik, то одним из самых простых способов написания автоматизированных торговых систем является скриптовый язык QLua. И надеюсь, сегодня Вы в этом сами убедились.

В рамках торгового робота написанного как пример выше, мы получили готовую механическую торговую систему в сто строк кода. Что является очень хорошим результатом.

Для написания индикаторов в Квик, Qlua является единственно возможным вариантом.

В общем - торгуйте алгоритмами. Используйте хорошие технологии!

Как правило, те, кто приступает к биржевым торгам, начинают изучать наиболее простой и одновременно эффективный технический анализ. Причем, ознакомившись с - трендовыми линиями, фигурами и прочим - новички начинают изучение чуть более сложного, отчасти математизированного раздела ТА - . Так называют математические функции от цены и объема, способные показать наиболее вероятное дальнейшее развитие ценового движения.

Индикаторов существует достаточно много - в торговом терминале QUIK 7 их представлено 39 штук. Также там присутствует - Volume, который является не индикатором, а параметром, дополнительно характеризующим ценовую свечку. Все эти индикаторы, в свою очередь, разделяются на трендовые, осцилляторы, конверты и прочее. И часто новички задаются вопросом, какие из индикаторов применять в своей торговле, поскольку все они имеет как плюсы, так и минусы. Ответ на этот вопрос и несколько полезных рекомендаций по использованию индикаторов в «Квик 7» - в нашей статье.

Для начала стоит дать несколько базовых рекомендаций. В первую очередь начинающим трейдерам стоит помнить о том, что ТА в целом и индикаторы в частности гораздо лучше работают на таймфреймах от часа. Не стоит сразу пытаться вести торговлю внутри дня - это удел мастеров трейдинга, а новичкам лучше вести торги на более крупных временных отрезках.

Во-вторых, стоит начинать с ликвидных акций, так как бумаги второго и прочих эшелонов могут иметь слишком рваные графики - а значит, есть вероятность возникновения проблем дефицита ликвидности при закрытии позиции.

В-третьих, следует рассматривать не только ценовые движения, но и объемы, которые присутствуют в этих движениях. Поскольку именно дисбаланс спроса и предложения двигает цену, умение верно интерпретировать объемы торгов крайне важно для трейдера.

В-четвертых, не стоит разделять технически й и (новостной фон, календарь макростатистики и прочее). Данные виды анализа не противоречат один другому, а дополняют друг друга.

Индикаторы для начинающих

Первым индикатором, с которого обычно и начинают знакомство с миром технических индикаторов, является Скользящее среднее (ЕМА). Его можно увидеть как у новичков, так и у профессионалов - в том, что этот несколько старый и простой индикатор в целом способен приносить прибыль, не сомневается никто. Это подтверждается прогонами на различных тестерах. Стоит отметить, что новичкам лучше использовать этот индикатор с более длительным периодом (от 100), чтобы научиться видеть, как меняются действительно важные , и не дергаться по мелочам.

Так как скользящее среднее является трендовым индикатором, его показания лучше совмещать с осцилляторами. Для средне- и долгосрочной торговли крайне хорошо зарекомендовал себя RSI. Стоит помнить, что одним из самых мощных сигналов по этому индикатору является дивергенция, появление которой в большей степени и стоит отслеживать в паре с сигналами ЕМА, например, изменениями направления наклона и пересечения с ценой.

Крайне важным «фильтром» для сигналов указанных индикаторов будет являться объём торгов (его можно добавить на ценовой график, выбрав из списка индикаторов для QUIK 7 Volume). Объём торгов должен подтверждать тренд. Стоит помнить, что тренд зачастую начинается с прорыва консолидации на повышенных объёмах, что говорит о вливании денег профессионалов в начинающуюся тенденцию, а продолжается на невысоких, что говорит об отсутствии желание у оппонентов тренда работать против тенденции. Завершается тренд опять же на повышенных объёмах. Это говорит о том, что цена уперлась в уровень, с которым ей так просто не справиться.

Помимо индикаторов, рекомендуем не забывать о методах классического ТА. Мы считаем построение трендовых линий обязательным - вне зависимости от того, применяете ли вы индикаторы или нет. Линии трендов позволяют понимать те зоны, в которых возможна максимальная активность участников торгов, так как концентрация заявок у трендовых линий обычно возрастает, что выливается в повышенный объём торгов на их границах, не забываем, что объёмы и двигают рынок.

Конечно, можно было бы заменить трендовые линии индикатором типа (например, Bollinger Bands), но трендовые линии применяют гораздо больше , которые и образуют повышенную концентрацию заявок, поэтому наша рекомендация - использовать трендовые линии. Причём некоторую помощь начинающим трейдерам для определения момента пробития консолидации (или боковика, что в принципе близко по значению) может оказать такой индикатор, как , который крайне часто применяют алготрейдеры для формализации пробития флета. Фракталы как раз и определяют текущие ценовые максимумы и минимумы за определённый временной интервал. Причём показания индикатора Fractals лучше использовать именно в качестве логической компоненты, чем как , то есть просто для понимания того, когда именно происходит пробитие. Этот индикатор поможет начинающим трейдерам выработать верное понимание указанного момента.

Помимо входов в позицию, крайне важно понимать, когда лучше фиксировать прибыль. Здесь на помощь приходит индикатор Parabolic SAR, который чаще всего и применяют именно для этой роли. При пересечении ценой данного индикатора следует фиксировать прибыль, хотя бы частично. Использование же данного индикатора для входа в позицию менее целесообразно.

Но самое главное, что показатели указанных индикаторов и прочих методов анализа (причём не только технического, но и фундаментального) необходимо именно сочетать, а не вырывать из контекста. Нужно понимать, индикаторы могут показать, что в определённые моменты вполне вероятны соответствующие события на ценовом графике, но не более того. Трейдер же, в свою очередь, должен принимать торговые решения и контролировать их риски, собирая воедино показания и ТА и ФА.

Вывод

Индикаторы стоит использовать в биржевой торговле как начинающим, так и опытным трейдерам, но их сигналы не стоит поним ать в качестве сигналов к безусловному совершению сделок. Оптимальный вариант - сочетать сигналы индикаторов в QUIK 7 с общей рыночной ситуацией и правилами риск- и мани-менеджмента.

Добрый день, уважаемые читатели и гости блога Вебмастермаксим.ру. Сегодня мы поговорим о том, как добавить индикатор в Quik на график. Дело в том, что не так давно, мы обсуждали с вами индикатор Zigzag, тогда я использовал его под графиком. Но в Quik существует возможность установить индикатор в Quik прямо на график, что значительно облегчает работу с этим индикатором.

Я уже отмечал, что Zigzag – это вспомогательный индикатор, который поможет вам научиться определять ключевые вершины и впадины. Ниже я приведу ссылки на статьи в которых рассказано об этом подробно.

Обратите внимание на Quik

Сегодня я хочу обратить ваше внимание, на то, что в терминале для фондового рынка и прочих — Quik существует возможность размещать индикатор прямо на график актива. Это значительно облегчает работу с ним. Делает его более наглядным. И совмещать вершины графика и индикатора уже не требует больших усилий.

Другие статьи о Зигзаге:

Делается это очень просто! С помощью галочки, которая добавляется при установке инструмента в режим Вкл в Quik. После этого нужно только применить установки и этого будет достаточно для начала работы. Индикатор не только не теряет своих свойств, но работа с ним может стать боле удобной. Я полагаю, что вам будут попадаться такие индикаторы, которые лучше будут смотреться на графике, чем под ним.

Смотреть видео про правила Quik-а


Хороший пример такого применения является индикатор Parabolic SAR в Quik. Да, мы привыкли видеть его на графике, но в Quik он беспрерывный. Я имею в виду, что на нем совершенно нет разрывов. От этого добавленный на графике он смотрится несколько грязно. Тогда как под графиком при небольшой сноровке он выглядит очень убедительно! Я полагаю, что тренировка по его применению в таком виде в Quik займет немного времени. Коротко, когда происходит перескок вниз и затем пологий подъем, то это сигнал на покупку, а перескок вверх и пологий спуск — это сигнал на продажу. Однако, помните, что один этот добавленный или установленный индикатор не даст хорошего результата в долгосрочном периоде.

Не забывайте, что индикаторы – это лишь вспомогательная система, которая поможет вам, узнать о свойствах графика немного больше. Но использовать их для прогнозирования достаточно сложно.

Итого

Экспериментируйте! Я уверен, поиск делает из нас более подготовленных специалистов, которые способны сделать больше или даже совершить открытие.

Таким образом, сегодня я рассказал вам о том, как правильно добавить индикатор в Quik на график, так чтобы после установки с ним было удобно работать. Речь шла об индикаторе Zigzag. Я думаю, что найдется немало других инструментов, которые с большим удобством можно разместить по-иному.