Блог им. morefinances

Qlua: работа с лентой всех сделок.

Сегодня рассмотрим: 

Что такое таблица обезличенных сделок.
Настройка таблицы в терминале.
Что делать, если таблица открылась, но она пустая.
Вывод данных с таблицы по DDE.
Работа с таблицей обезличенных сделок через скрипт qlua с примерами.
Пишем советника, показывающего на графике крупных игроков.

Лента всех сделок (она же таблица обезличенных сделок, она же таблица всех сделок) — это тиковый массив сделок с одним или несколькими инструментами, в котором отражается информация по каждой сделке, в т.ч.: цена, объём и направление транзакции (покупка/продажа). Обычно для работы выбирается один инструмент, который отслеживается, реже 2 (например базовый актив и ближайший фьючерс на него). Встречал варианты, когда грузят сразу большой список, но в этом случае может сильно подвисать терминал.

Зачем нужна лента сделок: многие, пытаясь торговать внутри дня, проводят часы за медитативным наблюдением за биржевым стаканом. Однако стакан заявок это только намерение, далеко не все выставленные заявки перейдут в сделки. Более того иногда по некоторым акциям (2го и 3го эшелона) заявки в стакане могут активно «двигаться», создавая видимость, что в бумаге идет активная торговля, при этом, если открыть таблицу всех сделок, то будет видно, что реальных сделок практически нет.

Особенность ленты в том, что мы видим, в каком направлении сейчас в моменте исполняются рыночные заявки (либо те лимитные, что бьют по офферам/бидам стакана). А именно такие заявки будут формировать направление движения графика. Т.е. если мы просто выставим лимитную заявку в стакане и никто о неё не «ударит», то и цена никуда не уйдет. При этом не нужно думать, что если мы видим, что проходит покупка в ленте, то однозначно график должен расти, это далеко не обязательно: цена может и снижаться, и оставаться на том же уровне. Аналогично и при продажах не обязательно, что направление графика будет совпадать, т.к. динамика цены это соотношение (в моменте) объемов покупок и продаж. Но из данной таблицы мы можем получать данные, которые для кого-то послужат хорошим сигналом для сделок, для кого-то будут дополнительным фильтром (например торговля в лонг только если прошедшие покупки превышают прошедшие продажи), кто-то будет из этой ленты формировать собственные минутные свечки, кто-то будет делать производные данные для анализа, например: считать профиль рынка за день, либо отрисовывать класстерные уровни покупок и продаж.

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

Настройка таблицы в терминале:

Лента добавляется через Создать окно / Таблица обезличенных сделок.

 Qlua: работа с лентой всех сделок.

Если вы не находите этого пункта в меню, то следует его добавить: Создать окно / Настроить меню, в Стандартных найти Таблица обезличенных сделок, перевести кнопкой Добавить в правую часть:

Qlua: работа с лентой всех сделок.

Теперь можно создать таблицу (Создать окно / Таблица обезличенных сделок).

Qlua: работа с лентой всех сделок.

Выбираем класс, например, Акции, а через фильтр инструментов нужную бумагу, например Сбербанк:

 Qlua: работа с лентой всех сделок.

Qlua: работа с лентой всех сделок.

Дважды нажимаем «Да» и получаем саму таблицу:

Qlua: работа с лентой всех сделок.

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

Можно отредактировать таблицу, чтобы отображались только те данные, которые нам будут нужны (CTRL + E при активной таблице, либо клик правой клавишей мышки и далее «Редактировать таблицу»):

Qlua: работа с лентой всех сделок.

Qlua: работа с лентой всех сделок.

Получаем:

Qlua: работа с лентой всех сделок.

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

Qlua: работа с лентой всех сделок.

Qlua: работа с лентой всех сделок.

Аналогичным образом можно закрасить покупки.

Лично я привык работать с этой таблицей без цвета, чтобы не «рябило» в глазах.


Если таблица открылась, но она пустая:

1) Проваливаемся в настройки (F9 или меню Система / Настройки / Основные настройки), там заходим в Программа / Получение данных, выбираем «Обезличенные сделки»:

Qlua: работа с лентой всех сделок.

Выбираем нужный класс инструментов, Сохранить. Ниже в боковом меню проваливаемся в Сохранение данных, проверяем, что стоит Получать пропущенные данные:

 Qlua: работа с лентой всех сделок.

После этого возвращаемся обратно в Получение данных/Обезличенные сделки и нажимаем «Перезаказать данные», Сохранить.

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


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

Вывод данных с таблицы по DDE.

Самый простой вариант работы с таблицей для дальнейшего анализа – это вывод через DDE в Excel. Хоть мы далее будем работать с ней через скрипт, но тоже бывает полезным (например, для быстрых проверок расчетов или каких-то гипотез):

Выбираем Редактировать таблицу и далее «Вывод через DDE»:

Qlua: работа с лентой всех сделок.

Выбираем запускать приложение DDE сервера автоматически (при необходимости указываем в какой конкретно файл делать вывод):

Qlua: работа с лентой всех сделок.

И нажимаем «Начать вывод». Получаем дублирование данных в Excel:

Qlua: работа с лентой всех сделок.

Кто-то на начальных этапах работает с лентой в таком виде.  

Не забываем после работы с Excel отключить вывод по DDE в терминале (В меню Вывод через DDE нажимаем Остановить вывод, убираем Запуск приложение DDE автоматически):

Qlua: работа с лентой всех сделок.


Работа с таблицей обезличенных сделок через скрипт
qlua.

Чтобы работать с лентой сделок через скрипт нужно, чтобы сама таблица с соответствующим инструментом была открыта в терминале. В т.ч. для этих целей я подробно указал весь квест как её открывать и настраивать в квике.

Получать данные по ленте сделок мы можем через функцию обратного вызова AllOnTrade. Подробное описание параметров возвращаемой таблицы можно найти в справочном файле QLUA.chm (находится в директории с терминалом):

Qlua: работа с лентой всех сделок.

 Qlua: работа с лентой всех сделок.

Рассмотрим пример: будем выводить в сообщениях только те сделки по которым количество лот было >=100.

Для удобства можно настроить таблицу всех сделок на соответствующее отражение: нажимаем на столбец Кол-в, выбираем Фильтр по «Кол-во»

Qlua: работа с лентой всех сделок.

Далее ставим условие «больше либо равно» 100 и сохраняем:

Qlua: работа с лентой всех сделок.

Теперь мы отфильтровываем все мелкие сделки, смотрим только средние и крупные:

Qlua: работа с лентой всех сделок.

В скрипте нам необходимо в функции обратного вызова OnAllTrade отфильтровать по тикеру бумагу (в таблице всех сделок, как я говорил в начале, их может быть несколько) и определить те параметры, с которыми мы планируем работать. Например: цену, количество и оборот:

function OnAllTrade(alltrade)

  if alltrade.sec_code=="SBER" then
    lastprice             = alltrade.price  -- цена
    lastvolume           = alltrade.qty     -- количество
    lastvalue            = alltrade.value  -- оборот

  end

end


Направление сделки мы можем получать через флаги alltrade.flags:

Qlua: работа с лентой всех сделок.

Есть 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 флагами через биты, получаем:

Qlua: работа с лентой всех сделок.

Запускаем скрипт:

Qlua: работа с лентой всех сделок.

Сравниваем с таблицей всех сделок, видим, что результаты идентичны:

Qlua: работа с лентой всех сделок.

Файл скрипта: https://github.com/morefinances/qlua/blob/main/OnAllTrade_one.lua


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


Немного изменим скрипт.

Будем оценивать сентимент продаж и покупок (настроение рынка) через простой арифметически расчет:

На старте sentiment = 0

При покупке будем к sentiment суммировать количество, при продажах минусовать.

Расчет будем проводить с момента старта скрипта.

Qlua: работа с лентой всех сделок.

Получаем:

Qlua: работа с лентой всех сделок.

Что соответствует в моменте прошедшим сделкам:

Qlua: работа с лентой всех сделок.

Файл скрипта: 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, либо можно нарисовать/добавить свои.

В функцию обратного вызова прописываем условия:

Qlua: работа с лентой всех сделок.


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 для начинающих, кружок авиамоделизма.

Ранее:

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



  • обсудить на форуме:
  • Quik Lua
★34
20 комментариев
avatar
Спасибо!!!
avatar

отличный пост, редкость, но супер.

Замечание, если на фьючах большой оффер на продажу и цена идет сильно вверх, то это сделка Кречетова.

avatar
LongShortProfit, 
Спасибо!
avatar
Отличный кружок моделизма, спасибо
Буду просить брокера открыть ленту
avatar
и зачем если есть гоовые решения?
avatar
AldoTrader, во-первых, готовые решения, как правило, платные. Во-вторых в статьях материал не для торговли на внешнем ПО, а для собственных решений на квике. Готовые решения не смогут черпать одновременно данные из ленты сделок, таблицы торгов, графиков, стаканов, текущих позиций, состояния портфеля и пр., и пр. и сохранять в нужном формате и периодичности в файлах, делать нужные расчеты, давать сигналы, выставлять и снимать заявки по нужной логике, и т.д. Здесь «кружок авиамоделизма», а не магазин детских игрушек.
avatar
Зарегистрировался специально чтобы СПАСИБО сказать! Продолжайте, не обращайте внимания на всяких зануд, делайте свое дело! Вы — молодец!
avatar
Алексей, спасибо!!
avatar
", чтобы в т.ч. отлавливать позиции крупных игроков, которые стараются не светиться большими сделками (например работают через айсберг-заявки). В качестве самостоятельного упражнения подумайте как это можно реализовать"
Вчера пытался понять «как отловить айсберг через ленту», единственное, что пришло на ум это смотреть на колонку микросекунды, на крупной заявке таяние айсберга будет в пределах +-5мкс
avatar
Отлично! Ленту тоже придется просить.
avatar
alfacentavra, я правильно понимаю, что все метки на графике сбрасываются на след. день? B как можно с вами связаться? 
avatar
SpSound, если терминал не закрываете всё остается, но лента сделок это всегда информация текущего дня. Если нужна постоянная отрисовка в т.ч. за прошлые периоды сохраняете с ленты данные в файл, а при новом запуске квика перерисовываете метки в нужном графике. Пишите сюда, если есть вопросы.
avatar
Сейчас данный код реализован в виде скрипта, а есть возможность реализовать его в виде индикатора?  Вешать на различные бумаги,  и что бы условия срабатывания (метка на графике по определенному объему) стала читаться и как сигнал для робота? Грубо говоря те 3 значения по объему (по умолчанию что сейчас 1000-2000-3000) — стали грубо говоря  линиями (1-2-3) и задав id для OnAllTrade_one.lua уже как для индикатора — можно было бы при срабатывании автоматически заходить в сделку? 
avatar
SpSound, индикаторы будем разбирать в числе финальных тем, на десерт. Индикатором можно сделать вывод меток по почти любой логике (в рамках возможного), но если говорить о работе роботом, то он всё равно будет запускаться отдельным скриптом. Пусть даже будет читать сигналы с графика. А раз так, то всегда более надежно прописать логику внутри алгоритма, а не разделять её на график с метками по индикатору и остальной код. График может случайно закрыться, терминал может не подгрузить часть данных графика (бывает в т.ч. у крупных брокеров), да даже простой обрыв связи остановит вывод меток, зато при включении на графике будет "виноградная гроздь" из сигналов, которые скучкуются на последней свечке. А скрипт сможет многие из этих событий обработать (если при реализации их предусмотреть).
avatar
SpSound, Вам проще немного поменять код: сделать вывод в ленту всех сделок те инструменты, которые хотите торговать, а сигналы выводить в отдельную таблицу/файл/сообщением. Всё это мы проходили. Объемы или даже логику для сигналов можно поставить индивидуальные под соответствующие инструменты (для Сбера одни, для Газпрома другие и т.д).
avatar
поэтому я и спросил о возможности пообщаться за пределами форума, что бы не ждать десерта, а сразу его оплатить )))

у меня сейчас есть подобный индюк (он так же метит график манимейкером), а в качестве робота выступает сторонний софт фалкон трейд *в нем написана стратегия. НО беда в том, что тот индикатор который у меня на вооружении — он покупной и максимум бьет по 2м заданным объемам (( и мне приходится вешать по 2-3 индикатора на 1 график, что очень тормозит систему + котировки он цепляет со стороны. Короче костыль жуткий )) Ваше же решение — это просто бинго и его бы очень хотелось бы допилить под мою систему торговли, поэтому еще раз, на всякий случай спрошу о возможности постучаться как то к вам в личку ))
avatar
SpSound, Напишите ТЗ в разделе алго, уверен, что будут желающие взяться за этот кейс. Либо читайте с первых статей "qlua для начинающих", тогда сможете всё автоматизировать сами.
avatar
Вот так и прививается тяга к знаниям )) Ок, буду пытать тогда вас в этой теме )  
Планируется ли в одном из уроков тема алертов? К примеру во время срабатывания метки на графике на определенный объем — звуковой сигнал или сообщение на экране. 
avatar
Звуковой сигнал можно вывести, например, через системный звук:
os.execute('powershell -c (New-Object Media.SoundPlayer «c:\\windows\\media\\tada.wav»).PlaySync();')
Сообщения скрипт и так выдает по каждому поводу, в т.ч. по сигналам.

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

теги блога alfacentavra

....все тэги



UPDONW
Новый дизайн