Моделирование рынка (Часть 16): Сокеты (X)
Введение
В предыдущей статье, "Моделирование рынка (Часть 15): Сокеты (IX)", мы объяснили и показали часть кода сервера, который будет написан на Python. Однако, одного этого кода недостаточно, чтобы использовать систему связи между MetaTrader 5 и Excel. Нам нужно больше элементов в дополнение к тем, что были показаны в этой статье. Многие могли бы реализовать решение целиком прямо в этом Python-коде, и они бы не ошиблись. Если бы мы так поступили, то ограничились бы полностью закрытой системой. Иными словами, мы не сможем приспособиться к выполнению определенных действий или охватить более конкретные скрипты. Однако, разделив систему на части, мы можем реализовать это более гибко. Таким образом, мы можем использовать всё лучшее, что может предложить каждый язык или программа.
Вы, наверное, думаете, что это глупо. Но учтите, что мы всего лишь демонстрируем, что с MetaTrader 5 можно работать совершенно неизведанным способом. Так же, как мы показываем способы использования Excel, мы могли бы использовать любую другую программу. Кроме того, мы можем создать свой собственный метод с помощью программ, разработанных исключительно для этой цели, чтобы иметь конкретную аналитическую и операционную модель для определенного типа работы. Таким образом, MetaTrader 5 будет только передавать ордеры между тем, что мы создадим, и рынком, что позволит избежать всей работы, связанной с разработкой торговой платформы.
Поэтому можно считать, что все объяснения гораздо шире, чем то, что мы здесь показываем. Чтобы заниматься такими вещами, нужно много знать и изучать. Но если вы действительно хотите, чтобы нечто подобное появилось в реальности, можно рассмотреть эти статьи как небольшой пример того, что мы можем сделать. Но всё это не будет иметь никакого реального смысла, пока мы не увидим, что ещё нужно реализовать, чтобы сделать сервер Python действительно полезным. Поэтому в данной статье мы рассмотрим часть, которую нужно реализовать на VBA, входящем в состав Excel.
Начало работы в Excel
Код, который нужно реализовать на VBA, не сложен. На самом деле, многое из того, что будет показано, уже делают те, кто пишет скрипты на VBA. Но есть пара моментов, которые могут быть более или менее сложными, по крайней мере, для некоторых. Однако мы хотели бы подчеркнуть, что здесь всё устроено максимально просто и образовательно. Кроме того, приведенный в предыдущей статье код, останется неизменным. Всё, что нужно сделать, - это создать элементы в VBA для выполнения соответствующих нужд или настроек в зависимости от того, что вы собираетесь сделать.
Для начала давайте посмотрим на интерфейс Excel. Мы можем увидеть это ниже:

Если вы знаете, как пользоваться Excel, то должны были заметить, что на изображении выше кнопки представляют собой фигуры (shapes). Они позволяют создать интерфейс с закругленными углами. Однако их работа мало чем отличается от обычных элементов управления, так как их можно связать с макросом. Поэтому при нажатии на одну из этих фигур, Excel интерпретирует это как взаимодействие с обычной кнопкой и делает соответствующий вызов для выполнения макроса, связанного с событием щелчка на этой фигуре или кнопке.
В действительности то, что нас интересует при рассматривании исключительно интерфейса, показанного на изображении, - это содержимое ячеек. Прошу заметить, что в ячейке B2 есть информация, указывающая на то, что сервер находится в автономном режиме. Аналогично, в ячейке B5 находится ещё некоторая информация, которая в данном случае указывает на название символа, по которому мы хотим получить информацию от MetaTrader 5. Именно в данный момент идея начинает обретать форму. Даже если мы ещё не знаем, что будет запрограммировано на MQL5, мы уже можем получить представление о том, что нам нужно и что мы можем сделать.
Помните, что в объяснении кода сервера мы упоминали, что он будет захватывать информацию из ячейки и отправлять её в MetaTrader 5, чтобы получить некоторые данные? Именно в этой ячейке, где у нас есть значение WDON23, мы и должны действовать. Однако, если мы собираемся вручную изменить информацию в данной ячейке, мы должны сначала остановить сервер, изменить значение ячейки B5, а затем снова запустить сервер. После этого MetaTrader 5 получит новые параметры, чтобы проанализировать их.
Такие изменения довольно просты и их можно сделать в любое время, при этом сервер никогда не узнает о происходящем, поскольку всё будет происходить между MetaTrader 5 и Excel. Но, как уже говорилось ранее и я снова повторяю это, идея здесь в том,чтобы быть дидактическим. Однако ничто не мешает нам создать собственный протокол, чтобы получить больше информации или доступ к другим символам. Всё, что нужно сделать, - это поместить данные в определенную ячейку Excel. Но вы можете спросить себя: «почему именно эта клетка? Почему бы не использовать другую?» Суть в том, что в коде сервера используется индекс, и в зависимости от этого индекса используется ячейка B5. Однако в этой статье мы покажем, как можно использовать другую ячейку без необходимости изменять код на стороне сервера, показанного в предыдущей статье.
Если вы поняли это, мы можем переходить к следующему этапу. Давайте теперь посмотрим, как всё будет сделано в VBA.
Начнем работу над кодом в VBA
Чтобы запустить что-то действительно полезное и чтобы пользователь не понял, что происходит за кулисами, нам придется кое-что сделать на VBA. Поэтому первое, что нужно сделать, - это создать модуль. Цель данного модуля - разместить весь код, который необходимо реализовать и который не поместился бы в другом месте. Первую вещь, которую нужно реализовать в виде кода, можно увидеть чуть ниже:
01. Private Const szMSG_START_SERVER As String = "Start Server" 02. Private Const szMSG_STOP_SERVER As String = "Stop Server" 03. Private Const szSERVER_SHUTDOWN As String = """/Force Server ShutDown""" 04. Private Const szMSG_MT5_OFFLINE As String = "MetaTrader 5 is offline." 05. Private Const szMSG_MT5_ONLINE As String = "MetaTrader 5 is online." 06. Private Const szMSG_MT5_BUY As String = """Buy in Market >""" 07. Private Const szMSG_MT5_SELL As String = """Sell in Market >""" 08. Private Const iPort As Integer = 9090 09. Private gl_ServerInExec As Boolean 10. Public Const CELL_MT5 As String = "$B$4" 11. 12. Public Sub SwapStatusMT5() 13. Dim c1, c2, c3 As Long 14. 15. If Sheets("System").Range(CELL_MT5).Value = szMSG_MT5_ONLINE Then 16. c1 = RGB(217, 238, 16) 17. c2 = RGB(51, 153, 102) 18. c3 = RGB(255, 80, 80) 19. Else 20. c1 = RGB(132, 130, 122) 21. c2 = c1 22. c3 = c1 23. End If 24. With Sheets("System") 25. .Shapes("Btn_MT5").Fill.ForeColor.RGB = c1 26. .Shapes("Btn_BUY").Fill.ForeColor.RGB = c2 27. .Shapes("Btn_SELL").Fill.ForeColor.RGB = c3 28. End With 29. End Sub 30. 31. Private Sub SwapMsgBtnServer(text As String) 32. Dim c As Long 33. If text = szMSG_START_SERVER Then 34. c = RGB(213, 87, 99) 35. gl_ServerInExec = False 36. Else 37. c = RGB(84, 130, 53) 38. gl_ServerInExec = True 39. SwapStatusMT5 40. End If 41. With Sheets("System").Shapes("Btn_Server") 42. .TextFrame2.TextRange.text = text 43. .Fill.ForeColor.RGB = c 44. End With 45. End Sub 46. 47. Public Sub BtnServer_Click() 48. If gl_ServerInExec Then 49. StopServer 50. Else 51. InitServer 52. End If 53. End Sub 54. 55. Public Sub InitServer() 56. Dim szScript, szCmd As String 57. 58. szScript = Chr$(34) & Application.ActiveWorkbook.Path & "\Server.py" & Chr$(34) 59. szCmd = " ""127.0.0.1""" & Str(iPort) & " ""System"" ""B$2""" 60. VBA.CreateObject("WScript.shell").Run """Python""" & szScript & szCmd, vbHide 61. SwapMsgBtnServer szMSG_STOP_SERVER 62. End Sub 63. 64. Public Sub StopServer() 65. szPath = Chr$(34) + Application.ActiveWorkbook.Path + "\MsgFromExcel.py" + Chr$(34) 66. VBA.CreateObject("WScript.shell").Run """Python""" & szPath & " " & Str(iPort) & " " & szSERVER_SHUTDOWN, vbHide, True 67. SwapMsgBtnServer szMSG_START_SERVER 68. End Sub 69. 70. Public Sub MT5_BuyInMarket() 71. szPath = Chr$(34) + Application.ActiveWorkbook.Path + "\MsgFromExcel.py" + Chr$(34) 72. VBA.CreateObject("WScript.shell").Run """Python""" & szPath & " " & Str(iPort) & " " & szMSG_MT5_BUY, vbHide, True 73. End Sub 74. 75. Public Sub MT5_SellInMarket() 76. szPath = Chr$(34) + Application.ActiveWorkbook.Path + "\MsgFromExcel.py" + Chr$(34) 77. VBA.CreateObject("WScript.shell").Run """Python""" & szPath & " " & Str(iPort) & " " & szMSG_MT5_SELL, vbHide, True 78. End Sub
Исходный код на VBA
Этот модуль содержит всё, что нам понадобится в дальнейшем. Как видите, здесь объявлены несколько констант и несколько процедур. Константы помогают нам быстрее исправить код. Каждая процедура имеет свой смысл, и все они важны в рамках общего кода. Обратите внимание на детали, чтобы правильно модифицировать этот модуль в VBA.
Для начала давайте рассмотрим строку 55. На самом деле мы не будем следовать процессу обычным образом. Мы рассмотрим функции и процедуры в зависимости от их важности для того, чтобы Excel мог управлять сервером в Python. В строке 55 находится процедура, которая запускает сервер. Прошу заметить, что скрипт на Python должен находиться в той же папке, что и файл Excel. Это происходит так, потому что в строке 58 мы захватываем с помощью VBA каталог, в котором находится файл Excel. Таким образом, мы строим полный путь вместе с именем скрипта на Python.
Теперь в строке 59 мы объявляем параметры, которые будут переданы скрипту. Чтобы правильно понять данную строку, вернитесь к предыдущей статье и ознакомьтесь с правильным порядком параметров, которые должен получать скрипт. Строка 60 - это место, где происходит волшебство, так как в этой строке вызывается и запускается скрипт на Python. Но тогда возникает главная проблема: эта строка не ждет возврата кода, то есть VBA вызывает серверный скрипт и выполняет его так, как будто это отдельный поток. Прошу заметить, что это не буквальное утверждение, а наблюдение. Если посмотреть в диспетчер задач, то вы увидите, что скрипт на Python появится в том же блоке, что и приложение Excel. Это можно увидеть на следующем изображении:

Такое поведение указывает на то, что при закрытии Excel скрипт на Python также будет закрыт. Если в диспетчере задач будем наблюдать, что скрипт находится вне блока приложения Excel, то при закрытии Excel скрипт продолжит выполняться, и его придется закрывать вручную. В конце процедуры в строке 61 мы вызываем процедуру строки 31. В данной процедуре мы вносим изменения в объект, представляющий кнопку, которая запускает и завершает работу сервера. Поскольку данная процедура довольно проста и напрямую связана с фигурой, комментировать больше нечего.
Однако обратите внимание на следующее: ни эта процедура в строке 31, ни процедура в строке 55 не связаны напрямую с фигурой, запускающей или останавливающей сервер. На самом деле эту задачу выполняет другая процедура в строке 47. Поэтому кнопка запуска/остановки сервера будет выполнять процедуру BtnServer_Click. Таким образом, мы получим простой и эффективный контроль над тем, что будет отображаться в Excel. Однако объяснение этой части было только началом; в рамках этого модуля предстоит разобраться ещё с четырьмя процедурами.
Давайте теперь продолжим разбираться, с чем связана фигура кнопки управления сервером. Прошу заметить, что в процедуре BtnServer_Click, помимо вызова запуска сервера, есть также вызов его завершения. Он находится в строке 49 и ссылается к строке 64. В данной процедуре StopServer мы действуем немного по-другому. Почему так? Причина в том, что, если изучить взаимодействие Excel и Python, мы увидим, что существуют способы чтения, выполнения или записи с помощью Python процедур или переменных, объявленных в VBA. Затем мы можем просто записать в VBA переменную, указывающую на то, что сервер должен быть завершен. Таким образом, когда скрипт на Python обращается к этой переменной, он узнает, что сервер нужно остановить.
Однако так же, как мы можем разместить сервер на том же хосте, что и Excel, мы можем сделать это, разместив оба сервера на разных машинах. А связь будет осуществляться через сокеты. Поэтому мы используем несколько иную процедуру. В строке 65 мы указываем, где находится скрипт на Python, который будет отправлять сообщение на сервер. Это сообщение на самом деле является командой. В строке 66 находится информация о команде, которую нужно передать серверу. Пока что не стоит беспокоиться об этом скрипте на Python; мы рассмотрим его позже, ближе к концу статьи.
Следующая процедура, расположенная в строке 70, предназначена для отправки запроса в MetaTrader 5, также как и процедура в строке 75. Обе они должны быть связаны с соответствующими кнопками, чтобы пользователь мог взаимодействовать с ними непосредственно из Excel. Но, если вы заметили, и процедура StopServer, и процедуры MT5_BuyInMarket и MT5_SellInMarket используют один и тот же скрипт на Python. Однако, в отличие от StopServer, который уже является полностью функциональной процедурой, процедуры MT5_BuyInMarket и MT5_SellInMarket на самом деле ещё не доработаны. Причина в том, что эти процедуры проводятся исключительно в образовательных целях, то есть они не делают абсолютно ничего, просто выводят сообщение в терминале MetaTrader 5, но об этом мы поговорим в следующей статье.
Для того, чтобы две эти процедуры работали, необходимо реализовать протокол связи, который сообщает MetaTrader 5 информацию о символе и определяет такие аспекты, как стоп-лосс и тейк-профит позиции. Думаю, что для большинства энтузиастов это будет довольно интересная задача и станет даже личным вызовом. Но реализовать её совсем несложно. Можно будет только указать VBA, как создать сообщение, которое может интерпретировать MetaTrader 5, чтобы сделки можно было заключать непосредственно с этой платформы. В следующей статье расскажем об этом процессе более подробно. Пока что не беспокойтесь об этом.
Для завершения этого модуля, в строке 12 есть ещё одна процедура. Цель данной процедуры - убедиться, что кнопки взаимодействия и управления Excel соответствуют текущему состоянию MetaTrader 5. Другими словами, когда MetaTrader 5 находится в оффлайне, кнопки взаимодействия будут серыми, а когда в онлайне - цветными. Таким образом, пользователь будет знать, когда он может отправлять команды в MetaTrader 5.
Итак, мы и завершили изучение части модуля, посвященной VBA. Но это не значит, что мы закончили программирование основных элементов в Excel. Нам ещё предстоит проделать определенную работу по улучшению поддержки и взаимодействия. Следующее действие, которое необходимо выполнить, показано ниже:

А чтобы не было сомнений в том, какой код нужно использовать, чуть ниже приведен тот же код, что и на картинке:
1. Private Sub Worksheet_Change(ByVal Target As Range) 2. If Target.Address = CELL_MT5 Then 3. SwapStatusMT5 4. End If 5. End Sub
Исходный код на VBA
Но что именно делает код? Если вы ещё не знакомы с программированием на VBA, и особенно если вы не привыкли создавать код для Excel, это может вас несколько озадачить. Однако данный код просто настраивает состояние кнопок, которые отправляют команды в MetaTrader 5. Для этого значение ячейки, определяемое сервером, постоянно проверяется. Когда значение данной ячейки по какой-либо причине изменяется, вызывается третья строка. При этом цвета кнопок будут автоматически меняться в зависимости от состояния MetaTrader 5 по отношению к серверу.
Таким образом, ни вам, ни конечному пользователю не придется читать содержимое конкретной ячейки; можно просто посмотреть на цвет кнопок, чтобы понять, находится ли MetaTrader 5 в режиме онлайн или оффлайн. Важный момент, особенно для тех, кто не знает, как выполнять подобные задачи в Excel: посмотрите на изображение выше, чтобы понять, на каком листе нужно разместить код, чтобы он выполнил свою работу. Если помещать этот же код не на тот лист, мы не получим ожидаемого результата. Поэтому обратите внимание на эту деталь.
Как мы уже делали, есть ещё одна задача, которую также необходимо решить. Точно так же, как нужно было следить за тем, куда поместить код, здесь его тоже надо поместить в определенное место. Поэтому необходимо вставить следующий код, как показано ниже:

Если вы сомневаетесь в том, что именно нужно туда поместить, посмотрите тот же код, что и на картинке выше.
1. Private Sub Workbook_BeforeClose(Cancel As Boolean) 2. ThisWorkbook.Save 3. StopServer 4. End Sub 5. 6. Private Sub Workbook_Open() 7. InitServer 8. End Sub
Исходный код на VBA
Этот вариант ещё проще, поскольку у нас всего два довольно простых обработчика событий. Первая, Workbook_BeforeClose, будет вызываться, когда пользователь попросит закрыть книгу на Excel. Когда это произойдет, произойдут два действия. Первое можно увидеть в строке 02, где Excel получает указание сохранить книгу. Таким образом, даже если мы внесли изменения в книгу, Excel не будет запрашивать у нас подтверждения для её сохранения, поскольку она будет сохранена автоматически при закрытии программы. Второе действие показано в строке 03, где мы вызываем процедуру, показанную в модуле. Наша с вами цель - завершить сервер.
Хорошо, в строке 06 у нас есть кое-что ещё проще. В данной строке, где у нас находится обработчик события Workbook_Open, мы просто делаем в строке 07 вызов процедуры модуля, которая запускает сервер. Этот вызов Workbook_Open будет выполнен, когда книга будет открыта в Excel. Таким образом, когда вы или конечный пользователь попросите открыть её, она автоматически запустит сервер, который будет ожидать начала приема данных от MetaTrader 5.
Всё это работает идеально. Можно создать сервер на Python с точно таким же кодом, как показано в предыдущей статье, создать простую электронную таблицу, добавить несколько кнопок или фигур для взаимодействия и, конечно, убедиться, что имена фигур, которые будут использоваться в коде на VBA, точно такие же. После этого можно протестировать систему. Вы увидите, что можно инициализировать сервер без каких-либо проблем. Но кое-чего всё же не хватает: кода взаимодействия Excel с сервером на Python.
Если вы проследили за всем объяснением, то заметили, что нам нужен ещё один код Python. Данный файл должен называться MsgFromExcel.py. Чтобы закончить эту часть курса Excel и VBA, мы должны рассмотреть последний скрипт. Не надо отчаиваться и думать, что вы ничего не понимаете, давайте остановимся и немного подумаем.
Когда Excel запускается, вызывается процедура Workbook_Open. При этом будет вызвана процедура InitServer, которая присутствует в модуле VBA. Данная процедура будет искать файл Server.py в той же папке, где находится книга. Это серверный скрипт на Python, который можно увидеть в предыдущей статье. Когда эта часть будет завершена, Excel будет реагировать на команды и действия пользователя обычным образом.
Если мы попытаемся запустить систему, а сервер не запускается, вернемся назад и повторим шаги, которые только что объяснили. Это связано с тем, что сервер должен запускаться автоматически. Если нет, надо найти ошибку в своем коде, прежде чем продолжать.
Следующий этап наступает, когда мы завершаем работу над сервером. Это происходит, когда мы запрашиваем закрытие приложения Excel или выполняем действие, вызывающее процедуру StopServer. При выполнении любого из этих действий выполняется строка 65 из модуля. Пока что вы не видели код, который запускается в этот момент. Чтобы поддержать ваш интерес и сохранить порядок, мы рассмотрим это в другой теме.
Клиент для Excel
Да, это именно то, что вы прочитали. Скрипт MsgFromExcel.py на самом деле является клиентом, и он будет взаимодействовать с сервером, который также был открыт, и останется активным в сеансе Excel. Для простоты понимания код файла приведен ниже:
01. import socket as sock 02. import sys 03. 04. if sys.argv[2]: 05. conn = sock.socket(sock.AF_INET, sock.SOCK_STREAM) 06. try: 07. msg = '<mt5 with excel>:' + sys.argv[2] 08. conn.connect(('localhost', int(sys.argv[1]))) 09. conn.send(msg.encode()) 10. conn.close() 11. except: 12. sys.exit(1)
Исходный код Python
Если у вас есть некоторый опыт работы с Python, то, анализируя данный код, вы наверняка уже заметили кое-что и подумали следующее: «Но это клиент, который открывается, отправляет что-то, а затем закрывает соединение. Какой в этом смысл?». Действительно, приведенный выше код - это TCP-клиент на Python, который делает именно это. Он открывается, отправляет некую информацию на сервер, а затем закрывает соединение, готовый к повторному вызову.
Причина в том, что этому клиенту не нужно всё время оставаться подключенным к серверу. В отличие от клиента в MQL5, который работает на MetaTrader 5, он предназначен только для отправки какой-либо команды на сервер, либо для выполнения чего-то, либо для отправки информации. Таким образом, можно видеть, как один и тот же код вызывается из процедур StopServer, MT5_BuyInMarket и MT5_SellInMarket. Идея заключается в том, чтобы он выполнил действие, которое мы не смогли бы выполнить, если бы сервер и Excel находились на разных машинах.
Поэтому в данном скрипте принимаются два параметра. Первый указывает на порт, который будет использоваться, а второй - это команда или сообщение, которое сервер выполнит или передаст в MetaTrader 5. Как только это будет сделано, можно будет закрыть соединение, которое только что открыл этот клиент.
На этом этапе я хотел бы прокомментировать несколько моментов, которые могут быть важными и даже вызывать сомнения. Если вы только начинаете программировать на Python или VBA и вам показались интересными данные материалы, я хочу, чтобы вы знали, что это всего лишь дидактический способ, который я нашел для себя. Многое из того, что сделано здесь, можно улучшить, причем существенно. В основном потому, что мы не делали и не включали в код много проверок. Но хочу подчеркнуть, что этот конкретный клиент, созданный на Python, можно легко преобразовать в код VBA.
Поэтому единственным модулем, который будет на Python, будет тот, который создает сервер. Однако, поскольку код на Python значительно проще и понятнее, чем реализация того же клиента на VBA, мы решили оставить код на Python. Но если вы хотите попробовать сделать то же самое с помощью VBA, будьте внимательны, потому что процесс выполнения того же самого, что и здесь, но посредством VBA, оказывается более сложным.
Заключительные идеи
Хотя в этой статье мы ещё не закончили объяснять, как наладить связь между Excel и MetaTrader 5, Мы близки к завершению данного испытания. Однако, прежде чем приступить, я хочу, чтобы вы попытались понять эти две статьи, данную и предыдущую. Так вы действительно поймете следующую статью, в которой я рассмотрю исключительно ту часть, которая касается программирования на MQL5. Но я также постараюсь сделать её понятной. Если вы не понимаете эти две последние статьи, то вам будет тяжело понять и следующую, потому что материалы накапливаются. Чем больше вещей нужно сделать, тем больше нужно создать и понять для достижения цели.
Я надеюсь, что к тому времени, когда вы попытаетесь прочитать и применить на практике то, о чем пойдет речь в следующей статье, вы уже будете понимать и применять на практике то, что видели до этого момента. Если вы сомневаетесь, я вам рекомендую изучить предыдущие статьи, потому что, как мы уже говорили в начале, тема сокетов довольно плотная и имеет множество деталей. Некоторые из них более простые, а некоторые - довольно сложные. Тем не менее, очень важно разобраться в этом вопросе, чтобы знать, что может возникнуть в будущем.
И хотя вы можете подумать, что вопрос сокетов не относится к системе репликации/моделирования, я хочу, чтобы вы пересмотрели эту идею. Если вы когда-нибудь захотите создать систему репликации/моделирования, который не будет зависеть от чего-то, работающего внутри MetaTrader 5, как это было сделано до настоящего момента, вам нужно будет понять, как работают сокеты. Таким образом, вы сможете моделировать всё нужное не так, как я показал, а смоделировать торговый сервер и просто сказать MetaTrader 5 подключиться к тому серверу, который вы сами будете эмулировать.
Но поскольку наша цель состоит в ином, мы обсудим данные вопросы в другой раз. Увидимся в следующей статье!
| Файл | Описание |
|---|---|
| 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++ (версия мини-чата). |
| Код на 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/12828
Предупреждение: все права на данные материалы принадлежат MetaQuotes Ltd. Полная или частичная перепечатка запрещена.
Данная статья написана пользователем сайта и отражает его личную точку зрения. Компания MetaQuotes Ltd не несет ответственности за достоверность представленной информации, а также за возможные последствия использования описанных решений, стратегий или рекомендаций.
Знакомство с языком MQL5 (Часть 14): Руководство для начинающих по созданию пользовательских индикаторов (III)
Нейросети в трейдинге: Пространственно-временная модель состояния для анализа финансовых данных (E-STMFlow)
Алгоритм дифференциального поиска — Differential Search Algorithm (DSA)
Python + API LLM + MetaTrader 5: реальный опыт построения автономного торгового бота
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования