Особенности языка mql5, тонкости и приёмы работы - страница 311

 
Не нашёл в справке MQL5 функцию iMAOnArray(). Есть ей замена?
 
Vitaly Murlenko #:
Я не нашел функцию iMAOnArray() в справке по MQL5. Существует ли ее замена?

Нет.

Посмотрите мой код, в котором в качестве замены используется пользовательская функция "iMaOnArray()" другого кодера:

Code Base

Brooky Trend Strength для MT5

Ryan L Johnson, 2025.04.29 19:52

Этот индикатор вызывает 3 других подоконных индикатора. Все файлы находятся в папке Indicators.

 
Ryan L Johnson #:
iMaOnArray

Спасибо. Функция считает ровно? Косяков нет?

 
Vitaly Murlenko #:

Спасибо. Функция считает равномерно? Нет ошибок?

Пожалуйста.

Да, при условии, что она реализована правильно. Пользовательская функция занимает много времени, потому что это не стандартная функция. Смотрите мой основной файл mq5 для этого индикатора в качестве примера.

 
Ryan L Johnson #:

Пожалуйста.

Да, при условии, что она реализована правильно. Пользовательская функция занимает много времени, потому что это не стандартная функция. Смотрите мой основной файл mq5 для этого индикатора в качестве примера.

Я его скопировал. Спасибо.

 
fxsaber #:
Обратите внимание на такие конструкции в своих исходниках. После b5200 они могут прекратить работать
struct A
{
  int Array[];
  
  int ArrayResize( const int Size )
  {
    return(ArrayResize(this.Array, Size));   // wrong parameters count, 2 passed, but 1 requires
    return(::ArrayResize(this.Array, Size)); // OK
  }
};
 
Vitaly Murlenko #: Я не нашел функцию iMAOnArray() в справке по MQL5. Есть ли замена для нее?

Переход с MQL4 на MQL5 - MQL5 Статьи № 17 (2010)

 
Сколько на самом деле свободной памяти.
// Максимально-возможное количество элементов для массива.
template <typename T>
ulong ArraySizeMax( void )
{
  T Array[];
  
  ulong Left = 0;
  ulong Right = ((ulong)::TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE) / sizeof(T)) << 20;
  
  while (Left < Right - 1)
  {
    const ulong Middle = (Left + Right) >> 1;
    
    if (::ArrayResize(Array, (int)Middle) == -1)
      Right = Middle;
    else 
    {
      Left = Middle;
      
      ::ArrayResize(Array, 0, -1); // https://www.mql5.com/ru/forum/462835/page23#comment_52768225
    }
  }
  
  return(Left);
}

// Количество свободной памяти в мегабайтах.
int TerminalMemoryAvailable( void ) { return((int)((ArraySizeMax<MqlTick>() * sizeof(MqlTick)) >> 20)); }


Применение.

#define PRINT(A) Print(#A + " = " + (string)(A))

void OnStart()
{
  PRINT(::TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE));
  PRINT(TerminalMemoryAvailable());
}


Результат.

::TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE) = 23913
TerminalMemoryAvailable() = 3050
 
Прошу подсказать, почему в одном случае ошибка, а в другом - нет.
class A
{
public:  
  double Array[5];
  int Pos;

  double operator []( const int iPos ) { return(this.Array[this.Pos = iPos]); }
  
  A* operator ~( void ) { return(&this); }
  
  void operator =( const double Value ) { this.Array[this.Pos] = Value; }
};

class B
{
public:  
  MqlTick Array[5];
  int Pos;

  MqlTick operator []( const int iPos ) { return(this.Array[this.Pos = iPos]); }
    
  B* operator ~( void ) { return(&this); }
  
  void operator =( const MqlTick &Value ) { this.Array[this.Pos] = Value; }
};

void OnStart()
{
  A a; 
  (~a)[0] = a[1]; // 'operator[]' - l-value required
  
  B b;
  (~b)[0] = b[1]; // OK.
}
 

Тестер по анализу EX5 мог бы точно знать, есть ли вызовы HistorySelect-функций, и тогда не тратить вычислительные ресурсы на формирование подробных исторических таблиц.

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

И т.д.


А как в исходнике с одного места по другое автоматически понять, что нет вызовов определенных функций? Чтобы, соответственно, самому отключать свой невостребованный функционал прямо в исходнике.