Ошибка транскодирования в заголовке платформы \MQL5\Include\Math\Stat\Math.mqh после преобразования файла из кодировки UTF-16 в UTF-8.
Строка 5299:
//| Ссылка: |//| Хайндман, Р. Дж. и Фан, Ю. (1996) |//| «Выборка квантилей в статистических пакетах», |//| «American Statistician», т. 50, с.361– 365. |
Шаблон для контроля скользящего максимального просадки в режиме реального времени на языке MQL5:
Советники проп-фирм требуют механизма контроля скользящего максимального просадки, который отслеживает максимальный пик собственного капитала и закрывает все позиции, если текущий собственный капитал опускается ниже порогового значения от этого пика. Тонкость, которую упускают большинство разработчиков MQL5: AccountInfoDouble(ACCOUNT_EQUITY) включает в себя плавающий нереализованный P&L, что правильно для данной цели — однако пиковое значение собственного капитала должно обновляться только в функции OnTick(), а не в OnTradeTransaction(), чтобы избежать «фантомных» пиков из-за частично исполненных ордеров:
double g_peakEquity = 0;
double g_maxDrawdownPct = 0.08; // 8 % просевvoidOnTick()
{
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, предотвращает ложное срабатывание сигнала просадки на самом первом тике, если на момент запуска советника уже существует плавающий убыток.
Не понимаю алгоритма, как принимается решение, что нужно сделать очередную запись. Цветом выделил две записи, между которыми 80 секунд. Смотрел график котировок за эти 80 секунд - там штиль. В общем, просьба пояснить. Но больше предложение.
Когда составляют портфель из двух ТС, то стараются посчитать корреляцию результатов этих ТС.
Для этого берут два Equity-вектора - значения Equity каждого бэктеста в одинаковых time-точках (например, в начале каждого часа или в начале каждых суток).
И после преобразования вычисляют корреляцию между ними.
vector GetVector( constdouble &Array[] )
{
vector Vector;
Vector.Assign(Array);
return(Vector);
}
double GetCorr( constdouble &Array1[], constdouble &Array2[] )
{
return(GetVector(Array1).CorrCoef(GetVector(Array2)));
}
void ChangeEquity( double &Equity[] )
{
for (int i = ArraySize(Equity) - 1; i > 0; i--)
Equity[i] = Equity[i] / Equity[i - 1] - 1;
Equity[0] = 0; // ArrayRemove(Equity, 0, 1);
}
voidOnStart()
{
double Equity1[]; // Equity первой ТС - запись каждый час.double Equity2[]; // Equity второй ТС - запись каждый час.
ChangeEquity(Equity1);
ChangeEquity(Equity2);
Print(GetCorr(Equity1, Equity2)); // Корреляция двух ТС.
}
Так вот просьба подумать над возможностью всегда записывать в tst каждый час Equity/Balance-значение в одиночном проходе.
Тогда будут данные для вычисления корреляций между ТС. Получим и график Equity/Balance, где абсцисса - время. Спасибо.
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Ошибка транскодирования в заголовке платформы \MQL5\Include\Math\Stat\Math.mqh после преобразования файла из кодировки UTF-16 в UTF-8.
Строка 5299:
Ошибка транскодирования в заголовке платформы \MQL5\Include\Math\Stat\Math.mqh после преобразования файла из UTF-16 в UTF-8.
Строка 5299:
Похоже, проблема на вашей стороне?
Я также проверил с помощью B6090.
Похоже, проблема у вас?
Я также проверил с помощью B6090.
b6157, при увеличении массива ArrayResize принудительно обнуляет доп. элементы.
Шаблон для контроля скользящего максимального просадки в режиме реального времени на языке MQL5:
Советники проп-фирм требуют механизма контроля скользящего максимального просадки, который отслеживает максимальный пик собственного капитала и закрывает все позиции, если текущий собственный капитал опускается ниже порогового значения от этого пика. Тонкость, которую упускают большинство разработчиков MQL5: AccountInfoDouble(ACCOUNT_EQUITY) включает в себя плавающий нереализованный P&L, что правильно для данной цели — однако пиковое значение собственного капитала должно обновляться только в функции OnTick(), а не в OnTradeTransaction(), чтобы избежать «фантомных» пиков из-за частично исполненных ордеров:
Стоит отметить: инициализация g_peakEquity значением AccountInfoDouble(ACCOUNT_BALANCE) в функции OnInit(), а не 0, предотвращает ложное срабатывание сигнала просадки на самом первом тике, если на момент запуска советника уже существует плавающий убыток.
b6157, при увеличении массива ArrayResize принудительно обнуляет доп. элементы.
Обнуление не гарантируется.
В Тестере в tst-файл пишутся данные графика Balance/Equity.
Запустил одиночный проход советника, который открывает в начале одну позицию, а тестер автоматически ее закрывает в конце прохода. Такой график.
Табличные данные этого графика.
Не понимаю алгоритма, как принимается решение, что нужно сделать очередную запись. Цветом выделил две записи, между которыми 80 секунд. Смотрел график котировок за эти 80 секунд - там штиль. В общем, просьба пояснить. Но больше предложение.
Когда составляют портфель из двух ТС, то стараются посчитать корреляцию результатов этих ТС.
Так вот просьба подумать над возможностью всегда записывать в tst каждый час Equity/Balance-значение в одиночном проходе.
Тогда будут данные для вычисления корреляций между ТС. Получим и график Equity/Balance, где абсцисса - время. Спасибо.
Строка для поиска: Uluchshenie 165.