alfacentavra
alfacentavra личный блог
05 сентября 2023, 11:52

Qlua: работа с лентой всех сделок (часть 2).

Сегодня завершаем работу с лентой всех сделок:

Различия данных ленты всех сделок и биржевого стакана.
Большие покупки и продажи в ленте сделок и динамика цены.
Альтернативные варианты поиск крупных игроков по ленте сделок.

Начало: https://smart-lab.ru/blog/935919.php


Еще раз про отличия ленты всех сделок и биржевого стакана – некоторые заявки могут исполняться очень быстро, их можно просто не заметить в стакане, но они точно отразятся в ленте. Какие-то заявки и движения в стакане могут быть для создания видимости крупных игроков, при этом они могут как отменяться как только цена начинает приближаться, так и очень оперативно переставляться. Лента сделок покажет реальную картину: какие объемы и по каким ценам прошли, какие проходят в текущем моменте.

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

Qlua: работа с лентой всех сделок (часть 2).

Аналогично при продажах наблюдается снижение (на графике в районах 15 и 16 часов):
Qlua: работа с лентой всех сделок (часть 2).

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

Qlua: работа с лентой всех сделок (часть 2).

Бывает и такое, что при покупках цена может снижается. Значит в моменте на данные активные покупки отреагировали продавцы и выставляются оффера по ценам в т.ч. ниже текущих о которых и «бьются» покупки в стакане. Обратная логика при продажах и росте цены.

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

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

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

Введем переменную sum в которой будем проводить суммирование объемов (lastvolume) с учетом направления сделок (direction = +1 при покупках, -1 при продажах). Чтобы оптимизировать код добавим массив msum = {}, в который будем добавлять из таблицы всех сделок новым элементом каждое значение direction * lastvolume, пока массив меньше 20, как только массив достигнет 20, то будем при добавлении удалять первый (самый старый) элемент.

Массив msum позволит нам не проводить суммирование по всем 20 значениям, а просто добавлять новый элемент к сумме:

sum = sum + direction * lastvolume

Если массив достиг 21 элемента, то  

if #msum >= 21 then
  sum = sum - msum[1]  -- вычитаем первое, самое старое значение
  table.remove(msum, 1) -- удаляем 1й, уже не актуальный элемент из массива
end

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

Поменяем условия относительно прошлой логики: будем выводить небольшим метки при sum(20) >= 2000, средние при sum(20)  >= 3000, большие при sum(20)  >= 5000:

Qlua: работа с лентой всех сделок (часть 2). 

Если мы вывели метку, то обнуляем sum и массив значений msum={}, чтобы график не слишком уплотнялся метками. Сами метки выведем в этот раз как в сообщениях как сигналы советника (покупка по/продажа по) с указанием текущей цены по бумаге.

Сделаем еще один график цен сбера с идентификатором SBER2_ID, на котором запустим второй вариант советника, чтобы сравнивать как они работают в динамике:

Qlua: работа с лентой всех сделок (часть 2). 
Файл на github


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

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

Qlua: работа с лентой всех сделок (часть 2). 

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

Если направление сделки совпадает с направлением предыдущей сделки, то будем увеличивать sum в случае покупок (direction == 1) или уменьшать в случае продаж (direction == -1):

if direction == 1 and pretrade == 1 then sum = sum + 1 end

if direction == -1 and pretrade == -1 then sum = sum - 1 end

Если у нас обрабатывается первая строка ленты сделок (indexstart == 0), то просто sum будет приравнено direction (направление текущей сделки):

Qlua: работа с лентой всех сделок (часть 2). 

Метки на график будем выводить если по модулю sum равна 30, 50 или 100:

Qlua: работа с лентой всех сделок (часть 2).

Соответственно в этом случае крупные метки будут показаны, если sum по модулю равна 100, средние, если = 50. Цвет метки, по аналогии с предыдущими скриптами, покажет dir (+1 если sum>0, -1 в обратном случае).

Выведем еще один график цены по Сбербанку, поставим ему идентификатор SBER3_ID и можно будет сравнить все 3 скрипта на одном экране:

Qlua: работа с лентой всех сделок (часть 2).

Здесь все 3 скрипта сверху вниз в порядке их реализации: верхний график показывает метки алгоритма прошлой статьи (только большие лоты), средний первого скрипта текущей статьи (анализ последних 20 трейдов), нижний — последний скрипт по количеству трейдов одного направления.
 

В вечернюю сессию видно насколько падают объемы:

Qlua: работа с лентой всех сделок (часть 2).
Файл на github.

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

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


Примечания:
Таблица проверки: во втором и третьем скрипте я дополнил код небольшой вспомогательной таблицей, чтобы можно было контролировать корректность работы расчета скрипта.
Qlua: работа с лентой всех сделок (часть 2).

Первая отражает размер sum и величину массива #msum (пока #msum меньше 20 новых меток не на графике). Вторая таблица по последнему скрипту, отражает количество сделок подряд одного направления с последнего изменения.

Метки:если у вас не выводятся красные метки, а все только зеленого цвета попробуйте закрасить текущие метки (point.bmp, 2point.bmp и 3point.bmp), которые использует скрипт в красный, пересохранить в другой файл (по аналогии, например, redpoint.bmp, 2redpoint.bmp, 3redpoint.bmp) и сделать отдельную функцию по выводу красных меток. Дело в том, что терминал может по разному отражать метки не только в зависимости от версии терминала, но и от цветовых настроек графика. Так у меня на белом фоне метки отражаются с возможностью менять цвет корректируя параметр прозрачности (label_params. TRANSPARENCY), но если поставить черный фон, то красных меток вы не заметите, они при текущих настройках будут сливаться. Также лучше не выводить дополнительно индикаторы на графики с метками, т.к. в этом случае могут теряться свойства прозрачности.

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

Упражнения:

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

2) Сделайте расчет минутных значений (суммарные покупки минус суммарные продажи внутри минуты). Выведите их на график по аналогии со вторым алгоритмом, где расчет шел по последним 20 сделкам, задав более серьезные минимальные пороги для меток.

3*) Сделайте аналогичный расчет минутных данных, используя «гибкую минуту», т.е. привязанную не к привычным 00-59 секунд каждой минуты, а ежесекундно анализируя сделки, прошедшие в интервале [t – 59 cек; t], где t – текущее время в секундах. Выведите их на новый график по логике, аналогичной п.2, сравните результаты.

Теги: 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

Qlua: работа с лентой всех сделок.
Что такое таблица обезличенных сделок.
Настройка таблицы в терминале.
Что делать, если таблица открылась, но она пустая.
Вывод данных с таблицы по DDE.
Работа с таблицей обезличенных сделок через скрипт qlua с примерами.
Пишем советника, показывающего на графике крупных игроков.
https://smart-lab.ru/blog/935919.php

22 Комментария
  • Fairman
    05 сентября 2023, 12:05
    Кстати, скрипт из прошлой статьи не работает в Quik
      • Fairman
        06 сентября 2023, 08:51
        alfacentavra, всё сделал именно так, но на графике ничего не появилось
          • Fairman
            06 сентября 2023, 09:30
            alfacentavra, 10.3
          • Fairman
            06 сентября 2023, 09:42
            alfacentavra, ок, я сегодня ещё раз попробую запустить скрипт. Если не получится могу к вам обратиться за помощью?
              • Fairman
                06 сентября 2023, 09:51
                alfacentavra, фон черный. Таблицу сообщений не смотрел
  • Сергей Иванов
    05 сентября 2023, 17:16
    alfacentavra, спасибо за продолжение кружка авиамоделизма
    Ваши посты просто грааль настоящего алгоритмического трейдинга
  • _sg_
    05 сентября 2023, 17:23

    А есть ли у Вас пример с очередью Lua.

    Например,

    1. Принимаем «Текущие торги» в Колбэке,
    2. Сохраняем данные в очереди,
    3. Выходим из колбека,
    4. Из осовной функции main
    достаем данные из очереди
    и пишем данные в файл.

      • _sg_
        05 сентября 2023, 23:10

        alfacentavra, нет. Я в Lua не силен.

        Пока рассматриваю стоит ли вообще заниматься Lua по Вашим примерам.

        В целом использование Lua в С++ стало не только трендом, но и  стандартом для некоторых С++ приложений.

        Так что решение разработчиков Квика встроить скриптовый язык Lua в Квик вполне оправдано. С конкретной реализацией пока не понятно. Изучаю по Вашим примерам.

  • Антон
    03 декабря 2023, 21:16

    alfacentavra добрый день. Огромное спасибо за статью, то что я искал!

    Я не очень силен в qlua, только учусь.
    Вы не могли бы помочь с вашими упражнениями в конце статьи.

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

  • SpSound
    11 декабря 2023, 11:16
    Дорогой автор, Спасайте! Я уже задолбал терминал, а главное свой мозг — и никак не получается реализовать вот эту функцю - «Дополните скрипт, чтобы количество покупок и продаж отражалось не через hint (высвечивается при наведении курсора), а печаталось рядом с меткой»

    Я уже и дополнительный блок function прописываю с function labeldraw(price, direction, textlabel, texthint)   

    и все никак ((  

    Куда нужно прописать функционал отображение кол-ва в цифрах рядом с появившейся точкой? 

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн