Ошибки, баги, вопросы - страница 3692

 
Andrei Sokolov #:
Спасиб, понятно. ИМХО это плохое решение.
Только-что несколько часов из-за этого потерял. И предположу что не один я.
 
2025.12.25 17:02:56.897 Custom Indicator loading of ЗигЗаг2 (EURUSD,H1) from C:\Users\iboot\AppData\Roaming\MetaQuotes\Terminal\13D328DF9978D5F0B37C129C3201FDCB\MQL5\Indicators\Мой\ЗигЗаг2.ex5 failed [539]

Не могу запустить индикатор, пишет о какой-то ошибке
 
Ivan Butko #:
Не могу запустить индикатор, пишет о какой-то ошибке

Было такое при компиляции индикатора в билде 5488.

Перекомпилировал в другой более старой версии и всё ок.

 
Подскажите пож. почему у меня при каждой загрузке терминала объемы на панели быстрого доступа сбрасываются на всех вкладках. Рисуются от фонаря, когда 5 лотов на всех вкладках, когда 20. Они что не должны сохраняться при закрытии терминала
 
Aleksandr Kharain #:
Подскажите пож. почему у меня при каждой загрузке терминала объемы на панели быстрого доступа сбрасываются на всех вкладках. Рисуются от фонаря, когда 5 лотов на всех вкладках, когда 20. Они что не должны сохраняться при закрытии терминала

   

 

Простая функция расчета минимального эквити и просадки:

double EQUITYMIN,EQUITY_DD,EQUITYDD_PERCENT,EQUITY_DDREL_PERCENT,EQUITY_DD_RELATIVE;
int OnInit(void){
....
   EQUITY_DD=EQUITYDD_PERCENT=EQUITY_DDREL_PERCENT=EQUITY_DD_RELATIVE=0; EQUITYMIN=DBL_MAX;//инициализация
   return(INIT_SUCCEEDED);
}
void Equity(double equity){
   static double max_e=0,DDe,DDEq;
   EQUITYMIN=fmin(equity,EQUITYMIN);
   max_e = fmax(equity, max_e);
   DDe = max_e - equity;
   DDEq = DDe / max_e * 100.0;
   if(EQUITY_DD < DDe){ EQUITY_DD = DDe; EQUITYDD_PERCENT = DDEq;}//макс просадка в деньгах и %
   if(EQUITY_DDREL_PERCENT < DDEq){EQUITY_DDREL_PERCENT = DDEq; EQUITY_DD_RELATIVE = DDe;}// момент максимальной просадки  в % 
}
void OnDeinit(const int reason) {
  Equity(AccountInfoDouble(ACCOUNT_EQUITY));//вызов с финальным эквити
  Print("EQUITYMIN = ",DoubleToString(EQUITYMIN,2));
  Print("EQUITY_DD = ",DoubleToString(EQUITY_DD,2));
  Print("EQUITYDD_PERCENT = ",DoubleToString(EQUITYDD_PERCENT,2));
  Print("EQUITY_DDREL_PERCENT = ",DoubleToString(EQUITY_DDREL_PERCENT,2));
  Print("EQUITY_DD_RELATIVE = ",DoubleToString(EQUITY_DD_RELATIVE,2));
}

Для теста добавил её к советнику - примеру \Experts\Examples\Moving Average\Moving Average.mq5

Значения из тестера:


Рассчитанные и распечатанные значения: (отличия выделены)

EQUITYMIN = 7825.73
EQUITY_DD = 2174.27
EQUITYDD_PERCENT = 21.74
EQUITY_DDREL_PERCENT = 21.74
EQUITY_DD_RELATIVE = 2174.27

Расчетная просадка эквити на $1,56 хуже.Тут немного.

В другом эксперте с траллом эквити волатильнее. Там такие отличия:


Расчетная просадка эквити на $20 хуже.

Получается что MT5 тестер показывает всегда лучшие (меньшие) просадки эквити.

Вроде код элементарный. Что не так? MT5 по другому считает эквити? Плохо, что там просадки меньше, чем в реальноости.

Код отредактированного \Moving Average.mq5 приложил, чтобы любой мог проверить. Build 5327.
Файлы:
test.mq5  18 kb
 

Equity Drawdown Absolute дублируется в следующей строке.

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

 
Забыл упомянуть - тест по реальным тикам.
 
Aleksei Kuznetsov #:

Вроде код элементарный. Что не так?

Вызов расчета эквити только в конце OnTick.
 
fxsaber #:
Вызов расчета эквити только в конце OnTick.

Так и сделано в приложеном коде.

void OnTick(void)
  {
//---
   if(SelectPosition())
      CheckForClose();
   else
      CheckForOpen();
   
   Equity(AccountInfoDouble(ACCOUNT_EQUITY));
//---
  }

В моем коде тоже в конце.

Пробовал и в начале - без изменений.