Transcription
Всем привет!
В предыдущих уроках данного курса мы разобрали несколько пакетов Python, которые позволяют разработать торговый терминал. Чтобы упростить вам процесс написания собственного терминала, в этом заключительном выпуске вкратце рассмотрим готовое решение.
Исходный код программы можете скачать в специальном канале телеграмма. Ссылку найдёте в описании данного видео.
Обзор торгового терминала начнём с пакета api. Данный пакет состоит из специального модуля __init__, модуля binance_api и модуля bitmex_api.
Модуль __init__ добавлен в пакет для удобства. Он позволяет после подключения в другом файле пакета обратиться к объекту, определение которого находится в одном из модулей данного пакета. Для этого в модуле __init__ инструкцией import необходимо подключить соответствующий объект.
В данном случае подключается два класса: BinanceAPI и BitmexAPI. Это означает, что при подключении в другом файле пакета api имена этих классов добавятся в глобальное пространство имён. После этого классы можно будет вызывать, указывая через точку имя пакета или его псевдоним и имя класса.
Второй модуль пакета api — binance_api — предназначен для взаимодействия с биржей Binance. Рассмотрим класс BinanceAPI, который определён в данном модуле.
В специальном методе __init__ реализована аутентификация. Следующий метод set_initial_data запрашивает у биржи исторические котировки некоторого актива и создаёт из них датафрейм. Третий метод update_data запрашивает у биржи последние котировки актива. Если они относятся к новому закрытому торговому периоду, то они добавляются в датафрейм, а метод возвращает значение True.
Также в этом классе определены два метода для осуществления спотовой торговли. Метод order_market_buy открывает длинную позицию. То есть покупает некоторый актив. Возвращает метод информацию либо о возникшем в блоке try исключении, либо об успешной сделке.
Последняя информация включает в себя направление выполненного ордера, объём сделки, среднюю цену и время транзакции. Аналогичный метод order_market_sell закрывает длинную позицию. То есть продаёт купленный ранее актив. Метод также возвращает информацию об исключении, либо об успешной сделке.
Третий модуль bitmex_api подобен модулю binance_api. В данном модуле определён класс BitmexAPI для взаимодействия с биржей BitMEX. Первые три метода работают аналогично одноимённым методам класса BinanceAPI.
Кроме того, в теле класса определены два метода для осуществления маржинальной торговли. Первый метод create_market_order позволяет открывать как длинную, так и короткую позицию по различным контрактам BitMEX. Соответственно, второй метод close_position закрывает длинную или короткую открытую позицию. Оба метода возвращают информацию об исключении, либо об успешной сделке.
Ещё один пакет торгового терминала называется strat. Это пакет для стратегий. В данном случае он содержит модули двух стратегий и специальный модуль __init__. Модули стратегий содержат соответствующие классы.
Поскольку классы стратегий очень похожи, разберём только один из них. В первую очередь обратите внимание на атрибуты класса. Они предназначены для расчёта стратегии, для графического отображения стратегии и для торговли.
Помимо атрибутов в классе определены три метода. Первый метод calculate_strategy принимает датафрейм с котировками актива и с его помощью вычисляет значения индикаторов и сигналы стратегии. Обратите внимание, что в расчётах используется модуль pandas_ta, который является частью торгового терминала.
Следующий метод называется get_addplot. Данный метод с помощью функции make_addplot пакета mplfinance создаёт словари для графического отображения элементов стратегии. Функции метод передаёт рассчитанные элементы стратегии, атрибуты класса и ссылку на область рисования.
Созданные таким образом словари помещаются в список, который является результатом вызова метода get_addplot. И, наконец, третий метод trade отвечает за торговлю. Метод принимает экземпляр класса BinanceAPI для взаимодействия с Binance и название торговой пары, по которой следует совершить сделку.
По умолчанию для данной стратегии это пара ETH/USDT. Возвращает метод trade либо результат вызова метода order_market_buy, либо результат вызова метода order_market_sell. Таким образом, данный метод покупает или продаёт актив на бирже Binance и возвращает информацию о совершённой сделке, либо об исключении в случае некоторой неисправности.
Теперь посмотрим модуль gui, отвечающий за графический интерфейс. В модуле определён класс GUI. Обратите внимание, что класс является наследником класса Tk пакета tkinter.
Атрибутами класса являются данные для настройки окна и графика. Помимо атрибутов в теле класса определены шесть методов. Начнём со специального метода __init__.
В данном случае метод является переопределённым, поскольку он определён в классе-наследнике. Это означает потерю классом GUI связи с атрибутами и методами класса Tk. Проблема решается путём вызова метода __init__ базового класса Tk.
Чтобы вызвать унаследованный метод, необходимо воспользоваться классом super. Данный класс возвращает объект, который делегирует вызов метода базовому классу. Далее метод __init__ инициализирует четыре атрибута, отвечающие за то, какие данные должны отображаться на графике при запуске программы.
Здесь же инициализируется ещё два атрибута. Им присваиваются значения переданных классу аргументов. Это словари, содержащие соответственно экземпляры классов пакета api и экземпляры классов пакета strat.
С помощью атрибутов exchanges и strategies в дальнейшем происходит взаимодействие с той или иной биржей и стратегией. После создания атрибутов настраивается окно: окну даётся название, устанавливаются размеры окна, и центрируется его отображение.
Затем в окно добавляется меню. Благодаря меню в терминале можно выбрать актив и таймфрейм графика, а также включить стратегию. Следующими командами создаётся и добавляется в окно многострочное текстовое поле.
Данный виджет удобно использовать для вывода информации о сделках. Также метод __init__ добавляет в окно рисунок с ценовым графиком, а последней командой вызывает метод update_chart.
Метод update_chart нужен для периодического обновления графика. Здесь хочу обратить ваше внимание на вложенную инструкцию if. В зависимости от того, включена ли стратегия, будет выполняться один из блоков этой инструкции.
Разберём блок else, который выполняется, если включена какая-либо стратегия. В блоке else из экземпляра класса включённой стратегии последовательно вызываются рассмотренные ранее методы: calculate_strategy, get_addplot и trade.
Далее результат вызова метода trade добавляется в текстовое поле, если тот, в свою очередь, вызвал какой-либо метод для совершения сделки. В текстовое поле может добавиться информация о сделке, либо об исключении.
Кроме того, результат вызова метода get_addplot передаётся функции plot для добавления в график индикаторов и сигналов стратегии. Ниже определены три метода, которые вызываются при выборе команд меню.
Изменяя соответствующие атрибуты, эти методы влияют на то, какие данные будет отображать график, а также будет ли работать стратегия. Каждый из этих методов последней командой вызывает метод draw_chart.
Данный метод создаёт новый датафрейм с котировками актива, а затем обновляет график. Осталось разобрать скрипт, предназначенный для запуска торгового терминала.
В этом скрипте подключаются пакеты strat и api, а также модуль gui. Далее создаётся два словаря. Словарь exchanges содержит экземпляры классов пакета api.
С помощью этого словаря в модуле gui и модулях стратегий происходит взаимодействие с той или иной биржей. Второй словарь strategies содержит экземпляры классов пакета strat. Он используется в модуле gui для взаимодействия с методами экземпляра класса включённой стратегии.
Оба словаря передаются классу GUI при создании экземпляра класса. Наконец, из созданного объекта вызывается метод mainloop для отображения графического интерфейса торгового терминала.
На этом завершим курс «Трейдинг на Python». Свои вопросы оставляйте в комментариях. Всем пока!