Моделирование рынка (Часть 10): Сокеты (IV)
Введение
В предыдущей статье, "Моделирование рынка (Часть 09): Сокеты (III)", мы объяснили последний шаг, необходимый для создания мини-чата. Цель - дать вам возможность начать изучать работу с сокетами на языке MQL5. Хотя это интересно и может пригодиться в будущем, это относится к реализации системы репликации/моделирования, поскольку я ещё не решил, как она будет выглядеть, или, скорее, как я буду реализовывать систему ордеров. Использование сокетов часто является просто очень жизнеспособной альтернативой для передачи информации между различными приложениями и даже между различными операционными платформами. То есть мы можем переносить данные с системы Windows на macOS или даже на Linux без необходимости детально разбираться в исходной или конечной системе. Поэтому мы также можем использовать, казалось бы, более скромные системы для создания чего-то более сложного, как в случае с использованием набора Raspberry для выполнения специальных факторизаций. Но это выходит за рамки данной серии статей. Главная идея здесь - подготовить читателя к следующему этапу развития, через который пройдет система репликации/моделирования.
Однако в статье "Моделирование рынка (Часть 06): Перенос данных из MetaTrader 5 в Excel", мы показали, как переносить данные между MetaTrader 5 и Excel. Почему именно Excel? Причина дидактическая, поскольку мы могли бы использовать другую программу по нашему желанию. Однако использование Excel позволяет объяснить более интересным образом то, что мы хотим сделать. Это связано с тем, что для передачи данных в Excel очень часто используются RTD или DDE, но этот вид связи всегда однонаправленный. То есть мы можем только отправлять данные в Excel и никогда не сможем быстро считать рассчитанные данные для использования в MetaTrader 5. Подумайте о возможностях, которые это открывает: мы можем использовать простой советник и поместить всю логику вычислений в Excel, чтобы управлять им. Таким образом, советник может работать в полностью автоматизированном режиме, а его настройки или модификации не должны проходить через MQL5. Мы можем сделать это непосредственно в VBA. Это может показаться сложным или даже недостижимым, но если вы обладаете необходимыми знаниями и готовы учиться, то обнаружите, что сделать это довольно просто. Однако для этого необходимо учиться и посвятить себя этому делу.
Хорошо, но это приводит нас к другому вопросу. Система RTD - это не что иное, как сокет. Однако он настроен таким образом, что связь осуществляется только в одном направлении. Но благодаря знаниям, полученным в трех последних статьях о сокетах, мы начинаем понимать, что можем действовать более сложным способом. Опять же, мы будем использовать Excel только в образовательных целях. На самом деле, для этого же можно использовать любую программу, приложение или метод. Но прежде, чем мы покажем истинную причину для объяснения всех этих вещей, я хочу, чтобы вы поняли, какие возможности существуют для достижения тех же результатов, которые вы увидите ниже.
Но здесь мы сделаем кое-что более сложное. На самом деле, я думаю, многие люди даже не подозревают о чем, я собираюсь рассказывать. Тема очень интересная, хотя и очень обширная, поэтому я предлагаю вам ознакомиться с теми ссылками, которые я оставлю в конце статьи. Они будут очень полезны, потому что всё используемое здесь, ещё находится на стадии разработки. Но это не значит, что её не стоит изучать и осваивать.
Поскольку я не хочу (по крайней мере пока) добавлять DLL в код, сделанный на MQL5, здесь мы увидим нечто весьма любопытное. Мы будем идти шаг за шагом, постепенно представляя то, что будет сделано, чтобы вы могли понять, как мы заставим Excel взаимодействовать с MetaTrader 5.
И всё это без использования того, что было показано в статье "Моделирование рынка (Часть 06)": Перенос данных из MetaTrader 5 в Excel", хотя и работает, но не настолько гибкое и заставляет нас выполнять определенные действия, которые становятся ненужными при использовании сокетов. Поэтому конечной целью будет демонстрация того, как перенести данные из Excel в MetaTrader 5 и наоборот.
Начало использования Python в наших задачах
«Погодите-ка, разве мы не говорили, что будем использовать Excel? Я думал, что мы будем программировать непосредственно на VBA, но почему используется Python?» Успокойтесь, дорогие читатели. По сути, мы будем использовать Excel, но не будем программировать непосредственно на VBA. В некотором смысле мы могли бы использовать VBA для установления связи между Excel и MetaTrader 5, но если бы мы пошли по этому пути, то были бы ограничены возможностями вот этих двух программ. То есть, если мы захотим использовать другую программу вместо Excel, чтобы помочь MetaTrader 5 в его рыночных операциях, нам придется перестроить весь набор связей. Однако, если использовать Python в качестве промежуточного слоя, всё становится гораздо более гибким. Кроме того, на Python проще выполнять определенные задачи, что очень помогает нам, так как можно даже обойтись без Excel и делать всё на Python. Но это не то, что мы хотим сделать здесь. Я действительно хочу использовать Excel по причине, которую будет легче понять позже. Поэтому нам нужен Python. То, что мы собираемся сделать, можно увидеть ниже:

Прошу обратить внимание на следующее: В центре изображения находится Python, через него проходит вся информация. Однако наша цель - использование MetaTrader 5 вкупе с Excel. Однако, прошу заметить, что при установке Python в центре внимания, мы можем даже обойтись без Excel или использовать любое другое приложение.
Так почему же стоит использовать Python, а не C или C++? Причина этого - практичность. Нет смысла писать код на C или C++, если мы можем получить очень хорошие результаты гораздо более простым способом, используя Python. Это связано с тем, что Python продолжает развиваться, предлагая нам всё больше и больше практичности. Итак, мы будем использовать Python для осуществления сокетной связи с MetaTrader 5.
Теперь необходимо объяснить один момент. MetaTrader 5 позволяет выполнять непосредственно на графике скрипт, созданный на Python, если только мы настроим его на это. Данная конфигурация совсем не сложная. Напротив, всё предельно просто и понятно. Всё, что вам нужно сделать, - это скачать последнюю стабильную версию Python, установить её, а затем настроить в MetaEditor то, что выделено на изображении ниже:

Прошу заметить, что нам нужно указать только каталог, в котором находится исполняемый файл Python. На момент написания статьи наиболее стабильной версией является 3.11.3, хотя более новая версия, наверное, уже доступна. Последнюю версию можно загрузить с самого сайта: Python.org
После этого можно приступать к созданию скриптов на Python. Хотя существуют различные инструменты и редакторы, которые могут помочь нам в работе с кодом, на самом деле они нам не понадобятся. Можно использовать как сам MetaEditor, так и любой другой редактор. Однако, если вы действительно хотите, вы можете загрузить несколько инструментов, которые помогут вам в программировании, но мы не будем рекомендовать какой-то конкретный.
Возвращаясь к теме использования Python в MetaTrader 5, мы не будем этого делать. Впрочем, если вы так хотите, можете сделать это по своему усмотрению. Мы построим код взаимодействия на чистом MQL5, как это сделали в предыдущих статьях, и будем использовать Python для упрощения задачи создания сокета для Excel. Можно создать сокет прямо из VBA, но гораздо проще сделать это с помощью Python, особенно потому, что мы будем создавать серверную часть. В MQL5 мы не можем создать сервер, используя чистый MQL5.
Однако, есть одна важная деталь. Скачать и установить Python на свою операционную систему недостаточно, чтобы уметь им пользоваться, как показано на изображении выше, где изображена связь между Excel и MetaTrader 5 через Python. Нам понадобится дополнительный инструмент, установленный на нашем компьютере, помимо Excel, конечно. Именно данный дополнительный инструмент будет иметь решающее значение.
Знакомство с xlwings
Это дополнительный инструмент, который нам нужно будет включить в нашу работу. Это модуль, который позволяет запускать в Excel скрипты Python вместо VBA. Да, можно выполнять задачи непосредственно в Python внутри Excel вместо использования VBA. Однако VBA по-прежнему полезен, поскольку xlwings не заменяет его полностью, а просто расширяет возможности и позволяет нам делать многие вещи из Python.
Следует отметить, что существуют и другие модули, которые выполняют ту же функцию, что и xlwings. Да, они существуют, хотя в некоторых случаях они платные или требуют лицензии. С другой стороны, xlwings можно использовать в некоммерческих целях без дополнительной оплаты. Поэтому, учитывая, что вы часто обучаетесь и экспериментируете, не создавая ничего для коммерческого использования, xlwings станет отличной альтернативой в начале процесса, особенно потому, что он очень прост, как вы уже увидели.
Установка xlwings
В ссылках мы укажем, как можно получить доступ к документации, чтобы лучше понять то, как работает xlwings. Но чтобы упростить задачу, в данной статье мы расскажем вам, как действовать на этом первом этапе. Чтобы начать работу, нам нужно установить Python. Во время установки необходимо отметить опцию, которая показана на следующем изображении.

Если этого не сделать, то позже нам придется вручную добавить путь к Python в системные переменные Windows, чтобы всё работало более гладко. Если у вас уже есть опыт работы с Python, не надо добавлять переменную среды. Однако здесь я предположу, что у вас нет опыта работы с Python, так что мы будем действовать по стандартной схеме. Когда установка Python завершится,
появится окно, показанное на следующем изображении.

Если нажать на выделенную точку, можно будет использовать длинные названия. Это вопрос личных предпочтений. Некоторые люди не любят использовать длинные названия файлов; в этом случае просто нажмите кнопку Закрыть, и всё будет в порядке. Однако, если вы предпочитаете использовать названия, длиннее 256 символов (или 260 в случае Python), вам следует нажать на точку на изображении, чтобы Python мог распознать их без проблем.
После этого откройте командную строку. При желании можно использовать PowerShell, но лично я предпочитаю классическую CMD, она очень надежная. Первое, что я советую вам сделать в консоли, - это ввести данную команду.

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

Отлично, теперь, когда система обновлена, мы можем продолжить работу с xlwings. xlwings - это дополнение, которое подключается к Excel, хотя в документации вы увидите, что оно не обязательно зависит от него. В любом случае, мы будем действовать так, как на самом деле используем Excel. После установки на экране появится окно Excel, как видим ниже:

Прошу заметить, что на ленте опций (ribbon) Excel ничего не изменилось. Затем, вернувшись в командную строку или PowerShell, если вам так больше нравится, сможете вводить следующую команду, как показано ниже:

Как видите, данная команда загрузит xlwings и установит соответствующий пакет Python. Затем, когда мы снова проверим установленные пакеты, мы увидим результат, похожий на следующий:

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

Хорошо. Теперь мы готовы. Единственное, чего не хватает, - это интеграции xlwings с Excel. На этом этапе необходимо рассмотреть некоторые вопросы. Первый вопрос: действительно ли мы хотим запускать Python-приложения из Excel или просто заменить VBA на Python в Excel? Я говорю это потому, что если мы хотим создавать макросы для использования в Excel, написанные на Python, то нет необходимости добавлять в программу дополнение xlwings. Нам нужно будет выполнить всего одно небольшое действие при редактировании макроса, и таким образом мы сможем интегрировать VBA и Python в Excel.
Однако, если мы хотим запускать скрипты Python внутри Excel, рекомендуется добавить xlwings в качестве дополнения Excel. Это создаст раздел на ленте, который позволит нам запускать скрипт Python прямо из Excel, без каких-либо сложностей. Однако, чтобы всё работало правильно, потребуется некоторая настройка.
Всё это очень хорошо объясняется в документации xlwings, так что если у вас есть сомнения, проверьте там, как действовать дальше. В конце данной статьи я оставлю ссылки, чтобы вы могли сразу перейти к делу.
Но я сделаю следующее предположение: вы ещё ничего не знаете о xlwings и только начинаете изучать Python. Поэтому было бы идеально добавить xlwings в качестве дополнения для Excel и иметь возможность использовать его в макросах. Со временем вы сможете определить, какой подход работает у вас лучше всего.
Добавляем xlwings в Excel в качестве дополнения
Добавление xlwings в качестве дополнения не является одной из самых сложных задач. На самом деле всё очень просто. Сделать это можно двумя способами, не забывая о том, что мы используем стандартный пакет. Если вы более опытны, то можете настроить его по-другому.
Первый вариант - сделать это прямо из Excel и добавить xlwings в качестве дополнения. Это делается в самом Excel. Для этого нужно выбрать точку, указанную на рисунке ниже:

После этого отметьте следующую опцию:

Это добавит вкладку "Разработчик" на ленту. На вкладке "Разработчик" выберем элемент из рисунка ниже:

Откроется такое окно:

Вот дополнения, которые по умолчанию появляются при установке Excel. Чтобы добавить xlwings из этого окна, нажмем на кнопку Browser и перейдем по следующему пути:
C:\Users\{USERNAME}\AppData\Local\Programs\Python\Python311\Lib\site-packages\xlwings\addin
Помните, что данный путь соответствует стандартной установке Python. Значение {USERNAME} представляет собой имя пользователя Windows, под которым был установлен Python. В этом случае значение Python311 указывает на установленную версию языка. Поэтому важно точно знать, что делается во время установки программ. Если мы что-то изменим в процессе работы, эти значения могут быть другими. В любом случае, задача состоит в том, чтобы найти файл, показанный на следующем изображении:

После того, как эти файлы будут добавлены, мы сможем получить доступ к дополнению непосредственно с ленты Excel. Но я предпочитаю второй способ выполнения этого же действия, поскольку командная строка уже открыта. Всё, что нам нужно сделать, - это ввести следующую команду:

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

Прошу заметить, что в Excel появилась новая вкладка под названием xlwings. Отсюда можно запускать скрипты, созданные в Python. Однако, чтобы всё работало правильно, необходимо учесть некоторые детали. Опять же, ознакомьтесь с документацией xlwings, чтобы узнать, как это сделать, поскольку мы можем попытаться сделать что-то не так, как задумано в xlwings. В этом случае мы всегда будем получать сообщение об ошибке, даже если кажется, что всё работает идеально.
Но на самом деле важен другой момент. В этом случае нужно заставить скрипт Python работать так, как если бы он был макросом, написанным на VBA. Хотя, на мой взгляд, интереснее всего было бы совместить оба варианта, то есть использовать VBA вместе с Python, но это уже на ваше усмотрение. Цель данной статьи - просто представить решение проблемы. Проблема заключается в том, как легко передавать информацию между Excel и MetaTrader 5, и мы очень близки к её решению.
Следующее, что нам нужно сделать, связано с VBA. Чтобы всё было хорошо организовано, давайте перейдем к новой теме.
Интеграция Python с VBA
Существует несколько методов, чтобы использовать Python в коде VBA. Один из них - сделать вызов SHELL. Данный метод работает, но у него есть некоторые недостатки, которых нет при использовании xlwings или других подобных инструментов.
Пример вызова SHELL, который позволяет выполнять скрипт Python внутри кода VBA, показан ниже:
Sub CallPythonInVBA()
Dim vbaShell as Object
Set vbaShell = VBA.CreateObject("WScript.Shell")
vbaShell.Run """<PATH OF PYTHON>\python.exe""" & """<PATH OF SCRIPT>\Script.py"""
End Sub Макрос в VBA
Данный фрагмент позволяет VBA запускать скрипт Python. Но для этого нужно учесть, что значение <PATH OF PYTHON> должно указывать на местоположение исполняемого файла Python, а <PATH OF SCRIPT> - на правильный путь к выполняемому файлу, в данном случае имя файла - Script.py.
Нет особого смысла заниматься подобной работой, когда можно интегрировать Python непосредственно с VBA. Тот же самый код, показанный выше, можно заменить простой командной строкой, что имеет множество преимуществ. Одно из них - это то, что нам не нужно беспокоиться о том, где установлен Python. Ещё одно преимущество, о котором я не буду подробно рассказывать, поскольку оно выходит за рамки статьи, заключается в том, что сценарий Python может быть частью проекта, в котором Excel участвует с помощью кода VBA. Когда интеграция настроена, весь проект можно организовать в одной папке, а xlwings позаботится о маршрутизации и других связанных с ней вопросах, чтобы скрипт Python работал без проблем вместе с кодом VBA. Но, хотя это уже сказано, лучше вам ознакомиться с документацией, указанной в ссылках этой статьи.
Хорошо, но давайте вернемся к нашей теме. Когда мы открываем редактор VBA в Excel, мы видим следующее изображение:

Как видите, мы выделили один элемент на изображении. Этот выделенный пункт защищен паролем, но это не должно вызывать у нас никаких неудобств или беспокойства. Пароль для открытия данного файла можно получить из документации xlwings, которая доступна по ссылке в разделе "Ссылки". Я мог бы упомянуть об этом здесь, но я предпочитаю, чтобы вы обратились непосредственно к документации. В любом случае, здесь нам нужно указать VBA, чтобы он использовал xlwings. Для этого нужно добавить ссылку xlwings в код, который будет разрабатываться на VBA. Чтобы добавить такую ссылку, перейдем в следующее место.

Выбрав выделенный пункт на изображении выше, мы откроем следующее окно, показанное ниже:

Нужно отметить ссылку, указанную на изображении выше. Если вы НИКОГДА не видели и не использовали данное окно, то должны знать, что оно используется для указания VBA, какую ссылку использовать в качестве вспомогательной. Это происходит, когда VBA не может разрешить какую-то внутреннюю зависимость в коде. В этом случае VBA поищет среди доступных ссылок способ решения обнаруженного в коде вызова. Если не сможет решить проблему, VBA сообщит о ней как об ошибке. Поэтому многие люди часто ищут в Интернете код макроса VBA, а когда пытаются его запустить, не могут добиться результата. Это происходит именно из-за такой проблемы, когда VBA не может правильно определить ссылки.
В нашем случае одним из вызовов, который появится в коде VBA и который не является частью самого VBA, является RunPython. Если не отметить выделенную опцию на рисунке выше, то когда VBA встретит вызов RunPython, то сообщит об этом как об ошибке.
Поэтому не забывайте: каждый раз, когда вы создаете макрос или скрипт VBA, вызывающий код, написанный на Python, устанавливайте этот флаг в области ссылок. Таким образом, код будет работать правильно.
Заключительные идеи
В этой статье мы показали только процедуру, необходимую для того, чтобы скрипт, написанный на Python, запустился внутри Excel. Хотя это может показаться необычным или даже странным, такой вид интеграции открывает множество возможностей, главным образом потому, что многие задачи проще реализовать на Python, чем на VBA. Но, прежде всего, он позволяет создать практичный и универсальный метод передачи информации между Excel и MetaTrader 5. Даже если мы не используем Excel интенсивно и работаем только с Python, который напрямую связан с MetaTrader 5, достаточно лишь узнать сколько всего можно делать, и вам не захочется оставлять всё в руках только Python и MetaTrader 5. Вам понадобится Excel или другая программа для работы с электронными таблицами.
В следующей статье мы увидим, как на самом деле будет реализован код, обеспечивающий работу всего этого. Увидимся в следующей статье!
Ссылки
| Файл | Описание |
|---|---|
| Experts\Expert Advisor.mq5 | Демонстрирует взаимодействие между Chart Trade и советником (для взаимодействия требуется Mouse Study). |
| Indicators\Chart Trade.mq5 | Создает окно для настройки команды, которая будет отправлена (для взаимодействия требуется Mouse Study). |
| Indicators\Market Replay.mq5 | Создает элементы управления для взаимодействия с сервисом репликации/моделирования (для взаимодействия требуется Mouse Study) |
| Indicators\Mouse Study.mq5 | Обеспечивает взаимодействие между графическими элементами управления и пользователем (необходимо как для работы системы воспроизведения, так и на реальном рынке). |
| Servicios\Market Replay.mq5 | Создает и поддерживает сервис репликации/моделирования рынка (основной файл всей системы). |
| Код VS C++ Server.cpp | Создает и поддерживает сокет-сервер, разработанный на C++ (версия MiniChat). |
| Код на Python Server.py | Создание и поддержка сокета Python для связи между MetaTrader 5 и Excel. |
| ScriptsCheckSocket.mq5 | Позволяет проверить соединение с внешним сокетом. |
| Indicators\Mini Chat.mq5 | Позволяет реализовать мини-чат с помощью индикатора (для работы требуется сервер). |
| Experts\Mini Chat.mq5 | Позволяет реализовать мини-чат в советнике (для работы требуется использование сервера). |
Перевод с португальского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/pt/articles/12743
Предупреждение: все права на данные материалы принадлежат MetaQuotes Ltd. Полная или частичная перепечатка запрещена.
Данная статья написана пользователем сайта и отражает его личную точку зрения. Компания MetaQuotes Ltd не несет ответственности за достоверность представленной информации, а также за возможные последствия использования описанных решений, стратегий или рекомендаций.
Быстрая интеграция большой языковой модели и MetaTrader 5 (Часть I): Создаем модель
Создание самооптимизирующихся советников на MQL5 (Часть 6): Предотвращение стоп-аутов
Разработка динамического советника на нескольких парах (Часть 3): Стратегии возврата к среднему и моментума
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования