English Español Português
preview
Разработка системы репликации (Часть 37): Прокладываем путь (I)

Разработка системы репликации (Часть 37): Прокладываем путь (I)

MetaTrader 5Примеры | 25 апреля 2024, 12:41
262 0
Daniel Jose
Daniel Jose

Введение

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

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

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

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

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

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

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

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

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

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

Поскольку нам всё еще приходится переносить некоторые вещи из прошлого в систему репликации/моделирования, это касается и Chart Trader. Нам нужна какая-то система, но она должна быть устойчивой и простой в использовании. Хотя мы это и сделали в статье Разработка торгового советника с нуля (Часть 30): CHART TRADE теперь как индикатор?!, это нам не подходит.

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

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


Начинаем строить индикатор

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

Для начала создадим индикатор. При использовании MetaEditor следует действовать таким образом:

Рисунок 01

Рисунок 01 - Выбираем, что будем создавать.

Рисунок 02

Рисунок 02 - Создаем такой каталог.

Рисунок 03

Рисунок 03 - Именуем индикатор.

Рисунок 04

Рисунок 04 - Оставляем вещи простыми.

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

Рисунок 05

Рисунок 05 - Нажимаем "Завершить"

В итоге мы увидим изображение на рисунке 05. На этом этапе нам нужно просто создать новый, нажав кнопку "Завершить".

Идея заключается в создании индикатора для размещения на НУЛЕВОМ окне, но те же концепции могут быть использованы для размещения индикатора в любом окне. Но, опять же, не переживайте. Обратите внимание на главную мысль статьи.

По окончании этого процесса в окне MetaEditor мы увидим следующий код:

#property copyright "Daniel Jose"
#property link      ""
#property version   "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
//---
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Я знаю, что многие люди предпочитают использовать собственное форматирование MetaEditor. Это понятно, но для меня данный формат менее приятен в использовании. Но это личное дело каждого. На самом деле важно, чтобы мы могли легко прочитать свой код и понять его.

Так что давайте начнем модифицировать этот стандартный код на то, что действительно нужно.

Если мы попытаемся скомпилировать этот стандартный код, то получим предупреждение.

Рисунок 06

Рисунок 06 - Вывод компилятора.

Хотя на рисунке 06 видно, что код скомпилирован, он создался не совсем правильным образом. Многие программисты просто игнорируют тот факт, что компилятор предупреждает их об ошибках. Это видно по красной стрелке.

Факт возникновения ошибки, даже, казалось бы, некритической, может подвергнуть код риску. Поэтому ни в коем случае нельзя использовать код, если компилятор сообщил о нем, что содержит неисправности. Не делайте этого НИКОГДА.

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

#property copyright "Daniel Jose"
#property link      ""
#property version   "1.00"
#property indicator_chart_window
#property indicator_plots 0
//+------------------------------------------------------------------+
int OnInit()
{
        return INIT_SUCCEEDED;
}
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[])
{
        return rates_total;
}
//+------------------------------------------------------------------+

Добавив выделенную строку, мы дадим компилятору понять, что знаем, что делаем. Результат показан на рисунке 07.

Рисунок 07

Рисунок 07 - Результат идеальной компиляции.

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

Можно подумать: "Но мы уже всё это знаем". Хорошо, но я хочу внести ясность. Я не хочу, чтобы кто-то жаловался, что система не работает или работает неправильно из-за какой-то модификации. Я хотел бы призвать всех модифицировать и адаптировать систему к собственным потребностям. А для этого сначала нужно знать основы, иметь прочный и сформированный фундамент знаний и представлений.

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


Начинаем создавать советник

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

Рисунок 08

Рисунок 08 - Что мы собираемся построить.

Рисунок 09

Рисунок 09 - Определяем используемый каталог.

Рисунок 10

Рисунок 10 - Определяем название исполняемого файла.

Как видите, мы делаем всё те же шаги, что и на этапе индикатора, единственное различие - это выбор, который мы сделали в начале создания.

Рисунок 11

Рисунок 11 - Оставим всё по умолчанию.

Рисунок 12

Рисунок 12 - Здесь нам нужно только нажать «Совершить».

После того, как мы выполним все эти действия, в редакторе MetaEditor появится файл, что можно увидеть ниже:

#property copyright "Daniel Jose"
#property link      ""
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+

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

Рисунок 13

Рисунок 13 - Результат запроса на компиляцию.

Вы можете подумать: к чему он клонит?! Успокойтесь, уважаемый читатель. Не переживайте. Скоро вы поймете, что мы собираемся делать. Спокойно.

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

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

Если вы не знаете, как это сделать, я вам рекомендую сначала научиться этому. Хорошей отправной точкой является данная статья: "Разработка торгового советника с нуля (Часть 10): Доступ к пользовательским индикаторам". В нем дается очень простое объяснение, как получить доступ к значениям, рассчитываемым индикатором. В то же время мы посмотрим как инициализировать индикатор очень простым способом, еще до того, как мы сможем получить доступ к любой информации, которая рассчитывалась в зависимости от того, что мы собираемся делать.

Всё это очень красиво и просто, потому что, используя идею рисунка 14, можно прочитать содержимое индикатора. Теперь, используя рисунок 15, можно создать индикатор с помощью советника.

Рисунок 14

Рисунок 14 - Советник считывает показания индикатора.

Рисунок 15

Рисунок 15 - Создание индикатора советником.

Но несмотря на это, такой способ не работает, когда нам нужно сделать что-то вроде того, что мы делали, используя Chart Trader. Когда мы превратили Chart Trader в индикатор, нам пришлось пойти другим путем. Это было в свое время, и даже там уже упоминалось, что в будущем это изменится. Там мы использовали то, что видно на рисунке 16.

Рисунок 16

Рисунок 16 - Двусторонняя связь.

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

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

Хотя система, показанная на рисунке 16, очень подходит для многих ситуаций, она не приносит особой пользы.

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

Возможно, вы спросите: как это возможно? Первый индикатор используется для управления репликацией/моделированием. Он у нас уже есть давно. Теперь нам нужен еще один: Chart Trader. Это позволяет нам отправлять ордеры напрямую. А Chart Trader нам нужен, потому что, в отличие от физического рынка, здесь, в репликации/моделировании, кнопки в верхнем углу (рис. 17) нам ни к чему.

Рисунок 17

Рисунок 17 - Кнопки Quick Trader.

Нам действительно нужен способ отправки ордеров, но он должен быть одинаковым, независимо от того, используем ли мы DEMO или REAL счет. Метод взаимодействия с платформой должен быть одинаковым.

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

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

Рисунок 18

Рисунок 18 - Новый протокол связи.

Глядя на этот рисунок, можно сразу подумать: "Вы с ума сошли? Как вы собираетесь заставить советник и индикатор общаться напрямую? Где подвох в этой истории?" Нет, это не шутка, и нет, я не сумасшедший. Дело в том, что существуют способы и средства прямой связи. Это видно на рисунках 14 и 15. Но помимо данных средств, в нашем распоряжении есть еще одно. На самом деле нам нужно понять, как наилучшим образом использовать эти средства.

Прежде, чем я продолжу, позвольте спросить вас: вы когда-нибудь тестировали или испытывали MetaTrader 5 не так, как все остальные? Вы экспериментировали с языком MQL5 до такой степени, чтобы открыть для себя новые неожиданные возможности? Если ответ на любой из этих двух вопросов - НЕТ, то я предлагаю вам посмотреть и понять, как далеко заходит кроличья нора.


Запускаем взаимодействие между процессами

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

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

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

В коде индикатора мы начинаем с добавления первых строк, как показано ниже.

 1. #property copyright "Daniel Jose"
 2. #property link      ""
 3. #property version   "1.00"
 4. #property indicator_chart_window
 5. #property indicator_plots 0
 6. //+------------------------------------------------------------------+
 7. #define def_ShortName       "SWAP MSG"
 8. #define def_ShortNameTmp    def_ShortName + "_Tmp"
 9. //+------------------------------------------------------------------+
10. input double user00 = 0.0;
11. //+------------------------------------------------------------------+
12. long m_id;
13. //+------------------------------------------------------------------+
14. int OnInit()
15. {
16.     m_id = ChartID();
17.     IndicatorSetString(INDICATOR_SHORTNAME, def_ShortNameTmp);
18.     if (ChartWindowFind(m_id, def_ShortName) != -1)
19.     {
20.              ChartIndicatorDelete(m_id, 0, def_ShortNameTmp);
21.             Print("Only one instance is allowed...");
22.             return INIT_FAILED;
23.     }
24.     IndicatorSetString(INDICATOR_SHORTNAME, def_ShortName);
25.     
26.     return INIT_SUCCEEDED;
27. }
28. //+------------------------------------------------------------------+
29. int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[])
30. {
31.     return rates_total;
32. }
33. //+------------------------------------------------------------------+

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

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

В строке 7 мы определяем, как будет называться наш индикатор. Это имя будет сохранено в MetaTrader 5 до тех пор, пока индикатор находится на графике.

Чтобы определить это имя, мы используем процедуру в строке 24. Здесь мы задаем имя, которое будет использовать индикатор. Причина, по которой мы определяем строку 8, заключается в способе работы MetaTrader 5.

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

Когда MetaTrader 5 запускает событие обновления, все объекты, индикаторы, советники и другие элементы, которые могут присутствовать на графике, должны быть каким-то образом обновлены. В случае скриптов они просто сбрасываются с графика, а в случае индикаторов и советников у них появляется новый вызов функции OnInit. Если что-то случится и индикатор придется обновлять с нуля, MetaTrader 5 принудительно вызовет строку 14. А в чем проблема? Проблема возникает, потому что нам нужно, чтобы индикатор имел короткое имя, которое распознается MetaTrader 5, иначе мы не сможем выполнить проверку, показанную в строке 18.

Можно подумать, что мы можем просто переставить строку 24 перед строкой 18, но в этом и кроется проблема. Если добавить строку 24 перед строкой 18, когда индикатор, отмеченный в строке 18, уже присутствует на графике, то получим положительный результат. Это приведет к тому, что MetaTrader 5 сбросит индикатор с графика, когда на самом деле мы хотим, чтобы он остался при выполнении строки 20. Но нужно, чтобы он был только в одном экземпляре.

Я не знаю, следите ли вы за течением разговора. По описанной выше причине, нам нужно временное имя, определяемое в строке 8, где мы вносим небольшое изменение в короткое имя индикатора перед проверкой, в строке 18, если индикатор уже находится на графике. Мы используем строку 17, чтобы задать временное имя индикатора. ПРИМЕЧАНИЕ: Это имя должно быть каким-то образом уникальным, иначе будут проблемы.

Если индикатор уже присутствует на графике, строка 18 позволит выполнить строку 20, тем самым убирая индикатор, который пытается попасть на график. Чтобы предупредить пользователя об ошибке, у нас есть строка 21, которая выводит сообщение в окне сообщений MetaTrader 5. А на строке 22 индикатор вернется, указывая, что не удалось опубликовать его на графике.

Если индикатор попадает на график, строка 24 исправит имя индикатора, поэтому разместить новый индикатор на графике будет в принципе невозможно. Но есть "лазейка", которая на самом деле является не пробелом MetaTrader 5, а характеристикой этой платформы: это способность различать их настолько, что он понимает, добавляем ли мы новый индикатор на график или нет, чему способствует добавление строки 10 в код.

Если пользователь НЕ ИЗМЕНИТ значение переменной при размещении индикатора на графике (переменная объявлена в строке 10), MetaTrader 5 поймет, что индикатор совпадает с тем, который уже находится на графике, если там уже такой есть. Если пользователь изменит значение, MetaTrader 5 может принять два совершенно разных решения, основываясь на том, является ли он тем же самым индикатором или добавляется новый.

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

Такой подход позволяет ограничить количество одноименных индикаторов на графике только одним. При желании можно разрешить максимальное количество индикаторов с одинаковым именем. Всё, что вам нужно сделать, - это изменить проверку в строке 18. Таким образом, можно настроить MetaTrader 5 так, чтобы он принимал, например, 3 индикатора с одинаковым именем. Однако, если пользователь попытается разместить четвертый индикатор с таким же именем, то MetaTrader 5 запретит это делать. Точнее, это сделает код индикатора: он предотвратит эту попытку разместить четвертый индикатор.

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

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

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


Заключение

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

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

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

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


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

Прикрепленные файлы |
swap.mq5 (1.24 KB)
Реализация расширенного теста Дики-Фуллера в MQL5 Реализация расширенного теста Дики-Фуллера в MQL5
В статье показаны реализация расширенного теста Дики-Фуллера и его применение для проведения коинтеграционных тестов с использованием метода Энгла-Грейнджера.
Разрабатываем мультивалютный советник (Часть 9): Сбор результатов оптимизации одиночных экземпляров торговой стратегии Разрабатываем мультивалютный советник (Часть 9): Сбор результатов оптимизации одиночных экземпляров торговой стратегии
Наметим основные этапы по разработке нашего советника. Одним из первых будет проведение оптимизации одиночного экземпляра разработанной торговой стратегии. Попробуем собрать в одном месте всю необходимую информацию о проходах тестера при оптимизации.
Нейросети — это просто (Часть 87): Сегментация временных рядов Нейросети — это просто (Часть 87): Сегментация временных рядов
Прогнозирование играет важную роль в анализе временных рядов. В новой статье мы поговорим о преимуществах сегментации временных рядов.
Разработка системы репликации (Часть 36): Внесение корректировок (II) Разработка системы репликации (Часть 36): Внесение корректировок (II)
Одна из вещей, которая может усложнить нашу жизнь как программистов, - это предположения. В этой статье я покажу вам, как опасно делать предположения: как в части программирования на MQL5, где принимается, что у курса будет определенная величина, так и при использовании MetaTrader 5, где принимается, что разные серверы работают одинаково.