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

Ошибка транскодирования в заголовке платформы \MQL5\Include\Math\Stat\Math.mqh после преобразования файла из кодировки UTF-16 в UTF-8.

Строка 5299:

//| Ссылка:                                                       |
//| Хайндман, Р. Дж. и Фан, Ю. (1996)                                |
//| «Выборка квантилей в статистических пакетах»,                      |
//| «American Statistician», т. 50, с.361– 365.                      |

amrali #:

Ошибка транскодирования в заголовке платформы \MQL5\Include\Math\Stat\Math.mqh после преобразования файла из UTF-16 в UTF-8.

Строка 5299:


Похоже, проблема на вашей стороне?

Я также проверил с помощью B6090.

Alain Verleyen #:

Похоже, проблема у вас?

Я также проверил с помощью B6090.

Спасибо за подтверждение.
b6157, при увеличении массива ArrayResize принудительно обнуляет доп. элементы.
double GetTrash( const uint Size = 1e8 )
{  
  double Res = 0;  
  double Array[];
  
  for (int i = ArrayResize(Array, Size); i-- > 0;)
    Res += Array[i];
    
  return(Size ? Res / Size : 1);  
}

void OnStart()
{
  Print(GetTrash()); // 0
}
Статические массивы (и переменные) не инициализируются.
fxsaber #:
b6157, при увеличении массива ArrayResize принудительно обнуляет доп. элементы. 
Ну хз, без подтверждения разрабов, я бы на это не полагался. А в справке это нигде не упоминается.

Шаблон для контроля скользящего максимального просадки в режиме реального времени на языке MQL5:

Советники проп-фирм требуют механизма контроля скользящего максимального просадки, который отслеживает максимальный пик собственного капитала и закрывает все позиции, если текущий собственный капитал опускается ниже порогового значения от этого пика. Тонкость, которую упускают большинство разработчиков MQL5: AccountInfoDouble(ACCOUNT_EQUITY) включает в себя плавающий нереализованный P&L, что правильно для данной цели — однако пиковое значение собственного капитала должно обновляться только в функции OnTick(), а не в OnTradeTransaction(), чтобы избежать «фантомных» пиков из-за частично исполненных ордеров:

double g_peakEquity = 0;
double g_maxDrawdownPct = 0.08; // 8 % просев

void OnTick()
{
   double equity = AccountInfoDouble(ACCOUNT_EQUITY);
   double balance = AccountInfoDouble(ACCOUNT_BALANCE);

   // Обновлять пиковое значение только на основе подтвержденного капитала, а не данных на момент совершения сделки
   if(equity > g_peakEquity)
      g_peakEquity = equity;

   // Проверить превышение максимального просадки
   if(g_peakEquity > 0)
   {
      double drawdown = (g_peakEquity - equity) / g_peakEquity;
      if(drawdown >= g_maxDrawdownPct)
      {
         CloseAllPositions(); // атомарное сглаживание
         ExpertRemove();
      }
   }
}

Стоит отметить: инициализация g_peakEquity значением AccountInfoDouble(ACCOUNT_BALANCE) в функции OnInit(), а не 0, предотвращает ложное срабатывание сигнала просадки на самом первом тике, если на момент запуска советника уже существует плавающий убыток.

fxsaber #:
b6157, при увеличении массива ArrayResize принудительно обнуляет доп. элементы.

Обнуление не гарантируется.