Español Português
preview
Разработка системы репликации (Часть 48): Концепции для понимания и осмысления

Разработка системы репликации (Часть 48): Концепции для понимания и осмысления

MetaTrader 5Примеры | 7 октября 2024, 08:27
139 1
Daniel Jose
Daniel Jose

Введение

В предыдущей статье Разработка системы репликации (Часть 47): Проект Chart Trade (VI) нам удалось сделать индикатор Chart Trade функциональным. Теперь мы снова можем сосредоточиться на том, что нам в действительности нужно разрабатывать.

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

Меня очень напрягало, что я мог делать что-то с помощью скрипта, но когда пытался сделать то же самое с помощью сервиса, то не мог заставить его работать соответствующим образом.

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

Первое отличие состоит в том, что скрипт всегда привязан к определенному графику и остается там до тех пор, пока график не будет закрыт. Примечательно, что при изменении таймфрейма MetaTrader 5 фактически отправляет команду на перерисовку графика. Для ускорения этого процесса он закрывает графический объект (не окно, а объект внутри окна) и создает новый. Это позволяет быстро перерисовать график. Однако при этом скрипт не возвращается на график, поскольку у него нет этой функции из-за отсутствия определенных событий.

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

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

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


Реализация примера скрипта

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

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

01. //+------------------------------------------------------------------+
02. #property copyright "Daniel Jose"
03. #property version   "1.00"
04. //+------------------------------------------------------------------+
05. void OnStart()
06. {
07.     long id;
08.     string szSymbol;
09.     int handle;
10.     bool bRet;
11.     ENUM_TIMEFRAMES tf;
12.     
13.     id = ChartID();
14.     szSymbol = ChartSymbol(id);
15.     tf = ChartPeriod(id);
16.     handle = iMA(szSymbol, tf, 9, 0, MODE_EMA, PRICE_CLOSE);
17.     bRet = ChartIndicatorAdd(id, 0, handle);
18.     
19.     Print(ChartIndicatorName(id, 0, 0), " ", szSymbol, " ", handle, "  ", bRet, " >> ",id);
20.     
21.     Print("*******");
22. }
23. //+------------------------------------------------------------------+

Пример исходного кода скрипта

Хотя скрипт и очень простой, он поможет мне объяснить, что мы на самом деле собираемся делать. Обратите внимание, что в строках 02 и 03 у нас есть данные о свойствах кода. Они не так уж и важны для нашего объяснения, а вот в строке 05 мы фактически начинаем наш код. Поскольку это очень простой скрипт, единственная реально необходимая функция — это OnStart.

Так вот, между строками 07 и 11 находятся наши локальные переменные. Здесь важно отметить кое-что важное. На самом деле нам не нужны все эти переменные в одном скрипте. Не для того, что мы собираемся сделать. Фактически, нам не понадобится ни одна из этих переменных. Но из-за строки 19 мы будем использовать их здесь, в скрипте.

Собственно, в скрипте происходит следующее: в строке 13 мы получаем идентификатор графика, на котором будет размещен скрипт. Затем в строке 14 мы берем название актива, найденного на этом графике. В строке 15 мы получаем временной интервал, в течение которого будет выполняться наш скрипт. Все эти 3 шага на самом деле необязательны. Несмотря на то, что шаг в строке 13 необходим, шаги, представленные в строках 14 и 15, не являются обязательными для скрипта. Но скоро станет ясно, почему они здесь присутствуют.

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

В строке 17 мы используем дескриптор, созданный в строке 16, и сообщаем MetaTrader 5, что индикатор, которому он принадлежит, должен быть запущен на экране графика. В строке 19 мы выводим все значения, которые были захвачены и использованы скриптом. Это будет некая форма отладки скрипта, которая также служит и для другой цели, о которой мы вскоре узнаем.

Обратите внимание: все, что мы сделали, могло быть выполнено и множеством других способов. Вы наверняка думаете: «Какой бесполезный код! Зачем кому-то понадобилось создавать нечто подобное?». И я не осуждаю вас за такие мысли. Но когда дело касается программирования, ничто не является бесполезным, за исключением случаев, когда вы создаете что-то совершенно бесцельно.

Если вы скомпилируете этот скрипт и поместите его на график, вы увидите, что будет отображена скользящая средняя на 9 периодов, расчет которой основан на цене закрытия. Поскольку код скрипта выполняется и завершается очень быстро, и в основном предназначен для тестирования чего-то другого, он не содержит проверок на ошибки. Любые возникающие ошибки будут видны в окне сообщений MetaTrader 5.

Теперь начинается самое интересное. Давайте подумаем вот о чем: если мы заменим строку 16, на другую, например:

handle = iCustom(szSymbol, tf, "Replay\\Chart Trade.ex5", id);

Мы можем сделать так, чтобы наш индикатор Chart Trade был размещен на графике с помощью скрипта. Но вы, должно быть, все еще задаетесь вопросом, какова реальная польза от этого. Как упоминалось в начале этой статьи, все становится интереснее, когда мы начинаем использовать этот скрипт не только как скрипт, но и как сервис.


Преобразование скрипта в сервис

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

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

Причина в том, что, в отличие от скрипта, сервис фактически не привязан к графику. И это обстоятельство немного усложняет ситуацию.

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

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

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

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

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

01. //+------------------------------------------------------------------+
02. #property service
03. #property copyright "Daniel Jose"
04. #property version   "1.00"
05. //+------------------------------------------------------------------+
06. void OnStart()
07. {
08.     long id;
09.     string szSymbol;
10.     int handle;
11.     bool bRet;
12.     ENUM_TIMEFRAMES tf;
13.     
14.     Print("Waiting for the chart of the first asset to be opened...");
15.     while ((id = ChartFirst()) < 0);
16.     szSymbol = ChartSymbol(id);
17.     tf = ChartPeriod(id);
18.     handle = iMA(szSymbol, tf, 9, 0, MODE_EMA, PRICE_CLOSE);
19.     bRet = ChartIndicatorAdd(id, 0, handle);
20.     
21.     Print(ChartIndicatorName(id, 0, 0), " ", szSymbol, " ", handle, "  ", bRet, " >> ",id);
22.     
23.     Print("*******");
24. }
25. //+------------------------------------------------------------------+

Исходный код сервиса

Посмотрите внимательно на представленный выше код и сравните его с кодом из предыдущей темы. А теперь ответьте: в чем между ними разница? Вероятно вы скажете, что это строка 02, где теперь есть свойство, определяющее этот код как сервис. Действительно, это так, но кроме этого, что еще? Еще у нас есть две отличающиеся строки. Строка 14, где мы выводим сообщение о том, что сервис ожидает размещения графика в терминале MetaTrader 5, и строка 15, где мы ожидаем, что этот график будет открыт.

Вот так все становится намного интереснее. Чтобы понять, что происходит на самом деле, напишите этот код выше и скомпилируйте его с помощью MetaEditor. Откройте MetaTrader 5, затем закройте все графики, абсолютно все, которые открыты. После этого запустите только что созданный нами сервис. Откройте окно сообщений, и вы увидите сообщение, приведенное в строке 14. Если это произойдет, значит, вы все сделали правильно. Теперь откройте график какого-нибудь актива. Вы сразу же увидите сообщение из строки 21, и сервис будет закрыт. Но глядя на график, вы заметите, что на нем присутствует экспоненциальная скользящая средняя на 9 периодов, как и ожидалось. Это потому, что сервис ее там разместил.

Отлично, я надеюсь, что вы, дорогой читатель, внимательно следите за объяснением, потому что теперь мы все еще немного усложним.


Обеспечение стандартизированного графика

С этого момента начинается действительно самая интересная часть использования сервисов. Многим нравится использовать стандартизированную графическую модель, для которой создаются шаблоны. Предустановленный шаблон в определенной степени помогает нам именно в этом. Он гарантирует, что все графики будут соответствовать стандарту на момент их создания. Но после размещения шаблона мы можем случайно удалить какой-то индикатор или изменить настройки одного из них. Во многих случаях это не является какой-то проблемой. Можно просто восстановить индикатор и все. Но возможно ли использовать MetaTrader 5 таким образом, чтобы он не подводил нас? Чтобы он всегда был чем-то очень близким к терминалу Bloomberg?

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

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

01. //+------------------------------------------------------------------+
02. #property service
03. #property copyright "Daniel Jose"
04. #property version   "1.00"
05. //+------------------------------------------------------------------+
06. void OnStart()
07. {
08.     long id;
09.     string szSymbol;
10.     int handle;
11.     
12.     Print("Waiting for the chart of the first asset to be opened...");
13.     while (!_StopFlag)
14.     {
15.             while (((id = ChartFirst()) < 0) && (!_StopFlag));
16.             while ((id > 0) && (!_StopFlag))
17.             {
18.                     if (ChartIndicatorName(id, 0, 0) != "MA(9)")
19.                     {
20.                             handle = iMA(szSymbol = ChartSymbol(id), ChartPeriod(id), 9, 0, MODE_EMA, PRICE_CLOSE);
21.                             ChartIndicatorAdd(id, 0, handle);
22.                             IndicatorRelease(handle);
23.                     }
24.                     id = ChartNext(id);
25.             }
26.             Sleep(250);
27.     }
28.     Print("Service finish...");
29. }
30. //+------------------------------------------------------------------+

Улучшенный код сервиса

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

В строке 12 мы выводим сообщение о том, что сервис находится в режиме ожидания. Так же, как и в строке 28, сообщаем, что сервис удален и больше не выполняется. Все, что происходит между этими двумя строками, нас действительно интересует. Чтобы убедиться, что сервис закрывается корректно, не вызывая проблем в MetaTrader 5, мы проверяем константу _StopFlag, которая будет иметь истинное значение, пока мы не запрашиваем закрытие сервиса.

Таким образом, в строке 13 мы входим в бесконечный цикл. Этот цикл на самом деле не бесконечен, поскольку в тот момент, когда мы сообщаем, что хотим закрыть сервис, этот цикл будет прерван.

В строке 15 у нас все то же самое, что и в предыдущем коде. Но теперь мы добавляем проверку, чтобы избежать проблем при закрытии сервиса. Теперь обратите внимание: когда ChartFirst возвращает значение, это будет значение первого окна, которое вы открыли в терминале MetaTrader 5. Это значение будет находиться в переменной «id». Запомните этот факт, поскольку с этого момента важно учитывать последовательность действий.

В строке 18 мы проверяем, содержит ли тестируемое окно индикатор iMA, который является средней за 9 периодов. Если это условие не выполнено, то есть среднее значение отсутствует на графике, мы произведем его добавление. Для этого сначала создается дескриптор в строке 20, а затем в строке 21 мы добавляем среднее значение на график. Как только это будет сделано, мы удаляем дескриптор, так как он нам больше не потребуется. Таким образом, если вы удалите среднее значение с графика, оно добавится обратно. Это будет выполняться автоматически во время работы сервиса.

Строка 24 будет искать следующее окно. Теперь обратите внимание, что нам нужен индекс текущего окна, чтобы MetaTrader 5 мог знать, каким будет следующий индекс. Не перепутайте. Если будет найдено другое окно, цикл повторится. До тех пор, пока ChartNext не вернет значение -1. Когда цикл, начавшийся в строке 16, будет завершен.

Конечно, нам не нужно, чтобы сервис работал как бестолковый лунатик. Поэтому в строке 26 мы генерируем небольшую задержку, около 250 миллисекунд, до следующей итерации цикла. Таким образом, сервис будет запускаться 4 раза в секунду, гарантируя, что указанная скользящая средняя всегда будет присутствовать на любом из графиков, которые могут быть открыты в терминале MetaTrader 5. Подобные вещи очень интересны, не правда ли?

Но мы можем сделать немного больше. Мы можем принудительно размещать элементы на определенном графике для конкретного актива. Именно этого я много раз пытался достичь с самого начала этой серии статей, но по тем или иным причинам не получалось. Теперь предположим, что вы, торгующий на B3 (Бразильской фондовой бирже), решаете, что вам нужно использовать определенный индикатор только для конкретного актива. И всегда только для него. Один из способов сделать это — использовать шаблон. Но весьма вероятно, что в ежедневной суете вы в конечном итоге закроете этот актив, а когда снова откроете график, то не заметите, что столь необходимый индикатор отсутствует, пока не станет слишком поздно.

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

Итак, давайте посмотрим, как это сделать. А чтобы не путаться, вынесем это в новую тему.

 

Гарантия качества терминала

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

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

01. //+------------------------------------------------------------------+
02. #property service
03. #property copyright "Daniel Jose"
04. #property version   "1.00"
05. //+------------------------------------------------------------------+
06. void OnStart()
07. {
08.     long id;
09.     string szSymbol;
10.     int handle;
11.     ENUM_TIMEFRAMES tf;
12.     
13.     Print("Waiting for the chart of the first asset to be opened...");
14.     while (!_StopFlag)
15.     {
16.             while (((id = ChartFirst()) < 0) && (!_StopFlag));
17.             while ((id > 0) && (!_StopFlag))
18.             {
19.                     szSymbol = ChartSymbol(id);
20.                     tf = ChartPeriod(id);
21.                     if ((StringSubstr(szSymbol, 0, 3) == "WDO") && (ChartWindowFind(id, "Stoch(8,3,3)") < 0))
22.                     {
23.                             handle = iStochastic(szSymbol, tf, 8, 3, 3,MODE_SMA, STO_CLOSECLOSE);
24.                             ChartIndicatorAdd(id, (int)ChartGetInteger(id, CHART_WINDOWS_TOTAL), handle);
25.                             IndicatorRelease(handle);
26.                     }
27.                     if (ChartIndicatorName(id, 0, 0) != "MA(9)")
28.                     {
29.                             handle = iMA(szSymbol, tf, 9, 0, MODE_EMA, PRICE_CLOSE);
30.                             ChartIndicatorAdd(id, 0, handle);
31.                             IndicatorRelease(handle);
32.                     }
33.                     id = ChartNext(id);
34.             }
35.             Sleep(250);
36.     }
37.     Print("Service finish...");
38. }
39. //+------------------------------------------------------------------+

Код сервиса

Обратите внимание, что изменений немного, но результаты поразительны. В нашем случае, для демонстрации мы будем использовать актив, доступный на B3 (Бразильской фондовой бирже). Активом, о котором идет речь, является мини-фьючерсный контракт на доллар. Этот контракт истекает каждый месяц, но это не проблема. Чтобы это понять, давайте перейдем к объяснению самого кода. Это несложно, но нужно обращать внимание на детали, иначе вы не получите того, что ожидали.

Я не буду описывать уже рассмотренное, поэтому сосредоточимся на новых частях кода. В строках 19 и 20 мы вводим данные графика, которые сервис будет проверять. Нам необходимы название актива, а также временной интервал графика, чтобы избежать ошибок в дальнейшем. Затем мы помещаем эти значения в две переменные.

В строке 21 мы делаем две проверки:

  • первая касается имени актива, который мы хотим настроить,  
  • вторая – наличия или отсутствия конкретного индикатора.

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

Второй момент, на который следует обратить внимание, связан с индикатором. Обратите внимание, что мы должны указать его короткое имя. Если вы не знаете этого имени, просто поместите этот индикатор на график и используйте простой скрипт для вывода его имени на терминал. Так вы точно будете знать, какое имя там должно быть использовано. В данном случае мы имеем в виду стохастический индикатор с 8 периодами, средней 3 и константой 3. Но если индикатор другой, замените string на правильное имя. В противном случае у нас возникнут проблемы на следующем этапе.

Итак, вернемся к ситуации, когда индикатор отсутствует на графике указанного актива. В этом случае мы сначала выполним строку 23, где настраиваем нужный индикатор. Затем в строке 24 мы добавляем индикатор в новое подокно. Будьте внимательны на этом моменте: если вы укажете номер подокна, MetaTrader 5 разместит индикатор в указанном окне. Это может привести к путанице. Но согласно существующему коду, MetaTrader 5 создаст новое подокно и добавит в него индикатор.

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

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

27.     if (ChartIndicatorGet(id, 0, "MA(9)") == INVALID_HANDLE)

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


Заключение

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

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

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

Демонстрационное видео

Перевод с португальского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/pt/articles/11781

Прикрепленные файлы |
Anexo.zip (420.65 KB)
Последние комментарии | Перейти к обсуждению на форуме трейдеров (1)
Sergei Lebedev
Sergei Lebedev | 4 мая 2024 в 13:34

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

Прошу вас написать следующую 49 статью "Руководство пользователя" и изложить в ней по каждому компоненту этого проекта.

Также - если этот проект готов к практической реализации, пожалуйста, добавьте практический пример его использования. Например, "Переигрывание и переторговка Brexit case на GBPUSD в образовательных целях". Предполагается, что в этом практическом примере данный проект будет использоваться для получения исторических данных 'GBPUSD' с реального инструмента (любого подключенного форекс-счета) плюс/минус 1 день после Brexit, использования извлеченных данных для подачи пользовательского инструмента типа 'repGBPUSD' в режиме воспроизведения, добавления некоторых общих индикаторов (RSI(14), MA(50) и т.д.) и предоставления пользователю опыта переторговки этого исторического события в реальном времени.

Данное руководство пользователя с практическим примером переторговки Brexit в реальном времени будет действительно отличным завершением этого проекта!

Переосмысливаем классические стратегии: Нефть Переосмысливаем классические стратегии: Нефть
В этой статье мы пересмотрим классическую стратегию торговли сырой нефтью с целью ее усовершенствования за счет использования алгоритмов машинного обучения с учителем. Мы построим модель наименьших квадратов для прогнозирования будущих цен на нефть марки Brent на основе разницы между ценами на нефть марки Brent и WTI. Наша цель — найти опережающий индикатор будущих изменений цен на нефть марки Brent.
Прогнозирование валютных курсов с использованием классических методов машинного обучения: Логит и Пробит модели Прогнозирование валютных курсов с использованием классических методов машинного обучения: Логит и Пробит модели
Предпринята попытка построить торговый эксперт для предсказания котировок валютных курсов. За основу алгоритма взяты классические модели классификации — логистическая и пробит регрессия. В качестве фильтра торговых сигналов используется критерий отношения правдоподобия.
Нейросети в трейдинге: Управляемая сегментация (Окончание) Нейросети в трейдинге: Управляемая сегментация (Окончание)
Продолжаем, начатую в предыдущей статье работу, по построению фреймворка RefMask3D средствами MQL5. Данный фреймворк разработан для всестороннего изучения мультимодального взаимодействия и анализа признаков в облаке точек, с последующей идентификацией целевого объекта на основе описания, предоставленного на естественном языке.
Нейросети в трейдинге: Управляемая сегментация Нейросети в трейдинге: Управляемая сегментация
Предлагаем познакомиться с методом комплексного мультимодального анализа взаимодействия и понимания признаков.