Избранное трейдера meland
Сегодня дополним наш алгоритм советника следующими пунктами:
1. Пропуск «поздних» сигналов на старте.
2. Обработка советником обрыва связи.
3. Сохранение сигналов и логов в файл.
Еще один пункт, связанный со временем, который был выбран для апгрейда советника – это пропуск сигналов на старте, если запуск скрипта состоялся не в начале торговой сессии (например любой старт после 10:30). Это может быть полезным, если выбрана активная внутридневная стратегия и сигналы полученные на старте скрипта, например в середине дня, могут быть уже не актуальными (с низким потенциалом прибыли) и лучше дождаться новых. Т.е. необходимо разделить сигналы на те, которые сгенерировались на старте и остальные сигналы, которые будем далее брать в работу. Сигнал на старте может закрыться (по обратному/сигналу выхода) и если переоткроется снова, то его уже можно брать в работу как новый.
В нашем скрипте сигналы по каждому инструменту (массив signal) ранее могли принимать значение:
0 – вне позиции по инструменту
Продолжаем изучение qlua, cегодня:
Интегрируем таблицы в структуру скрипта qlua.
Удаляем таблицы через DestroyTable.
Останавливаем скрипт через IsWindowClosed.
Обработка события закрытия таблицы через коллбэк.
Работа с цветом SetColor, Highlight, SetSelectedRow.
Пишем простого советника.
В прошлый раз мы рассмотрели как с помощью qlua создать таблицу в торговом терминале и заполнить её информацией из таблицы текущих торгов. Но это была статичная табличка, чтобы её «оживить» нужно разместить операции с нашей таблицей внутри структуры скрипта в функции main.
Саму таблицу мы можем создать до цикла while и внести неизменяемые данные (в нашем случае тикер и наименование бумаги), а уже заполнить цифрами и обновлять внутри цикла. Пока будет работать скрипт таблица будет обновляться.
function OnInit()
tikers = {"GAZP", "SBER", "VKCO"}
progname = "mytable :"
timeout = 5000
end
function OnStop()
do_it = false
message(progname.." Финиш.")
end
function main()
message(progname.Сегодня рассмотрим:
1. Получение биржевых данных через функцию getParamEx
2. Выгрузка списка параметров функции getParamEx через DDE из торгового терминала
3. Создание пользовательских таблиц в торговом терминале
Одна из особенностей работы через квик это то, что можно получать достаточно большой объем биржевой информации по интересуемым инструментам. Большинство других платформ для алгоритмической торговли и терминалов в РФ будут выдавать только цену открытия, максимум/минимум дня, последнюю цену, цену закрытия, объемы по инструментам и максимум еще 3-5 каких-то дополнительных пунктов. В распоряжении тех, кто использует qlua огромная матрица параметров таблицы текущих торгов.
Получить их можно через функцию getParamEx:
getParamEx(код класса актива, инструмент, параметр), где:
код класса: например в случае акций это «TQBR», а в случае срочного рынка «SPBFUT».
инструмент: тикер.
параметр – один из параметров для соответствующей группы инструментом (об этом подробнее ниже).
Функция возвращает таблицу со следующими полями:
Сегодня начинаем уже писать полноценные скрипты для терминала, а не отдельные блоки кода на lua.
Пройдем:
Структура скрипта
В торговом терминале можно запускать небольшие примеры на lua, как мы это делали ранее, но если говорить о постоянно работающем алгоритме, а не о компактной программе, которая должна выполнить только несколько коротких действий, то минимальная структура скрипта для квика будет содержать следующие функции:

function OnInit – инициализирует глобальные переменные и константы (например, торгуемые бумаги, размеры тейка и стопа, торговый счет и пр.), имена таблиц, необходимых файлов.
function OnStop – функция остановки скрипта, активируется при нажатии клавиши «Остановить» в панели скриптов терминала.
function main – основная функция, создает отдельный поток для выполнения скрипта. Обычно внутри main создается цикл для непрерывной работы, т.к. без него функция выполнит один раз весь код, который в ней прописан и скрипт остановится.
Весь материал, который здесь и далее будет рассматриваться по qlua, работает на 10й версии квика. Вполне допускаю, что со временем какие-то функции разработчики перепишут и в новых версиях что-то нужно будет сверять c мануалами, уточнять хелпом и на форумах, но предполагаю, что а) эти изменения будут вводиться очень не быстро и б) синтаксис и основа при этом останутся без существенных изменений.
Сегодня рассмотрим:
message
Выводит сообщение в торговом терминале в формате окна (в прошлой статье говорил, что удобнее отключить, чтобы не отвлекаться постоянно) и в таблице системных сообщений.
Особенности message: функция после вывода делает перенос строки, поэтому если необходимо вывести несколько значений в одной строке нужно делать их слияние (об этом ниже).
Для корректного отображения русских букв необходимо выбирать котировку файла Windows-1251 (об этом также в прошлый раз мы уже говорили). Иногда по этой причине некоторые разработчики пишут только на английском весь вывод текста в терминал, чтобы не заморачиваться с кодировкой, в т.ч. при размещении на github и совместной работе с кодом.
Теория на практике: прогноз ВВП за две минуты. Используем «денежный светофор» и «таблицу умножения ВВП».
Вы потратите всего две минуты. Алгоритм простой, из двух шагов.
1. Взять среднегодовой темп роста реальной денежной массы (РДМ) из графика «денежный светофор».
2. Посмотреть в «таблице умножения ВВП», какой рост ВВП соответствует такому росту РДМ.
Всё! Вы обладатель прогноза ВВП, которые не уступает, а чаще превосходит по своей точности прогнозы Центробанка или правительства.
Выполним эти два шага на конкретных данных на 1 июня 2023 года.
График «денежный светофор» ежемесячно публикуется в этом блоге. Например, в этой публикации от 6 июня 2023 года: https://dzen.ru/a/ZH9gYE64fhKw0MM7?share_to=link
Нас интересует подпись в конце синей линии: +11,7%.
Первый шаг алгоритма выполнен.
Таблица умножения ВВП приведена в закреплённом сообщении блога в Дзен. Вот в этой публикации, которая так и называется «Таблица умножения ВВП».
Нашёл случайно интересную стратегию.
В прошлой статье Пример расчёта индекса Московской биржи я показал, как создать свой мини-индекс из 5-ти инструментов с наибольшим весом в индексе (Сбербанк*0.268+ГАЗПРОМ*0.2647+ЛУКОЙЛ*0.2629+ГМКНорНик*0.1127+Новатэк*0.0917).
Решил сравнить этот мини-индекс с IMOEX и очень удивился. Оказывается корреляция удерживается всю доступную историю в моём терминале с 2011-го года.
Ниже общий график в % с нулевой точкой на начало 2023 года. Видим мини-индекс (синий) то отстаёт, то опережает общий индекс (красный). До 2018 года мини-индекс отставал, но и нулевая точка тогда была бы другой.
Ниже 2020 год. В начале года мини-индекс опережал на 15%, а в октябре отставал на 14%. Если бы мы переложились из общего индекса (например SBMX ETF) в мини-индекс, то к концу года заработали бы дополнительно до +29%. Неплохая прибавка к +18% роста за год и 6% дивидендов.

10 мая президент РФ подписал Указ о призыве на военные сборы в 2023 году. Обстановка нынче такая, что любое сочетание слов «призыв» и «военные» в одном предложении вызывает, скажем так, неоднозначные эмоции – поэтому мы решили подготовить отдельный FAQ по теме сборов.
Как обычно, квалифицированно подготовить материал мне помогал Кирилл Коршунов – руководитель практики «Мобилизационный консалтинг» в Адвокатском бюро КИАП. В апреле мы уже готовили с Кириллом две больших статьи по теме – если вы их в свое время пропустили, то рекомендую тоже ознакомиться:
Перед прочтением этой статьи — ВАЖНО следующее: основная цель данной статьи заключается в том, чтобы показать как просто можно создать торгового робота, который может торговать российскими акциями или зарубежными акциями. Важно понимать, что создавая бота, вы лично несете ответственность за принимаемые им решения, инвестиционные операции и связанные с ними риски. Я не несу ответственности за решения, которые вы можете принять после прочтения этого материала. И я не даю никаких инвестиционных рекомендаций или советов. Не забывайте, что боты способны принести большие убытки, поэтому используйте их с осторожностью.
Программирование для меня это хобби и любимое дело. А так я сертифицированный системный архитектор. Поэтому прошу не особо ругать за код:‑)
Выбор брокера и библиотекКак вы знаете, брокеров много))) но нам нужны те, у которых есть API — программный интерфейс через который наш торговый робот сможет отправлять заявки на покупку и продажу акций.