Español Português
preview
Моделирование рынка (Часть 11): Сокеты (V)

Моделирование рынка (Часть 11): Сокеты (V)

MetaTrader 5Примеры |
145 0
Daniel Jose
Daniel Jose

Введение

В предыдущей статье, "Моделирование рынка (Часть 10): Сокеты (IV)", мы рассказывали о xlwings и его возможности интегрировать Python с Excel. Хорошо, хотя всё это может показаться очень далеким и неприменимым для нас здесь, в системе репликации/моделирования. И прежде, чем вы нахмуритесь, глядя на интеграцию Python и Excel, давайте посмотрим, как с помощью xlwings можно (в некоторой степени) управлять MetaTrader 5 через Excel. То, что мы покажем здесь, будет в основном сконцентрировано на образовательных задачах. Но не думайте, что мы можем делать только то, что будет рассмотрено здесь. Мы можем сделать гораздо больше. Однако вам нужно будет изучить, как xlwings заставляет Excel работать через Python. Это единственный способ получить полный контроль над MetaTrader 5 из Excel, даже без использования Excel. Таким образом, вы сможете управлять MetaTrader 5 из Python.


Начинаем с основ

Для начала нам нужно сделать кое-что очень простое. Это действительно должно работать. Начнем с примера из документации xlwings, но объясним его по-другому. Тогда вы поймете, почему мы можем запускать Python внутри Excel.

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

Прошу заметить на некоторые детали на изображении, например, где мы сохраняем файл. Но самое главное - это название файла. Это имя будет очень важно в дальнейшем. Теперь обратите внимание, что этот скрипт Python ссылается на что-то. В данном случае мы имеем в виду электронную таблицу Excel. Но какой именно лист? Спокойно, давайте шаг за шагом. До того, как мы выясним, какой это лист, прошу заметить, что в строке 05 мы напишем текст в определенной ячейке.

Но чтобы код работал, электронная таблица должна быть открыта в сессии Excel. Это связано со строкой 04. Именно она устанавливает связь, чтобы знать, на какой странице мы будем писать текст. Затем сделаем следующее: откроем Excel и добавим новый лист, чтобы Excel выглядел так, как показано на рисунке ниже:

А теперь внимание. В настоящее время мы можем выбрать один или несколько листов в Excel. Зачем мы делаем это? Причина в том, что мы собираемся создать макрос, который будет активироваться при выборе листа Sheet1. Таким образом, для вызова макроса нам не придется добавлять дополнительные элементы. Просто нажмем ALT + F11, чтобы открыть Excel VBA, и введем код, показанный на рисунке ниже:

Обратите внимание, что код принадлежит Sheet1. Как только активируем это, будет выполнен этот небольшой скрипт VBA. Теперь посмотрим на строку 03 из кода. Чтобы данная строка обработалась правильно, необходимо указать ссылку на xlwings. В предыдущей статье мы рассказали, как это сделать. После обращения к xlwings мы можем запустить скрипт Python. Но каким образом?

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

Теперь, чтобы VBA, а точнее xlwings, знал, какая часть Python-скрипта будет выполнена, мы сообщаем ему об этом после точки с запятой. Затем вернемся в Excel и переключаемся на другой лист. Когда мы это сделаем, результат будет таким, как показано на изображении ниже:

Идеально. Вы только что увидели, как Python может выполнять задачи внутри Excel, заменяя большую часть VBA. Я говорю "большая часть", потому что нам всё равно придется выполнить некоторые действия в VBA для Python, чтобы выполнить то, что вы запрограммировали в скрипте.

Но какое отношение это имеет к MetaTrader 5? Будьте спокойны, мы уже подходим к объяснению. Если вы не знакомы с Python, вам может показаться, что то, что мы сделали секунду назад, - глупость. Однако, если вы уже изучаете (или даже программируете) на Python, ваши глаза наверняка загорелись, когда вы представили, какие возможности открыло перед нами это простое "Hello, world".

Хорошо, если мы умеем писать, мы можем и читать. Помните, я говорил, что, хотя мы можем использовать RTD или DDE-сервер для передачи данных в Excel, это будет простой тратой времени? Информация будет направляться только в Excel, и мы не сможем использовать расчеты, сделанные в Excel, для управления MetaTrader 5.

Раз мы можем использовать Python для записи и чтения данных непосредственно в Excel, тогда мы можем начать думать немного дальше. Это позволяет управлять советником из Excel, для чего нужно лишь создать форму связи между Excel и MetaTrader 5. Но если мы не хотим использовать Excel, мы можем сделать то же самое с помощью Python.

Но некоторые трейдеры даже не смотрят на график. Они работают только на основе цены. И как лучше всего анализировать фундаментальные показатели? Именно этим, дорогой читатель: электронной таблицей Excel. Но не только Excel, но и другие инструменты необходимы наряду с ним. Однако в данном случае мы сосредоточимся на основах, поскольку идея состоит в том, чтобы показать, как сделать что-то ещё, что мы создадим в другой раз.


Планируем связь между Excel и MetaTrader 5

Чтобы установить связь между Excel и MetaTrader 5, нам нужен эффективный и простой в реализации метод. Один из лучших способов сделать это - использование сокетов. Это связано с тем, что сокет позволяет использовать Excel на одном компьютере, а MetaTrader 5 - на другом, а также позволяет использовать их на одном и том же устройстве. Способ выбора данных настроек должен контролироваться трейдером. То есть, если человек хочет оставить один компьютер для MetaTrader 5, а другой - для Excel, сокеты позволят это сделать. И даже если трейдер захочет использовать обе программы на одной машине, это будет сделано без необходимости менять протокол связи. Одним словом, сокеты - это очень практичный инструмент.

Хорошо, но как мы это сделаем? Это вопрос личного выбора. Но поскольку мы показываем, как Python используется в Excel, а мы уже знаем, что скрипты Python можно использовать в MetaTrader 5, это открывает множество возможностей. Главная из них - создание Python-сервера, который мы сможем использовать как в MetaTrader 5, так и в Excel. Однако прежде, чем это сделать, давайте немного подумаем. Python нам позволит считывать и записывать значения непосредственно в электронную таблицу. Но, как мы уже объясняли, в идеале это следует делать через сокеты. Поэтому для запуска клиента нам нужен MetaTrader 5 или Excel. На данный момент ясно, что если мы создадим сервер, работающий на MetaTrader 5, то нам нужно будет запрограммировать клиента в Excel. Однако MQL5 позволяет создать клиент для работы непосредственно с советником очень простым способом.

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


Создаем эхо-сервер

Поскольку это самый простой серверный код, не стоит ожидать от него слишком многого. Идея заключается в том, чтобы проверить, как Excel будет работать с сервером, написанным на Python. Давайте посмотрим, что нужно сделать. Сначала мы создадим код сервера на языке Python. Его можно увидеть ниже:

01. import socket
02. import xlwings as xw
03. 
04. def Echo():
05.         wb = xw.Book.caller()
06.         server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
07.         server.bind(("127.0.0.1", 27015))
08.         wb.sheets[0]['A1'].value = "Waiting connection..."
09.         server.listen(1)
10.         client, addr = server.accept()
11.         client.send("Wellcome to Server in Python\n\r".encode())
12.         wb.sheets[0]['A2'].value = str(f"Client connected by {addr}")
13.         while True:
14.             info = client.recv(512)
15.             if not info:
16.                 break
17.             client.send(b"Echo Server:" + info)
18.         wb.sheets[0]['A3'].value = "Client disconnected"
19.         client.close()

Скрипт на Python

«Но разве это всё?» Так и есть, но с одним маленьким замечанием. Данный код предназначен для взаимодействия с Excel и создания отчетов о том, что делается на сервере. Если вы уже разбираетесь в Python, этот код даже не вызовет у вас особого восторга. Но если вы понятия не имеете, что происходит, давайте посмотрим, что делает скрипт на Python.

В строках 01 и 02 мы сообщаем Python, какие модули нам нужны. В строке 04 мы начали построение процедуры. Она будет использоваться позже в VBA. Но сначала давайте разберемся с данной частью на языке Python. В строке 05 мы, скажем так, подключаемся к Excel. В строках 08, 12 и 18 мы помещаем статус выполнения в таблицу Excel, как мы делали это в предыдущей теме.

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

Ещё одна деталь, и, возможно, даже более важная, находится в строке 07. Прошу заметить, что у нас там указано значение. Данное значение в формате IPv4 указывает, что будет приниматься только соединение от клиента с указанным адресом. В этом случае оно относится к локальному хосту. То есть и клиент, и сервер должны находиться на одном компьютере. Неважно, физический он или виртуальный, главное, чтобы оба были в «одной команде».

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

Хорошо, но что если мы хотим охватить гораздо большее количество клиентов? Как нам поступить? В данном случае необходимо будет добавить соединения в поток, точно так же, как мы это делали в коде на C++. Однако в Python всё ещё проще. Но для наших целей в этом нет необходимости. Нам будет достаточно того факта, что этот сервер принимает соединение и передает эхо.

Теперь, когда у нас есть код сервера на Python, мы можем сделать то же самое, что делали в предыдущей теме. «То есть, использовать функцию RunPython для запуска сервера, верно?» Верно. Но давайте внесем небольшое изменение в код VBA из предыдущей темы. Код VBA будет выглядеть так:

1. Private Sub Worksheet_Activate()
2.     MsgBox "Call Server..."
3.     RunPython "import Server_Echo; Server_Echo.Test()"
4. End Sub

Скрипт VBA

Простота данного кода поражает. Обратите внимание, что в строке 03 мы изменили только название файла и название вызываемой процедуры. Деталь находится в строке 02. Данная строка нужна для того, чтобы вы видели, когда сервер попытается быть вызванным снова. Попробуем переключиться на другой лист, чтобы активировать сервер. При повторной попытке создания Python выдаст предупреждение об ошибке. Но это не ошибка сама по себе. Дело в том, что данный код не проверяет, активен ли сервер. Нечто подобное произойдет, если два клиента попытаются подключиться в одной сессии. Я оставлю эти эксперименты на домашнее задание. После этого вы поймете ограничения данного учебного кода и сможете внести необходимые коррективы.

Нужно поставить уже исправленный и полностью функциональный код, чтобы его можно было использовать в качестве эхо-сервера. По-моему, это бессмысленно. Лучше всего, если вы постараетесь разобраться в этих вопросах. Попробуйте создать решение. Таким образом, лучше усваиваются как знания, так и концепция, лежащая в основе сокета. Но устранить эти недостатки несложно. Я уже давал подсказки, как их устранить. Остается только понять, что происходит, и устранить проблему.

Итак, данная часть готова. Теперь давайте посмотрим на клиент в MQL5.


Мы реализовали клиент на языке MQL5, эхо-версия

Как и на стороне сервера, здесь мы также можем реализовать код полностью на Python. Но мы будем готовиться к тому, что сделаем потом. Поэтому давайте на время забудем о Python и сосредоточимся на MQL5. Код для клиентской части находится ниже:

01. //+------------------------------------------------------------------+
02. #property service
03. #property copyright "Daniel Jose"
04. #property description "Echo Server Test Service."
05. #property description "Requires that the Python server is running in Excel."
06. #property version   "1.00"
07. //+------------------------------------------------------------------+
08. input string     user00 = "127.0.0.1";   //Address
09. input int        user01 = 27015;         //Port
10. //+------------------------------------------------------------------+
11. void OnStart()
12. {
13.     char buff[], resp[];
14.     int sock = SocketCreate(), ret;
15.     uint len;
16.     string szMsg;
17.     
18.     if (sock == INVALID_HANDLE)
19.     {
20.         Print("Unable to create socket. Error: ", GetLastError());
21.         return;
22.     }
23.     if (!SocketConnect(sock, user00, user01, 1000))
24.     {
25.         Print("Connection with the address [", user00, "] in port ", user01, " failed. Error code: ", GetLastError());
26.         SocketClose(sock);
27.         return;
28.     }
29.     while (!_StopFlag)
30.     {
31.         szMsg = TimeToString(TimeLocal(), TIME_DATE | TIME_SECONDS);
32.         len = StringToCharArray(szMsg, buff) - 1;
33.         Print("To Server: ", szMsg);
34.         if (SocketSend(sock, buff, len) != len)
35.         {
36.             Print("Error code: " , GetLastError());
37.             break;
38.         };
39.         szMsg = "";
40.         do
41.         {
42.             len = SocketIsReadable(sock);
43.             ret = SocketRead(sock, resp, len, 1000);
44.             if (ret > 0)
45.                 szMsg += CharArrayToString(resp, 0, ret);
46.         }while ((ret <= 0) && (!_StopFlag));
47.         Print("From Server: ", szMsg);
48.         Sleep(1000);
49.     }
50.     SocketSend(sock, buff, 0);
51.     SocketClose(sock);
52. }
53. //+------------------------------------------------------------------+

Сервис на языке MQL5

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

Как только сделано это, мы сможем увидеть, как работает клиентский код на MQL5. Первое, что, вероятно, привлечет ваше внимание, - это строка 02. Действительно, мы можем использовать сервис для реализации сокета. Единственный тип приложения, который не может реализовать сокет, - это индикатор. В остальном у нас будет полная свобода действий при использовании других типов приложений.

Скорее всего, вы найдете данный код похожим на предыдущие статьи. Действительно, это так. Весь код, который ориентирован на сокеты, очень похож. Поэтому всё, о чем говорилось выше, остается в силе. Единственное реальное различие - в строке 50.

Теперь вы, может быть, спросите себя: почему существует такая строка? Чтобы понять это, необходимо разобраться в серверном коде Python. Здесь видно, что, когда в строке 15 сервер получает неправильную или пустую информацию, он отключается. Именно это и делает строка 50, хотя, честно говоря, это не лучший способ заставить сервер и клиента взаимодействовать, чтобы указать, что соединение закрывается. Но для начальных целей и базового тестирования мы можем пока смириться с этим. Таким образом, пока клиент подключен к серверу, в MetaTrader 5 мы увидим следующее:

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


Вопросы, которые необходимо решить перед следующим шагом

Хорошо. Но это самое простое из основного. Однако до того, как мы перейдем к следующему этапу и изучим полный код, давайте ещё раз вспомним, что цель этого кода - именно дидактическая. Я хотел бы воспользоваться моментом и рассказать о том, что у нас есть на данный момент.

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

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

Давайте вспомним нашу небольшую реализацию, которая уже работает, и где осуществляется обмен информацией между Excel и MetaTrader 5. В отличие от предыдущих статей, где мы использовали один сервер, работающий в командной строке, здесь можно случайно попробовать то, что обычно не делаем сознательно: запустить два сервера в одном окружении. То есть, мы имеем один символ системы с одним запущенным сервером, открываем другой в той же сессии операционной системы и пробуем запустить тот же сервер в этой новой промпте. Если вы не знаете, что произойдет в этом случае, можете попробовать. Вы увидите, что это почему-то невозможно. Но здесь возникает проблема, связанная с тем, что многие люди, даже с большим опытом не понимают, что такое сокеты (хотя бы теоретически).

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

Теперь вспомните, что сервер мини-чата будет использовать порт 27015 и что эхо-сервер, который будет работать на Excel, также будет его использовать. Поэтому, теоретически, у нас здесь будет конфликт интересов. Можно подумать, что операционная система не позволит серверу вмешиваться или пытаться прослушивать один и тот же порт, используя один и тот же протокол. В данном случае мы используем протокол TCP. Но мы можем использовать TCP на одном сервере и UDP на другом. В этом случае не будет проблем с использованием одного и того же порта.

Однако, когда мы используем один и тот же порт, один и тот же протокол и на одном и том же хосте, всё становится немного сложнее.

Я хочу подчеркнуть этот момент, чтобы те, кто хочет стать продвинутым пользователем сокетов, поняли, что при работе с сокетами необходимо соблюдать определенные меры предосторожности. Я хочу, чтобы вы, прежде чем увидеть, как реализована связь между Excel и MetaTrader 5, поняли, что происходит, когда два разных сервера используют одни и те же ресурсы. В этом случае используется один и тот же протокол, один и тот же порт и один и тот же хост. Чтобы понять это, сначала нужно открывать сервер мини-чата и дать ему дождаться соединения.

Теперь открываем эхо-сервер в Excel и оставим его в ожидании соединения. То есть у нас получится нечто похожее на это:

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

Не знаю, поняли ли вы на самом деле, что я пытаюсь объяснить. Дело в том, что, хотя эти два сервера разные, они используют одни и те же ресурсы, то есть они используют один и тот же порт, один и тот же протокол, в данном случае TCP, и один и тот же хост. Именно эта ситуация делает работу с сокетами такой сложной. Если у нас есть сервер, который должен отвечать определенным требованиям, и мы добавляем другой сервер, который использует те же ресурсы, не осознавая этого, мы можем помешать клиентам получить правильный ответ на их запросы.

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

Во многих случаях некоторые могут просто сказать, что решить данную проблему легко. «Всё, что нужно сделать, - это изменить протокол или порт. Это позволит разрешить конфликт между серверами». Это правда. Даже такое простое решение, как размещение одного сервера на одном компьютере, а второго - на другом, решит проблему, даже если оба будут использовать один и тот же порт и протокол.

Но вопрос остается открытым. На изображении выше, какой из двух компьютеров ответит на запрос клиента насчет подключения? Чтобы это выяснить, достаточно посмотреть, какой из них был введен в эксплуатацию последним. То есть, если ни один клиент ещё не подключился, то при попытке установить соединение первый клиент подключится к последнему работающему серверу. Как только данный сервер будет остановлен, сервер, расположенный непосредственно перед ним, начнет обрабатывать новые запросы клиентов.

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


Заключительные идеи

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

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

В начале данной серии статей о сервисе репликации/моделирования рассмотрели возможность использования сокетов для создания всей системы репликации/моделирования. В некотором смысле это было бы значительно проще с точки зрения общей конструкции, поскольку нам нужно было бы только отправлять тиковые данные непосредственно на порт, который MetaTrader 5 использует для подключения к реальному торговому серверу. Однако после дальнейших размышлений я отбросил эту идею. Почему? Причина в том, что придется прибегнуть к техникам, чье практическое применение я не хочу объяснять. Однако я хочу, чтобы вы немного поразмыслили над этим. Увидимся в следующей статье, где мы рассмотрим, как Excel может отправлять данные в MetaTrader 5 и как 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++ (версия мини-чата).
Код на 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/12744

Прикрепленные файлы |
Anexo.zip (560.03 KB)
От новичка до эксперта: Утилита для управления параметрами От новичка до эксперта: Утилита для управления параметрами
Представьте, что вы преобразовали традиционные входные свойства советника или индикатора в интерфейс управления графиком в режиме реального времени. Это обсуждение основано на нашей фундаментальной работе над индикатором Market Period Synchronizer, что знаменует собой значительную эволюцию в том, как мы визуализируем рыночные структуры на старших таймфреймах (HTF) и управляем ими. Здесь мы превращаем эту концепцию в полностью интерактивную утилиту — информационная панель, которая обеспечивает динамический контроль и улучшенную многопериодную визуализацию ценового движения непосредственно на графике. Присоединяйтесь к нам, и мы узнаем, как это нововведение меняет способ взаимодействия трейдеров со своими инструментами.
Разработка динамического советника на нескольких парах (Часть 4): Корректировка риска на основе волатильности Разработка динамического советника на нескольких парах (Часть 4): Корректировка риска на основе волатильности
На этом этапе мы настраиваем мультипарный советник так, чтобы адаптировать размер сделки и риск в реальном времени с помощью метрик волатильности, таких как ATR, что повышает согласованность, защиту и эффективность в различных рыночных условиях.
Нейросети в трейдинге: Рекуррентное моделирование микродвижений рынка (Энкодер) Нейросети в трейдинге: Рекуррентное моделирование микродвижений рынка (Энкодер)
Эта статья погружает читателя в самую суть фреймворка EV-MGRFlowNet, показывая, как его архитектура раскрывается в прикладной реализации под задачи финансового прогнозирования. Мы шаг за шагом строим продуманную связку модулей, способную улавливать тонкие временные закономерности и переводить их в осмысленные рыночные сигналы.
Алгоритм эволюции элитных кристаллов — Elite Crystal Evolution Algorithm (CEO-inspired): Теория Алгоритм эволюции элитных кристаллов — Elite Crystal Evolution Algorithm (CEO-inspired): Теория
Представлен новый авторский популяционный алгоритм ECEA, вдохновлённый процессом замерзания воды и адаптирующий идеи алгоритма Crystal Energy Optimizer, (CEO) с поиском на графах, для общих задач оптимизации. Алгоритм использует динамическую элитную группу, три стратегии поиска и механизм периодической диверсификации.