Простейшая сигнальная программа на Python для внутридневной торговли фьючерсами на бирже ММВБ

Около 100 строк кода на Питоне (Python) и у вас система, которая:

  • имеет практическую ценность для трейдинга на бирже ММВБ;
  • попутно иллюстрирует как легко:

— работать со звуком на Питоне;
— экспортировать торговые данные в Excel онлайн;
— выгружать данные из торгового терминала Quik для дальнейшей обработки.

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

Что за программа?

Это — НЕ ТОРГОВЫЙ РОБОТ.

Просто alarm-система на Питоне (Python), издающая звуковые сигналы при нахождении цены в определенных заданных, а также рассчитываемых, диапазонах.

Место применения: срочный рынок биржи ММВБ (фьючерсы).

Временной интервал: краткосрочная внутридневная торговля.

Гранулярность использованных данных (таймфрейм): 1 минута.

Инструмент, использовавшийся для статьи: 3-месячные SBRF фьючерсы Сбербанка.

Почему такой выбор?

ММВБ

Ведущая отечественная площадка. Нет мороки со вводом и выводом денежных средств. Доступная техподдержка. Нет зависимости от иностранной валюты. Нет оглядки на санкции. Легкость входа и выхода.

Сбербанк

Голубая фишка финансового рынка России. Вносит весомую долю в цену индекса биржи РТС. А значит, цену фьючерса РТС можно использовать как поддерживающий индекс, указывающий на тенденции в движении цены.

Фьючерсы Сбербанка

Высокая волатильность (а значит, и возможность заработать) и большие объемы торгов (нет проблем с ликвидностью). Это потенциально перспективная сфера быстрого заработка в интернете.

Фьючерсная торговля в отличие от работы с акциями:

— По умолчанию уже имеет заложенное плечо примерно 1:5. Не нужно платить полную стоимость бумаги, достаточно внести гарантийное обеспечение (ГО), которое примерно в 5 раз ниже стоимости акции.

— Услуги депозитария не нужны.

— Есть возможность покупать не поставочный, а расчетный фьючерс.

— Нет необходимости осваивать тонкости работы с криптовалютой и с иностранными биржами.

Quik

Quik — одна из самых популярных программ для трейдинга. Поначалу может по казаться не совсем прозрачной в использовании. Но это быстро проходит. Кастомизация позволяет очень удобно настроить терминал. Многие отдают предпочтение Quik перед Метатрейдером (Metatrader). Последний больше ориентирован на построение всяких индикаторов и советников, на алгоритмизацию биржевой торговли.

Низкий порог входа в рынок

Цена одного фьючерсного контракта Сбербанка сейчас меньше 6 000 рублей. Принимая во внимание его высокую волатильность и ликвидность, а также цену за транзакционные издержки, фьючерс Сбербанка — самая дешевая и удобная ценная бумага, на которой можно заработать в интернете.

Таймфрейм

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

Предпосылки разработки сигнальной системы

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

Что делает система? В чем ее полезность?

Рассмотрим типовые ситуации, которые могут встретиться в трейдинге:

1) Пробой уровня вверх или вниз. Если пробой не отслеживать, и он окажется ложным, то цена развернётся и вы окажетесь в убытках.

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

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

Если ставить стоп-заявку на продажу заранее, то явно цена либо не дойдет до уровня, либо пробьет его. Но куда пойдет дальше — непонятно. А вы уже в позиции. Будет убыток, если разворота не произойдет. В то же время, если оценивать будущее движение непосредственно перед предполагаемым рывком, ваш риск будет существенно меньше.

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

Маленький лайфхак:

Инструмент не обязательно ограничивать фьючерсом Сбербанка. Очень хорошо себя показали фьючерсы ВТБ и РТС.

Контракт ВТБ более дешевый и внутридневные его движения меньше, чем у Сбера. Зато на те же самые деньги, что идут на 1 контракт Сбера, можно открыть 2-3 сделки по ВТБ. В среднем, по прибыли/убытку получается примерно одинаково. Но здесь нужно следить за поведением цены на оба фьючерса: в какие-то моменты размах движений ВТБ увеличивается. Соответственно, ВТБ становится выгодней. Да и риска с ним меньше в пересчете на один контракт.

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

Python-код и комментарии к сигнальной программе для работы в Quik

Настройка вывода цены последней сделки из Quik в Excel

1). Создаем файл Excel xlsx. Ниже в комментариях он у меня назван как Quik2Excel.xlsx. Помещаем его в тот же каталог, в котором установлен Quik. Открываем файл. Если уже открыты другие Excel-файлы, нужно, чтобы наш xlsx файл был активным, т. е. быть последним Excel-файлом, с которым вы работали.

2). Заходим в Quik. Для работы сигнальной системы на Питоне (Python) нам нужна цена самой последней сделки. Ее можно найти в таблице «Текущие торги».

Если таблица уже создана в системе Quik, переходим к п. 3).

Если нет — создаем таблицу. Переходим по меню «Создать окно — все типы окон» (или просто нажимаем F7).

Выбираем «Текущие торги».

Выбираем таблицу с последней сделкой

Заходим в таблицу текущих торгов для редактирования вывода полей.

Заходим в таблицу текущих торгов

Из раздела FORTS указываем фьючерс Сбербанка SBRF с нужным месяцем экспирации. В настройках выбираем обязательную колонку «Цена последней сделки». Остальные — на ваше усмотрение.

Настройка таблицы Текущих торгов

3). Находясь в таблице «Текущие торги», либо из верхнего меню «Действия» Quik, либо из контекстного по правой кнопке мыши выбираем «Вывод через DDE сервер».

В настройках вывода указываем имя Excel-файла, созданного в п. 1)., и имя листа (по умолчания это — Лист1). Или другое, если оно менялось (как в показанном ниже случае). Имя рабочей книги должно быть без пути, только имя файла с расширением.

Остальное можно оставить как есть. Нажимаем на кнопку «Начать вывод».

Настройка вывода торговых данных из Quik в  Excel

Если все сделано правильно, кнопка «Остановить вывод» станет активной. В любой момент вывод можно затормозить и даже закрыть окно в среде исполнения Питона. При дальнейшей необходимости можно возобновить процедуру.

Это окно можно закрыть и работать в Quik. Вывод данных будет продолжаться.

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

Код на Питоне (Python) для сигнальной системы

Комментарии к коду Python

Импортируем библиотеки:

# Библиотеки
# Проигрывание мелодии
import pyaudio
import wave

# Для обнаружения активного открытого файла Excel
import win32com.client as win32

# Считывание и обработка времени
import time

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

pip install имя_lib

Определяем функции


# Получить значение состояния по цене
def get_state(val):
    if val > up_after: state = 130
    elif val > MAX: state = 120
    elif val > up_before: state = 110
    elif val < dn_after: state = 70
    elif val < MIN: state = 80
    elif val < dn_before: state = 90
    else: state = 100
    return state

def find_index(numbers, target):
    try:
        index = numbers.index(target)
        return index
    except ValueError:
        return -1

# Получить значение в ячейке Excel
def get_cell_value(row, col):
    for row in range(row, row+1):
       for column in range(col, col+1):
           cell_value = wsTrade.Cells(row, column).Value
           return cell_value

# Функция для воспроизведения звука
def play_audio(file_path):
    # Open the sound file 
    wf = wave.open(file_path, 'rb')

    # Create PyAudio object
    p = pyaudio.PyAudio()

    # Open stream
    stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
                    channels=wf.getnchannels(),
                    rate=wf.getframerate(),
                    output=True)

    # Read data
    data = wf.readframes(1024)

    # Play stream
    while data:
        stream.write(data)
        data = wf.readframes(1024)

    # Close stream
    stream.stop_stream()
    stream.close()
    p.terminate()

УРОВНИ

Наглядно всю графику, относящуюся к уровням, см. в заставке статьи.

При каждом запуске программы пользователь выбирает уровни пробития вверх и вниз (MAX и MIN). Их разница дает размах движения (swing).

Рассчитываются дополнительные уровни: по 15% от величины свинга (задается, можно менять).

Большими стрелками показано направление пробития диапазона вверх и вниз.

Уровни задают статус цены:

  • 90 и 110 — зоны подхода к уровням пробоя;
  • 80 и 120 — зоны неподтвержденного пробоя
  • 70 и 130 — зоны уверенного пробития
  • 100 — зона флэта.

Числа от 70 до 130 соответствуют статусам цены последней сделки.

Настройки

Файлы звуков находятся в каталоге C:\Windows\Media. В коде программ на Питоне (Python) слэш обозначается двойным символом, по правилам экранирования символов.

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

В зоне флэта раздается легкий шаркающий звук. Он не мешает, но дает чувство уверенности в том, что программа работает.

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

# Постоянно новый ввод
MAX = 7030   # Верхний уровень пробития
MIN = 6980   # Нижний уровень пробития
sound_base = "C:\\Windows\\Media\\"

states = [90, 80, 70, 100, 110, 120, 130]

# Файлы звуков по состояниям
sounds = [
          'Ring02.wav',
          'Ring03.wav',
          'Ring05.wav',
          "Speech Sleep.wav",
          "Alarm04.wav",
          "Alarm01.wav",
          'Ring08.wav'
         ]

# Мало меняющийся ввод
up_ratio_before = 0.15   # диапазон до MAX (в долях от swing)
up_ratio_after = 0.15    # диапазон после MAX (в долях от swing)
dn_ratio_before = 0.15   # диапазон до MIN (в долях от swing)
dn_ratio_after = 0.15    # диапазон после MIN (в долях от swing)

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

РАСЧЕТЫ

Находим активное приложение Excel с листом «TRADE»

# Получаем доступ к файлу Excel
excel = win32.GetActiveObject("Excel.Application")
wb = excel.ActiveWorkbook
wsTrade = wb.Worksheets('TRADE')

Внимание: У вас лист может называться по-другому.

Рассчитываем дополнительные уровни

# Расчеты - additional levels

swing = MAX - MIN  # Размах изменений --- сродни волатильности, Range
delta = up_ratio_before * swing
up_before = MAX - delta
up_after = MAX + delta

delta = dn_ratio_before * swing
dn_before = MIN + delta
dn_after = MIN - delta
print('dn_after MIN dn_before up_before MAX up_after\n', dn_after, MIN, dn_before, up_before, MAX, up_after)

Оператор print выведёт на экран рассчитанные дополнительные уровни состояний.

Основной цикл


По заданным и рассчитанным уровням находится статус цены поcледней сделки, импортированной из Quik в Excel. Статус определяет, какой звук будет звучать.

Цена и статус обрабатываются примерно раз в минуту.

numCycles = 0
while True:
#for j in range(numCycles):
    s = round(time.time(), 0)
    while time.time() < s + 60:   # Ждем около минуты
        pass

    numCycles += 1
    lastDealPrice = get_cell_value(2,2)
    state = get_state(lastDealPrice)
    index = find_index(states, state)
    if index == -1:
        print(f"Ошибка: Число {state} не найдено в списке!")
    else:
        sound_file = sounds[index]
        print(f"№ {numCycles} Цена поcледней сделки:  {lastDealPrice}  state: {state}  file: {sound_file}")
        sound_path = sound_base + sound_file
        play_audio(sound_path)

Оператор print выводит на экран цену поcледней сделки, текущее состояние и имя audio файла. Можете его закомментарить или удалить.
Основной цикл бесконечный. Для окончания работы просто закрывайте среду исполнения.

У меня программа работает в блокноте Юпитер (Jupyter). Можно использовать блокнот Google Colab или любую другую среду исполнения с Python.

Результат

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

Также может быть интересно: