Бета-версия платформы MetaTrader 5 build 2155: Области видимости в MQL5, глобальное обновление тестера стратегий и встроенного хостинга - страница 2

 
Sergey Chalyshev:

Надеюсь на это.

Я знаю что такое FIFO.

Поэтому и не понятно. Значит на хеджинговом счете например цена дошла до Тейк Профита - а сервер в ответ FIFO ?

Как и где посмотреть эту очередь FIFO?

На бирже я знаю как, а на форекс не представляю.

MQL5: Добавлена поддержка закрытия позиций по правилу FIFO.

  • В перечисление ENUM_ACCOUNT_INFO_INTEGER добавлено значение ACCOUNT_FIFO_CLOSE — признак того, что позиции можно закрывать только по правилу FIFO. Если значение свойства равно true, то позиции по каждому символу разрешается закрывать только в том порядке, в котором они были открыты — сначала самую старую, затем более новую и т.д. При попытке закрыть позиции в ином порядке будет получена ошибка. Для счетов без хеджингового учета позиций (ACCOUNT_MARGIN_MODE!=ACCOUNT_MARGIN_MODE_RETAIL_HEDGING) свойство всегда равно false.
  • Добавлен новый код возврата сервера TRADE_RETCODE_FIFO_CLOSE — запрос отклонен, так как для торгового счета установлено правило "Разрешено закрывать существующие позиции только по правилу FIFO".

Закрытие позиций может осуществляться тремя основными способами:

  • Закрытие через клиентский терминал — это закрытие позиций трейдером вручную, при помощи торгового робота, через сервис "Сигналы" и т.д. При попытке закрыть позиции не по правилу FIFO трейдер получит соответствующую ошибку.
  • Закрытие при срабатывании Стоп Лосса или Тейк Профита — эти ордера обрабатываются на стороне сервера, соответственно и закрытие позиций в таком случае инициируется не трейдером (терминалом), а самим сервером. Если для позиции сработал Стоп Лосс или Тейк профит, и эта позиция не соответствует правилу FIFO (по тому же инструменту есть более ранние позиции), то она не будет закрыта.
  • Закрытие при срабатывании Стоп аута — такие операции также обрабатываются на стороне сервера. В обычном режиме, когда закрытие по правилу FIFO отключено, при наступлении Стоп аута позиции закрываются, начиная с самой убыточной. При включении этой опции у закрываемых убыточных позиции будет дополнительно проверяться время их открытия. Сервер определяет убыточные позиции по каждому символу, находит для каждого символа наиболее старую позицию, а затем из найденных позиций закрывает ту, что дает наибольший убыток.
 

Где-то с прошлого месяца в MQL запретили размещать шаблоны внутри функций:

template<typename T>
void func(T arg)
{
  struct internal
  {
    template<typename TT>  // template declarations are not allowed in local classes
    static void f(TT) { }  
    static void f(double) { }
  };
  
  internal::f(arg);
};
Не очень понятно, с какой целью это было сделано, кому это мешало?  Зачем урезать и без того ограниченный функционал MQL?

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

#define SWAP(a, b) { \
  struct internal { \
    template<typename T> \
      static void swap(T &a, T &b) { T temp=a; a=b; b=temp; } \
  };\   
  internal::swap(a, b); \
}

void Main()
{
  int i, j;
  SWAP(i, j);
}
Зачем оборачивать это в макрос - спросят некоторые?  А затем, что необходима проверка валидности типов, передаваемых в шаблон. В данном случае - это наличие доступного конструктора и оператора копирования. Если их нет, то будем иметь ошибку ПО МЕСТУ ВЫЗОВА макроса:
class A { public: A(int); };

void Main()
{
  A a(1), b(2);
  SWAP(a, b); // 'A' - wrong parameters count
}

Если же использовать голый шаблон, то потом придётся искать место в коде, откуда он был вызван. Скудные возможности Метаэдитора никак не помогут с этим.

template<typename T> \
void Swap(T &a, T &b) { T temp=a; a=b; b=temp; } // 'A' - wrong parameters count  // Откуда вызван этот шаблон?


В С++ для этих целей используют sfinae-проверки, кучей всевозможных способов, например так:

template<typename T, int dummy=sizeof(T(T&))>
void Swap(T& a, T& b) { T temp=a;  a=b;  b=temp; }

Короче, в C++ (и в C#) имеются штатные возможности для нормальной удобной работы в шаблонами. Поэтому там не нужны ни макросы, ни внутренние шаблоны в функциях, ни прочие костыли.  В MQL же, за неимением лучшего, приходится спасаться тем, что есть.  Но когда и эти возможности вдруг обрезают, не пойми зачем...

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

MetaQuotes Software Corp.:

8. MQL5: Ускорен доступ к данным таймсерий при помощи функций iTime, iOpen, iHigh, iLow, iClose, iVolume, iTickVolume, iSpread. 

проверил, по моему ничего не изменилось, тест в топике https://www.mql5.com/ru/forum/318901/page14#comment_13296824

функции iTime, iOpen, iHigh, iLow, iClose так и работают ровно в 2 раза медленнее чем  CopyXXXX() функции

 

Странная работа тестера стратегий - при оптимизации получаю ошибку

2019.09.23 09:02:32.966 Core 4  pass 22 tested with error "critical runtime error 502 in OnTick function (array out of range, module Experts\TZ_Sky_and_Ground_V_04_test.ex5, file Catboost.mqh, line 175, col 26)" in 0:00:03.986

А при одиночном проходе её нет.

В чем разница, если агент на локальном компьютере? Как отловить ошибку?

Билд 2155

 
Входные переменные типа bool превращаются после теста/оптимизации рандомно в 1 и 0, при нажатии на них true и false появляется опять - раздражает - или так или так уж.
 
Artyom Trishkin:
MQL5: Добавлена поддержка закрытия позиций по правилу FIFO.

  • В перечисление ENUM_ACCOUNT_INFO_INTEGER добавлено значение ACCOUNT_FIFO_CLOSE — признак того, что позиции можно закрывать только по правилу FIFO. Если значение свойства равно true, то позиции по каждому символу разрешается закрывать только в том порядке, в котором они были открыты — сначала самую старую, затем более новую и т.д. При попытке закрыть позиции в ином порядке будет получена ошибка. Для счетов без хеджингового учета позиций (ACCOUNT_MARGIN_MODE!=ACCOUNT_MARGIN_MODE_RETAIL_HEDGING) свойство всегда равно false.
  • Добавлен новый код возврата сервера TRADE_RETCODE_FIFO_CLOSE — запрос отклонен, так как для торгового счета установлено правило "Разрешено закрывать существующие позиции только по правилу FIFO".

Закрытие позиций может осуществляться тремя основными способами:

  • Закрытие через клиентский терминал — это закрытие позиций трейдером вручную, при помощи торгового робота, через сервис "Сигналы" и т.д. При попытке закрыть позиции не по правилу FIFO трейдер получит соответствующую ошибку.
  • Закрытие при срабатывании Стоп Лосса или Тейк Профита — эти ордера обрабатываются на стороне сервера, соответственно и закрытие позиций в таком случае инициируется не трейдером (терминалом), а самим сервером. Если для позиции сработал Стоп Лосс или Тейк профит, и эта позиция не соответствует правилу FIFO (по тому же инструменту есть более ранние позиции), то она не будет закрыта.
  • Закрытие при срабатывании Стоп аута — такие операции также обрабатываются на стороне сервера. В обычном режиме, когда закрытие по правилу FIFO отключено, при наступлении Стоп аута позиции закрываются, начиная с самой убыточной. При включении этой опции у закрываемых убыточных позиции будет дополнительно проверяться время их открытия. Сервер определяет убыточные позиции по каждому символу, находит для каждого символа наиболее старую позицию, а затем из найденных позиций закрывает ту, что дает наибольший убыток.

Артем, зачем вы скопировали еще раз это?

Вам всё понятно? Объясните тогда.

Если на одном символе запущено несколько разных советников, или в одном советнике несколько стратегий, как контролировать эту FIFO?

Или открыто несколько позиций с одинаковым для всех уровнем ТP и SL, некоторые сработают а некоторые будут отклонены?

Или предлагаете не торговать у брокеров через МТ5 с включенной функцией контроля FIFO?

p.s. Вы будете учитывать нововведение в вашей библиотеке и статьях?
 
Aleksey Vyazmikin:

Как отловить ошибку?

Сделайте проверку на все ArrayResize и ArrayCopy: если завершилась неудачно - TesterStop c подробными записями в Common-папку.

 
Sergey Chalyshev:

Артем, зачем вы скопировали еще раз это?

Вам всё понятно? Объясните тогда.

Если на одном символе запущено несколько разных советников, или в одном советнике несколько стратегий, как контролировать эту FIFO?

Или открыто несколько позиций с одинаковым для всех уровнем ТP и SL, некоторые сработают а некоторые будут отклонены?

Или предлагаете не торговать у брокеров через МТ5 с включенной функцией контроля FIFO?

p.s. Вы будете учитывать нововведение в вашей библиотеке и статьях?
  1. Потому, что здесь всё написано
  2. Каждый советник должен уметь отличать свои позиции от чужих, а значит - он видит все позиции, и найти свою самую позднюю не составляет труда.
  3. Вот это нужно бы проверить.
  4. Нет, не предлагаю.
  5. ЗЫ. Уже внёс новые параметры в объекты символа и аккаунта. Да, конечно будет метод закрытия позиций по правилу "первый пришёл - первым ушёл", причём такое закрытие уже давно прописано в планах библиотеки, и ничего нового в планах не появилось (кроме уже добавленных новых свойств)
 
Artyom Trishkin:
  1. ..
  2. Каждый советник должен уметь отличать свои позиции от чужих, а значит - он видит все позиции, и найти свою самую позднюю не составляет труда.

Проблемы будут только если первой пришла сделка от другого советника. А закрыть сейчас нужно сделку от второго :)

 
Sergey Chalyshev:

Как эти придумки отразятся на трейдерах?

Никак не отразятся. Просто сейчас стало возможным узнать о наличии/отсутствии FIFO через MQL.

Например, ставите в Маркет-продукте в OnInit эту проверку. Если true - INIT_FAILED.