Блог им. morefinances
Сегодня рассмотрим:
Что такое таблица обезличенных сделок.
Настройка таблицы в терминале.
Что делать, если таблица открылась, но она пустая.
Вывод данных с таблицы по DDE.
Работа с таблицей обезличенных сделок через скрипт qlua с примерами.
Пишем советника, показывающего на графике крупных игроков.
Лента всех сделок (она же таблица обезличенных сделок, она же таблица всех сделок) — это тиковый массив сделок с одним или несколькими инструментами, в котором отражается информация по каждой сделке, в т.ч.: цена, объём и направление транзакции (покупка/продажа). Обычно для работы выбирается один инструмент, который отслеживается, реже 2 (например базовый актив и ближайший фьючерс на него). Встречал варианты, когда грузят сразу большой список, но в этом случае может сильно подвисать терминал.
Зачем нужна лента сделок: многие, пытаясь торговать внутри дня, проводят часы за медитативным наблюдением за биржевым стаканом. Однако стакан заявок это только намерение, далеко не все выставленные заявки перейдут в сделки. Более того иногда по некоторым акциям (2го и 3го эшелона) заявки в стакане могут активно «двигаться», создавая видимость, что в бумаге идет активная торговля, при этом, если открыть таблицу всех сделок, то будет видно, что реальных сделок практически нет.
Особенность ленты в том, что мы видим, в каком направлении сейчас в моменте исполняются рыночные заявки (либо те лимитные, что бьют по офферам/бидам стакана). А именно такие заявки будут формировать направление движения графика. Т.е. если мы просто выставим лимитную заявку в стакане и никто о неё не «ударит», то и цена никуда не уйдет. При этом не нужно думать, что если мы видим, что проходит покупка в ленте, то однозначно график должен расти, это далеко не обязательно: цена может и снижаться, и оставаться на том же уровне. Аналогично и при продажах не обязательно, что направление графика будет совпадать, т.к. динамика цены это соотношение (в моменте) объемов покупок и продаж. Но из данной таблицы мы можем получать данные, которые для кого-то послужат хорошим сигналом для сделок, для кого-то будут дополнительным фильтром (например торговля в лонг только если прошедшие покупки превышают прошедшие продажи), кто-то будет из этой ленты формировать собственные минутные свечки, кто-то будет делать производные данные для анализа, например: считать профиль рынка за день, либо отрисовывать класстерные уровни покупок и продаж.
Поэтому нельзя сказать, что работа с лентой всех сделок это «однозначный грааль», но она, в любом случае, дает больше информации, чем нам может показать стакан (в котором часть заявок может быстро переставляться, а часть скрыта в виде айсберг-заявок).
Настройка таблицы в терминале:
Лента добавляется через Создать окно / Таблица обезличенных сделок.
Если вы не находите этого пункта в меню, то следует его добавить: Создать окно / Настроить меню, в Стандартных найти Таблица обезличенных сделок, перевести кнопкой Добавить в правую часть:
Теперь можно создать таблицу (Создать окно / Таблица обезличенных сделок).
Выбираем класс, например, Акции, а через фильтр инструментов нужную бумагу, например Сбербанк:
Дважды нажимаем «Да» и получаем саму таблицу:
Если таблица открывается не с утра, то терминалу потребуется некоторое время для загрузки всех данных (обычно несколько секунд), далее все сделки отражаются максимально оперативно онлайн.
Можно отредактировать таблицу, чтобы отображались только те данные, которые нам будут нужны (CTRL + E при активной таблице, либо клик правой клавишей мышки и далее «Редактировать таблицу»):
При желании можно выделить цветом направление сделки, для этого нажимаем на столбец Операция, выбираем форматирование и получаем нужную заливку:
Аналогичным образом можно закрасить покупки.
Лично я привык работать с этой таблицей без цвета, чтобы не «рябило» в глазах.
Если таблица открылась, но она пустая:
1) Проваливаемся в настройки (F9 или меню Система / Настройки / Основные настройки), там заходим в Программа / Получение данных, выбираем «Обезличенные сделки»:
Выбираем нужный класс инструментов, Сохранить. Ниже в боковом меню проваливаемся в Сохранение данных, проверяем, что стоит Получать пропущенные данные:
После этого возвращаемся обратно в Получение данных/Обезличенные сделки и нажимаем «Перезаказать данные», Сохранить.
2) У некоторых брокеров требуется заказать данную таблицу (услуга бесплатная, просто на всех клиентов они могут не транслировать данные в терминал, а давать доступ точечно по заявке). Напишите в поддержку, обычно в течение дня всё настраивается.
Особенность таблицы: данные транслируются только текущего дня. Если вы хотите накапливать историю (например для тестирования стратегий), то данные с ленты сделок нужно сохранять под закрытие сессии, либо выгружать с сайта Finam, который пока еще дает возможность качать тиковые данные.
Вывод данных с таблицы по DDE.
Самый простой вариант работы с таблицей для дальнейшего анализа – это вывод через DDE в Excel. Хоть мы далее будем работать с ней через скрипт, но тоже бывает полезным (например, для быстрых проверок расчетов или каких-то гипотез):
Выбираем Редактировать таблицу и далее «Вывод через DDE»:
Выбираем запускать приложение DDE сервера автоматически (при необходимости указываем в какой конкретно файл делать вывод):
И нажимаем «Начать вывод». Получаем дублирование данных в Excel:
Кто-то на начальных этапах работает с лентой в таком виде.
Не забываем после работы с Excel отключить вывод по DDE в терминале (В меню Вывод через DDE нажимаем Остановить вывод, убираем Запуск приложение DDE автоматически):
Работа с таблицей обезличенных сделок через скрипт qlua.
Чтобы работать с лентой сделок через скрипт нужно, чтобы сама таблица с соответствующим инструментом была открыта в терминале. В т.ч. для этих целей я подробно указал весь квест как её открывать и настраивать в квике.
Получать данные по ленте сделок мы можем через функцию обратного вызова AllOnTrade. Подробное описание параметров возвращаемой таблицы можно найти в справочном файле QLUA.chm (находится в директории с терминалом):
Рассмотрим пример: будем выводить в сообщениях только те сделки по которым количество лот было >=100.
Для удобства можно настроить таблицу всех сделок на соответствующее отражение: нажимаем на столбец Кол-в, выбираем Фильтр по «Кол-во»
Далее ставим условие «больше либо равно» 100 и сохраняем:
Теперь мы отфильтровываем все мелкие сделки, смотрим только средние и крупные:
В скрипте нам необходимо в функции обратного вызова OnAllTrade отфильтровать по тикеру бумагу (в таблице всех сделок, как я говорил в начале, их может быть несколько) и определить те параметры, с которыми мы планируем работать. Например: цену, количество и оборот:
function OnAllTrade(alltrade) if alltrade.sec_code=="SBER" then lastprice = alltrade.price -- цена lastvolume = alltrade.qty -- количество lastvalue = alltrade.value -- оборот end end
Направление сделки мы можем получать через флаги alltrade.flags:
Есть 2 варианта, как можно с ними работать, либо напрямую:
при продаже это if alltrade.flags == 1 then …,
при покупке if alltrade.flags == 2 then…,
либо через биты:
if bit.test(alltrade.flags, 0) then … при продаже и if bit.test(alltrade.flags, 1) then … при покупке.
Выберем вариант работы c флагами через биты, получаем:
Сравниваем с таблицей всех сделок, видим, что результаты идентичны:
Файл скрипта: https://github.com/morefinances/qlua/blob/main/OnAllTrade_one.lua
При необходимости эти данные мы можем сохранять в файл, делать производные расчеты, обрабатывать поток сделок для выявления сигналов или использовать в качестве фильтров. Но лишь напомню, что лучше минимизировать код в функциях обратного вызова, обрабатывая основную логику в main и в цикле while. Иначе рискуем подвесить терминал.
Немного изменим скрипт.
Будем оценивать сентимент продаж и покупок (настроение рынка) через простой арифметически расчет:
На старте sentiment = 0
При покупке будем к sentiment суммировать количество, при продажах минусовать.
Расчет будем проводить с момента старта скрипта.
Что соответствует в моменте прошедшим сделкам:
Файл скрипта: https://github.com/morefinances/qlua/blob/main/OnAllTrade_two.lua
Пишем советника, показывающего на графике крупных игроков.
Крупных игроков будем искать с помощью ленты сделок, а вывод делать через метки на графике.
На графике Сбербанка устанавливаем идентификатор SBER_ID, добавим функцию вывода метки:
function pointdraw(price, direction, size, texthint) label_params = { ALIGNMENT = "LEFT", YVALUE = price, DATE = tostring(os.date("%Y%m%d")), TIME = tostring(os.date('%H%M%S')), TRANSPARENT_BACKGROUND = 1, HINT = texthint } if size == 3 then label_params.IMAGE_PATH = getScriptPath() .. "\\3point.bmp" elseif size == 2 then label_params.IMAGE_PATH = getScriptPath() .. "\\2point.bmp" else label_params.IMAGE_PATH = getScriptPath() .. "\\point.bmp" end if direction == 1 then label_params.TRANSPARENCY = 15 else label_params.TRANSPARENCY = 85 end label_id_text = AddLabel(tiker_id, label_params) end
Рисунки меток можно взять на github: https://github.com/morefinances/jpgbmpfiles, либо можно нарисовать/добавить свои.
В функцию обратного вызова прописываем условия:
main будет всё также компактным:
function main() message(progname.." старт работы.") while do_it do sleep(1000) end end
Запускаем скрипт (файл: https://github.com/morefinances/qlua/blob/main/simple_advisor_v_3_0.lua), получаем вот такую «гирлядну» с метками: зеленые — покупки, красные продажи. Размер зависит от количества лотов в сделке (большие при >= 3000, средние при >= 2000, маленькие при >=1000 лот).
Здесь пропущены первые минуты торгов. Если запускать на открытии сессии будет большая «лепнина», там много заявок с объемам, как правило, в обе стороны. Черная точка – это наложение малой зеленой метки на фоне большой красной.
Ну и, по традиции, как при описании предыдущих советников сделаю акцент, что это не стратегия к действию, а простой пример работы с конкретным инструментом, в данном случае – с лентой всех сделок.
Нельзя сказать, что мы, прям, отловили «крупных игроков», но, по крайней мере, смогли по определенным условиям вывести средние (и выше) по размеру сделки на график.
В следующей статье рассмотрим, как можно немного поменять логику данного советника, чтобы в т.ч. отлавливать позиции крупных игроков, которые стараются не светиться большими сделками (например работают через айсберг-заявки). В качестве самостоятельного упражнения подумайте как это можно реализовать.
Теги: qlua для начинающих, кружок авиамоделизма.
Ранее:
Qlua: введение
Доля клиентов, использующих алгоритмическую торговлю
«Кружок авиамоделизма»
Разные торговые терминалы, почему Quik
Основной функционал qlua
https://smart-lab.ru/blog/917696.php
Настраиваем торговый терминал и редактор кода
Установка торгового терминала
Подготовка терминала
Вкладки в терминале
Сохранение и загрузка настроек
Таблица системных сообщений
Отключение окна сообщений
Редактор Notepad++
Настройка русского языка в редакторе
Выбор синтаксиса языка и кодировки
Цветовые настройки
Дублирующий просмотр
Запуск первого скрипта
https://smart-lab.ru/blog/918869.php
Основы qlua, часть 1:
message, конкатенация
фильтрация по сообщениям в терминале
PrintDbgStr, комментарии
типы данных, type
операции с числами
операции со строками
операции с таблицами
условные операторы
https://smart-lab.ru/blog/920031.php
Основы qlua, часть 2:
Циклы for … do … end, while do … end, repeat … until.
sleep, break, goto.
как пройти весь массив циклом, как пройти таблицу по ключам
локальные и глобальные переменные, функции
получение даты и времени
получение данных через getInfoParam
https://smart-lab.ru/blog/921366.php
Qlua: структура скрипта.
Структура типового скрипта qlua с примерами.
Обработка скриптом «обрыва связи» с сервером и возобновления работы.
Работа с файлами: запись, перезапись и чтение файла.
getScriptPath, getWorkingFolder
https://smart-lab.ru/blog/922044.php
Qlua: получение данных из таблицы текущих торгов, создание таблиц в торговом терминале.
Получение биржевых данных через функцию getParamEx
Выгрузка списка параметров функции getParamEx через DDE из торгового терминала
Создание пользовательских таблиц в торговом терминале
https://smart-lab.ru/blog/923365.php
Qlua: работа с таблицами (продолжение). Пишем своего советника (начало).
Интегрируем таблицы в структуру скрипта qlua.
Удаляем таблицы через DestroyTable.
Останавливаем скрипт через IsWindowClosed.
Обработка события закрытия таблицы через коллбэк.
Работа с цветом SetColor, Highlight, SetSelectedRow.
Пишем простого советника.
https://smart-lab.ru/blog/924710.php
Qlua: дополняем скрипт советника таймингом:
Устанавливаем время старта работы скрипта,
Ставим тайминг на получение сигналов на вход,
Устанавливаем таймер на приостановку скрипта.
https://smart-lab.ru/blog/925421.php
Qlua советник: дополняем сигналами на закрытие позиции, таблицей для вывода данных и расчетом финансового результата по позициям.
Дополняем сигналами на закрытие позиции.
Создаем дополнительную таблицу для вывода данных.
Делаем расчет финансового результата.
https://smart-lab.ru/blog/926972.php
Qlua: завершаем апгрейд советника:
Пропуск «поздних» сигналов на старте.
Обработка советником обрыва связи.
Сохранение сигналов и логов в файл.
https://smart-lab.ru/blog/927748.php
Qlua: пишем скринер акций Московской биржи
https://smart-lab.ru/blog/928152.php
Qlua: получение данных биржевых свечей с сервера брокера, обработка данных, пишем скрипт выгрузки котировок
Функция CreateDataSource
Получение количества свечек данных
Пауза для подгрузки данных
Получение по инструменту OPEN, HIGH, LOW, CLOSE, VOLUME
Обработка времени и даты
Закрытие источника данных
Примеры: получение данных последних 10 свечей, выгрузка новой минутной свечки после её закрытия, текущее значение простой средней SMA10 по минуткам
Простой скрипт выгрузки котировок
https://smart-lab.ru/blog/929905.php
Qlua: получение данных с графиков терминала.
Идентификатор инструмента
Получаем количество свечей через getNumCandles
Получаем свечные данных через getCandlesByIndex
Читаем данные с индикатора SMA
Данные с верхней и нижней линии Price Channel
Графики с таблицы текущих торгов.
Сравнение получение данных через CreateDataSource и через getCandlesByIndex
https://smart-lab.ru/blog/931408.php
Qlua: работа с метками, пишем торгового советника на индикаторах.
Вывод текста на график
Вывод графических сигналов
Удаление меток с графика
Торговый советник на индикаторах
Удаление данных вечерней/утренней сессии с графика.
https://smart-lab.ru/blog/933582.php
отличный пост, редкость, но супер.
Замечание, если на фьючах большой оффер на продажу и цена идет сильно вверх, то это сделка Кречетова.
Спасибо!
Буду просить брокера открыть ленту
Вчера пытался понять «как отловить айсберг через ленту», единственное, что пришло на ум это смотреть на колонку микросекунды, на крупной заявке таяние айсберга будет в пределах +-5мкс
у меня сейчас есть подобный индюк (он так же метит график манимейкером), а в качестве робота выступает сторонний софт фалкон трейд *в нем написана стратегия. НО беда в том, что тот индикатор который у меня на вооружении — он покупной и максимум бьет по 2м заданным объемам (( и мне приходится вешать по 2-3 индикатора на 1 график, что очень тормозит систему + котировки он цепляет со стороны. Короче костыль жуткий )) Ваше же решение — это просто бинго и его бы очень хотелось бы допилить под мою систему торговли, поэтому еще раз, на всякий случай спрошу о возможности постучаться как то к вам в личку ))
Планируется ли в одном из уроков тема алертов? К примеру во время срабатывания метки на графике на определенный объем — звуковой сигнал или сообщение на экране.
os.execute('powershell -c (New-Object Media.SoundPlayer «c:\\windows\\media\\tada.wav»).PlaySync();')
Сообщения скрипт и так выдает по каждому поводу, в т.ч. по сигналам.
Как выводить сообщения рассматривали здесь, как выводить в отдельную таблицу здесь, как выводить в файл здесь.
Можете выводить сигналы в файл, который далее уже будет обрабатывать, например, скрипт на питоне и отправлять информацию почтой или в мессенджер.