Моделирование рынка: Position View (I)
Введение
Здравствуйте и добро пожаловать в очередную статью из серии о том, как создать систему репликации/моделирования.
В предыдущей статье, Моделирование рынка: Первые шаги на SQL в MQL5 (V), мы завершили объяснения всего необходимого для того, чтобы вы смогли понять материал в следующих статьях. Я знаю, что вся эта тема, которую мы обсуждали в последних статьях, не так проста для понимания с первого раза. И я думаю, многие из вас даже не представляли, что здесь, в MQL5, можно делать определённые вещи. Тем не менее, всё увиденное до сих пор было лишь верхушкой огромного айсберга. Это связано с тем, что я рассказал лишь немного о сокетах и немного о SQL.
На мой взгляд, знания, полученные за это время, пригодятся вам на следующих этапах. С этого момента мы начнем рассматривать ещё более сложную тему. Тем не менее, я сделаю всё возможное, чтобы не усложнять вам жизнь, уважаемый читатель. При этом я действительно хочу мотивировать вас учиться и ещё глубже погружаться в то, что я буду показывать, начиная с этого момента.
Сделайте глубокий вдох и приготовьтесь, потому что сейчас мы с головой уйдем в систему репликации/моделирования. То, что я планировал показать касательно разработки этой системы, уже практически в стадии кульминации. Иными словами, осталось показать совсем немного. Но поскольку содержание гораздо сложнее с точки зрения теорий, я постараюсь изложить его как можно проще. Сама программная часть довольно проста и понятна. Но если вы не понимаете стоящую за этим теорию, вы останетесь совершенно без ресурсов для доработки или даже адаптации системы репликации/моделирования под задачи, отличающиеся от тех, что я собираюсь показать.
Я не хочу, чтобы вы просто компилировали и использовали код, который я показываю. Я хочу, чтобы вы учились, разбирались и, если возможно, могли создать нечто лучшее. Я не буду показывать, как делать ряд вещей. Это связано с тем, что эти вещи — модели, которые я использую на практике и которые были специально разработаны для создания, или, скорее, внедрения торговой системы, так называемого советника, который обучается со временем. Также он формирует собственный торговый метод, приближаясь к тому, что на практике делал бы человеческий оператор.
В последней статье, Моделирование рынка (Часть 5): Создание класса C_Orders (II), в том разделе, где рассказывалось о системе репликации/моделирования, мы создали небольшой советник, способный взаимодействовать с разработанной ранее программой Chart Trade. Это было довольно давно. Итак, если вы не помните, как выглядел код, давайте быстро вспомним, как всё получилось в итоге. Начнём с этого момента. Всё, что было разработано с того момента и до настоящего времени, будет использовано очень скоро. Но давайте вспомним, как всё делалось раньше.
Вспоминаем то, что уже было разработано в системе репликации/моделирования
Это важный момент, потому что без знаний о уже разработанном, вы в итоге вернетесь к моментам, которые уже полностью работоспособны и не требуют пересмотра. Несмотря ни на что, я все же планирую показать, как сделать кое-что конкретное. Но об этом поговорим в другой раз. Для начала давайте рассмотрим то, что уже полностью функционирует.
Система репликации/моделирования состоит из нескольких отдельных приложений. Однако при их объединении они позволяют вам взаимодействовать с MetaTrader 5 практически так же, как если бы вы были подключены к демо- или реальному счету. Среди этих элементов можно выделить указатель мыши, который позволяет нам создавать аналитические построения или взаимодействовать с элементами на графике, а также Chart Trade, который может отправлять ордера или запросы на рыночное исполнение через советника. Это связано с тем, что при использовании указателя мыши и Chart Trade, который также является индикатором, мы можем общаться посредством протокола сообщений с советником, который также находится на графике.
Эти три приложения, рассматриваемые по отдельности, не очень практичны. Но как только они появятся на графике, можно легко взаимодействовать с MetaTrader 5, отправляя заявки на рыночное исполнение. Но, когда позиция открывается или закрывается, на графике это по-прежнему не отображается. Хотя это не совсем так. Мы можем рассчитывать на индикацию, которую показывает MetaTrader 5. Но если вы захотите использовать систему кросс-ордеров, вы останетесь совершенно без адекватной индикации. Это связано с тем, что при использовании кросс-ордеров перед нами график того символа, за которым мы наблюдаем. Однако ордер или запрос на совершение сделки размещается по другому символу, график которого не открыт. И в этот момент MetaTrader 5 уже не сможет нам помочь своей встроенной системой индикации.
То же самое происходит при использовании сервиса репликации/моделирования. Хотя мы можем и в ближайшее время реализуем способ визуализации операций в системе репликации/моделирования, подходящего способа сделать это у нас пока нет. Причина проста: у нас нет графической системы индикации, которая позволяла бы взаимодействовать с ордерами или позициями, которые могут существовать по этому конкретному символу, будь то настоящий символ или симулированный, то есть, символ, с помощью которого мы воспроизводим данные.
Таким образом, хотя система репликации/моделирования уже способна выполнять поставленную задачу, прежде всего нам необходимо реализовать какой-то способ визуализации и взаимодействия с любой позицией или ордером, которые могут существовать по данному торговому инструменту. Это связано с тем, что без этого создание системы ордеров для проведения анализа в системе репликации/моделирования — вещь совершенно бесполезная. Потому что мы не сможем взаимодействовать с ордерами или позициями, которые существуют по этому символу.
Таким образом, создание данной части становится нашим первоочередным приоритетом. Не волнуйтесь, сначала мы создадим достаточно простую систему. Довольно простое решение, которое позволит нам контролировать процесс при работе над системой репликации/моделирования. Так что давайте приступим прямо сейчас. Для этого создадим новую тему.
Создание простого индикатора позиций
Мы начнем со следующего: поскольку наш индикатор Chart Trade ориентирован не на отложенные ордеры, а только на немедленную отправку, мы начнем с создания базового индикатора, который показывает открытые позиции. Так что в данный момент мы не будем рассматривать отложенные ордера. Мы сосредоточимся только на открытых позициях и на том, как отобразить их на графике. Стоит ещё раз напомнить, что цель здесь заключается не в том, чтобы показать то, что MetaTrader 5 уже делает. Идея состоит в том, чтобы показать то, чего MetaTrader 5 нам не показывает. Особенно при использовании системы кросс-ордеров.
Прежде чем мы начнём рассматривать код, который будем реализовывать, я хотел бы уточнить, что на данном этапе цель состоит лишь в том, чтобы реализовать функцию, позволяющую отображать ценовые линии. Я вовсе не создаю сейчас инструмент для активного практического использования. То есть сначала мы должны добиться того, чтобы линии появлялись тогда, когда существует только одна открытая позиция. На данный момент мы не будем сосредотачиваться на управлении множеством открытых позиций. Поэтому самых нетерпеливых я прошу проявить немного терпения. Цель здесь будет заключаться в том, чтобы объяснить новичкам или энтузиастам, как заставить вещи работать.
Первым делом мы создадим новый файл. Вы можете подумать, что это должен быть файл типа Expert Advisor, поскольку мы собираемся работать с позициями, которые могут присутствовать на торговом сервере. Но нет, мы не будем создавать советника. Давайте создадим индикатор. Исходный код можно увидеть ниже:
01. //+------------------------------------------------------------------+ 02. #property copyright "Daniel Jose" 03. #property description "Indicator for tracking an open position on the server." 04. #property version "1.00" 05. #property indicator_chart_window 06. #property indicator_plots 0 07. //+------------------------------------------------------------------+ 08. int OnInit() 09. { 10. return INIT_SUCCEEDED; 11. } 12. //+------------------------------------------------------------------+ 13. int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) 14. { 15. return rates_total; 16. } 17. //+------------------------------------------------------------------+ 18. void OnDeinit(const int reason) 19. { 20. } 21. //+------------------------------------------------------------------+
Исходный код
Глядя на это, вы, возможно, подумаете: "вы сошли с ума или окончательно обезумели? Нет никакого способа использовать индикатор для чего-то подобного". Успокойтесь, уважаемый читатель, проявите немного терпения. Прошу. Тот факт, что вы никогда не видели чего-то, не означает, что это невозможно сделать или что этого не существует. Использование индикатора для решения данной задачи имеет ряд преимуществ. Хотя мало кто порекомендовал бы это. Но по мере того, как вы будете видеть, как строится код, вы в конце концов поймете, почему мы будем использовать для этого индикатор, а не советник. Как мы уже говорим некоторое время, материал этой серии статей о системе репликации/моделирования будет становиться всё более сложным. Но я стараюсь, по возможности, делать всё максимально просто и доступно.
Проблема использования индикатора заключается в том, что, если мы неправильно реализуем код, то в конечном итоге мы полностью испортим функциональность графика. Это происходит так, потому что MetaTrader 5 размещает все индикаторы в одном потоке исполнения. Поэтому, если один из индикаторов зависнет или станет неработоспособным на некоторое время, то график, на котором он находится, также столкнется с той же проблемой. Многие люди иногда заполняют график индикаторами. Но хотя это и кажется допустимым, не рекомендуется, поскольку все они работают в одном и том же потоке. И один индикатор может навредить другим, из-за чего общая производительность платформы окажется под угрозой.
Однако наша идея здесь заключается именно в том, чтобы поместить индикатор на график и не трогать его. То есть он не будет подвергаться никаким обновлениям. Даже если вы вручную измените цену тейк-профита или стоп-лосса, в данный момент индикатор не отобразит это изменение. Это будет сделано позже, когда я подробно объясню, как именно будет выполняться данное обновление. Так что давайте не будем торопиться. Первым делом нужно отобразить ценовые линии, забудьте обо всем остальном на время, потому что мы будем реализовывать это самым простым и познавательным способом. Я хочу, чтобы вы научились этому и таким образом смогли создать изменения, необходимые для ваших личных проектов. А не просто пользовались бы тем, что я научу вас создавать, и оказались полностью ограничены в дальнейшей работе, не зная, куда двигаться дальше.
Отлично, теперь мы собираемся изменить код, который мы видели ранее, чтобы мы могли протестировать кое-какие вещи. Наш новый код можно увидеть ниже:
01. //+------------------------------------------------------------------+ 02. #property copyright "Daniel Jose" 03. #property description "Indicator for tracking an open position on the server." 04. #property version "1.00" 05. #property indicator_chart_window 06. #property indicator_plots 0 07. //+------------------------------------------------------------------+ 08. #include <Market Replay\Auxiliar\C_Terminal.mqh> 09. //+------------------------------------------------------------------+ 10. C_Terminal *Terminal; 11. //+------------------------------------------------------------------+ 12. int OnInit() 13. { 14. Terminal = new C_Terminal(); 15. if (!PositionSelect((*Terminal).GetInfoTerminal().szSymbol)) return INIT_FAILED; 16. Print ( 17. "Position Ticket: ", PositionGetInteger(POSITION_TICKET), " ", 18. "Opening Price: ",PositionGetDouble(POSITION_PRICE_OPEN), " ", 19. "Stop Position: ", PositionGetDouble(POSITION_SL), " ", 20. "Take Position: ", PositionGetDouble(POSITION_TP) 21. ); 22. 23. return INIT_SUCCEEDED; 24. } 25. //+------------------------------------------------------------------+ 26. int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) 27. { 28. return rates_total; 29. } 30. //+------------------------------------------------------------------+ 31. void OnDeinit(const int reason) 32. { 33. delete Terminal; 34. } 35. //+------------------------------------------------------------------+
Исходный код базового индикатора позиции
Поскольку этот код довольно простой, я быстро пройдусь по нему, чтобы вы поняли, как он работает. Предполагаю, вы не поймете этого, просто взглянув на код. В строке 08 мы добавляем файл, уже присутствующий в системе репликации/моделирования. Данный файл не претерпел никаких изменений с момента его последнего обновления, показанного здесь в этой серии. В строке 10 мы указываем, что на класс, присутствующий в заголовочном файле, мы будем обращаться через указатель. В строке 14 мы инициализируем класс. В строке 15 мы просим MetaTrader 5 сообщить нам, открыта ли позиция по этому символу. Если она не существует, мы завершим выполнение индикатора, сообщив об ошибке.
Теперь внимание! Когда строка 15 выполнит свою работу и вернет true, данные, относящиеся к позиции по запрашиваемому торговому инструменту, станут доступны для использования. До этого момента нам не будут предоставлены никакие достоверные данные. Обратите внимание на эту деталь. Если выполнение строки 15 будет успешным, то выполнится строка 16. В этой строке мы выводим в терминал данные по позиции, полученной вызовом в строке 15. В конце, в строке 23, мы возвращаем значение, указывающее на то, что индикатор успешно инициализировался.
Внутри этого индикатора больше ничего происходить не будет, пока он по какой-либо причине не будет удален с графика. Когда это произойдет, в строке 33 мы уничтожим класс и вернем системе выделенную память.
Всё просто. В результате на терминале отобразятся следующие данные, начиная с позиции, показанной на следующем изображении:

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

Прошу заметить, что нам удалось получить эти данные. Вопреки распространенному мнению, мы действительно можем получать данные о позициях или отложенных ордерах напрямую из индикатора. Для этого нам не обязательно использовать советник. Однако тот факт, что мы можем получать данные о позиции или отложенном ордере, не означает, что можно использовать индикатор для отправки или изменения позиции или отложенного ордера. Пожалуйста, не путайте эти понятия. Тот, кто отвечает за это, то есть за отправку или изменение позиции или отложенного ордера — это Expert Advisor. Не пытайтесь делать это через индикатор, потому что это не сработает.
Хорошо. Всё отлично, даже замечательно, но мы всё ещё далеки от того, что нам действительно необходимо реализовать. Однако, как многие говорят:
Умному достаточно и пары слов.
Поэтому любой, кто уже знает, как добавлять объекты на график, наверняка поймет эту идею. Но если в вашем случае всё было иначе, уважаемый читатель, не отчаивайтесь. Потому что теперь мы переходим к следующему шагу, который нам необходимо реализовать. Это шаг немного длиннее. Тем не менее, мы постараемся сделать процесс разработки хотя бы увлекательным. Это связано с теми возможностями, которые открываются начиная с этого момента. Однако мы не будем сразу переходить к окончательному результату. Мы будем действовать постепенно, поскольку есть ряд моментов, которые необходимо учитывать, чтобы свести программирование к минимуму. Напоминаем: у нас уже есть несколько готовых приложений, таких как Chart Trade, индикатор мыши и базовый советник.
Теперь нам нужно будет создать индикатор позиции. Но желательно размещать его на графике тогда, когда другие три приложения также находятся на нем. Но пока мы не будем об этом беспокоиться. Для начала давайте создадим несколько объектов для размещения на графике, чтобы видеть ту же информацию, которую мы видели бы, если бы MetaTrader 5 умел штатно работать с кросс-ордерами. Итак, приступим к работе.
Размещение объектов на графике
Возможно, вы считаете, что размещение объектов непосредственно на графике с помощью MQL5 — это либо очень сложно, либо очень просто. В каком-то смысле всё будет зависеть от того, как мы хотим работать и что вы ожидаете от функциональности. Однако размещение объектов на графике в терминале MetaTrader 5 не представляет сложности. Это даже довольно просто, или с помощью кода MQL5, или напрямую из MetaTrader 5, где в меню есть пункт Insert, содержащий подменю Objects, который позволяет нам размещать некоторые объекты прямо на графике очень простым и прямым способом. Вы можете увидеть это на следующем изображении:

Однако существует проблема. Я не совсем уверен, упоминал ли я об этом раньше. Но в любом случае, с этого момента вы, уважаемый читатель, должны начать понимать, что мы не можем делать вещи как попало. Не следует добавлять объекты на график только потому, что это сделает график красивее или даже будет отображать данные или информацию, которые мы считаем необходимыми. Делать это без должной осмотрительности — огромная глупость. Пожалуйста, не поймите меня неправильно, ведь есть кое-что, о чём многие даже не подозревают. И рано или поздно они сталкиваются с серьезной проблемой, которая буквально портит впечатление от использования MetaTrader 5.
Однако проблема на самом деле не в MetaTrader 5, а в различных приложениях, которые создают объекты на графике без какого-либо контроля. Даже если эти объекты не перегружают изображение и не мешают нормально читать график, они могут стать настоящим кошмаром. Это похоже на застрявший в земле камень: мы думаем, что это маленький камешек, но когда пытаемся его вытащить, обнаруживаем, что на самом деле это огромный валун, гораздо больше, чем мы могли себе представить.
Возможно, вы думаете: "Хорошо, но как это повлияет на меня, или почему меня это должно волновать?" Что ж, если вы так думаете, мне больше нечего вам сказать, кроме как пожелать удачи. Но если вам действительно интересно и вы хотите получить наилучший опыт от использования приложений, работающих с объектами на графике, эта тема может вас очень заинтересовать. Проблему несложно заметить, даже наоборот, она бросается в глаза. И если вы действительно хотите увидеть, как возникает эта проблема, достаточно будет использовать код, который я опубликовал некоторое время назад. В то время я не представлял, как MetaTrader 5 обрабатывает определенные ситуации. Но для того, что мы собираемся сделать, крайне важно знать, как MetaTrader 5 обрабатывает некоторые из них.
Если добавить изображение на график так, чтобы оно закрывало всю графическую область, в результате получится фоновый рисунок, который сможет служить вам способом быстрого распознавания того, какой символ находится на экране. Кроме того, использование изображения на графике выглядит гораздо привлекательнее, чем монохромный фон. Проще говоря, о вкусах не спорят; в худшем случае мы можем пожалеть о своем выборе. Хорошо. Это можно сделать, разместив объект непосредственно на графике, или же использовать для этого специальное приложение. В первом случае мы не сможем контролировать некоторые вещи. Во втором случае мы будем полностью контролировать ход событий.
Хорошо. Те, кто следит за моими статьями, знают, что в рамках того, что уже было показано, в определенный момент мы создали класс под названием C_DrawImage. Его назначение — позволить размещение объектов, содержимое которых представляет собой растровые изображения. По крайней мере на данный момент, ведь мы ещё не показали, как работать с другими форматами изображений. Но нас здесь интересует не это, а другой факт. Таким образом, используя весь показанный нами набор кодов, мы можем создать следующий файл, который представлен ниже:
01. //+------------------------------------------------------------------+ 02. #property copyright "Daniel Jose" 03. #property description "This indicator allows you to add" 04. #property description "a wallpaper to the chart." 05. #property version "1.00" 06. #property indicator_chart_window 07. #property indicator_plots 0 08. //+------------------------------------------------------------------+ 09. #include <Market Replay\Auxiliar\C_DrawImage.mqh> 10. //+------------------------------------------------------------------+ 11. input string user00 = "WallPaper_1"; //WallPaper 12. input uchar user01 = 60; //Transparency 13. //+------------------------------------------------------------------+ 14. C_DrawImage *Draw; 15. C_Terminal *Terminal; 16. //+------------------------------------------------------------------+ 17. int OnInit() 18. { 19. Terminal = new C_Terminal(); 20. if (!Terminal.IndicatorCheckPass("Indicator WallPaper")) return INIT_FAILED; 21. Draw = new C_DrawImage(Terminal, "WallPaper", 0, "WallPapers\\" + user00 + ".bmp", NULL); 22. 23. return INIT_SUCCEEDED; 24. } 25. //+------------------------------------------------------------------+ 26. int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) 27. { 28. return rates_total; 29. } 30. //+------------------------------------------------------------------+ 31. void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) 32. { 33. switch (id) 34. { 35. case CHARTEVENT_CHART_CHANGE: 36. (*Terminal).DispatchMessage(id, lparam, dparam, sparam); 37. (*Draw).Paint(0, 0, (*Terminal).GetInfoTerminal().Width, (*Terminal).GetInfoTerminal().Height, user01, 0); 38. break; 39. } 40. ChartRedraw((*Terminal).GetInfoTerminal().ID); 41. } 42. //+------------------------------------------------------------------+ 43. void OnDeinit(const int reason) 44. { 45. delete Draw; 46. delete Terminal; 47. } 48. //+------------------------------------------------------------------+
Исходный код Wallpaper.mq5
Обратите внимание, что это всего лишь индикатор. Но что же на самом деле делает этот файл? Хорошо, это просто. Этот небольшой и скромный файл на самом деле является обновлением другого файла, из одной из моих ранних статей. Как я уже упоминал, в то время я кое-что не знал о MetaTrader 5.
Речь идёт о статье Как сделать график более интересным: добавление фона, для тех, кому интересно узнать мотивацию и более подробную информацию об идее, лежащей в основе всей работы. Если сравнить коды, то видно, что они совершенно разные. И да, они таковыми и являются, но не в такой степени, как вы можете себе представить. В коде, приведенном в той статье, есть проблема, решение которой предельно простое. После компиляции данного кода и его загрузки на график в качестве приложения MetaTrader 5, на графике появится фоновое изображение. На самом деле, изображение должно служить фоном.
Однако, хотя это четко видно в коде, при изменении таймфрейма происходит не совсем это. Даже если мы укажем MetaTrader 5, что бары должны находиться на переднем плане, этот фоновый рисунок всё равно перекроет их и может полностью скрыть график. Но всё ещё хуже. Созданный там объект изначально имеет приоритет по умолчанию для получения событий клика, в отличие от обновленного кода, который я здесь показываю.
Но в чём тут проблема? Нет никакой проблемы, если на графике мало объектов, и они изолированы друг от друга. Но что произойдет, если мы разместим объект, например, обои, который покроет весь график? И что, если он будет иметь тот же приоритет для получения событий, что и другие объекты, также присутствующие на графике? Ситуация начинает немного усложняться, не так ли? Это связано с тем, что MetaTrader 5 не будет знать, какому объекту отправлять события.
Теперь подумайте о следующем: на графике у нас уже есть несколько необходимых объектов. Они находятся в индикаторе мыши и в индикаторе Chart Trade. Однако приоритет объектов индикатора мыши был снижен до -1. А объекты индикатора Chart Trade имеют нулевой приоритет. То есть, даже если мы попытаемся отправить событие клика объекту, созданному в индикаторе мыши, мы не сможем получить это событие, если указатель мыши находится над каким-либо объектом панели Chart Trade. Мы уже видели это во время реализации панели Chart Trade. Однако я не знаю, свежо ли это ещё в вашей памяти, уважаемый читатель.
И теперь появился новый усложняющий фактор. Мы создадим и разместим на графике ещё больше объектов. Это связано с тем, что мы собираемся создать индикатор ордеров и позиций. Однако вопрос остается тем же. Что же нам следует делать при создании объектов в индикаторе «Ордеров и позиций»? Если они имеют такой же приоритет получения событий, как и панель Chart Trade, у нас могут возникнуть проблемы, когда один объект перекрывает другой.
Можно подумать: "Но это просто. Объект, находящийся впереди, будет иметь приоритет". Да, но я повторяю: о каком объекте идёт речь? Это связано с тем, что если два объекта создаются с одинаковым приоритетом и оба находятся в одной и той же позиции, 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 | Обеспечивает взаимодействие между графическими элементами управления и пользователем (необходимо как для работы системы репликации/моделирования, так и на реальном рынке). |
| Indicators\Order Indicator.mq5 | Отвечает за отображение рыночных ордеров, позволяя взаимодействовать с ними и управлять ими. |
| Indicators\Position View.mq5 | Отвечает за отображение рыночных позиций, позволяя взаимодействовать с ними и управлять ими. |
| Services\Market Replay.mq5 | Создает и поддерживает сервис репликации/моделирования рынка (главный файл всей системы) |
Перевод с португальского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/pt/articles/13133
Предупреждение: все права на данные материалы принадлежат MetaQuotes Ltd. Полная или частичная перепечатка запрещена.
Данная статья написана пользователем сайта и отражает его личную точку зрения. Компания MetaQuotes Ltd не несет ответственности за достоверность представленной информации, а также за возможные последствия использования описанных решений, стратегий или рекомендаций.
Особенности написания Пользовательских Индикаторов
Нейросети в трейдинге: От рыночного шума к устойчивому торговому плану (Основные компоненты)
Торговые инструменты MQL5 (Часть 27): Отрисовка параметрической кривой-бабочки средствами Canvas
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования