Новая версия платформы MetaTrader 5 build 2980: Push-уведомления о торговых операциях - страница 43

 

Разработчикам - предложение  по ME:

Сделайте, пожалуйста, горячие кнопки для  быстрого перехода на начало/конец функции (внутри объявления класса - на начало/конец класса),

Например, CTRL-DOWN :переход на конец текущей ф-ии -> начало следущей -> её конец -> ...

CTRL-UP - аналогично вверх.

 

b3031

Делаю такой скрипт

   int si = 0;
   si = 1 / si;
   Print( si);

Компилирую по F7 и запускаю из терминала. В логе сообщение "zero divide, check divider ....", после чего терминал аварийно закрывается. Не всегда с первого раза, но если несколько раз подряд запустить, то с 3-4 раза точно вылет.

Вылет терминала


2021.09.01 18:38:35.722 Terminal        MetaTrader 5 x64 build 3031 started for MetaQuotes Software Corp.
2021.09.01 18:38:35.722 Terminal        Windows 7 Service Pack 1 build 7601, Intel Core i5-2520M  @ 2.50GHz, 2 / 7 Gb memory, 29 / 287 Gb disk, IE 11, UAC, GMT+3
 

Похожий скрипт:

   static int si = 0;
   si = 1 / si;
   Print(1 / si); 


По F7 все работает, печатает 0, никаких сообщений об ошибке.

static переменные как-то иначе обрабатываются?

 
mktr8591 #:

b3031

Делаю такой скрипт

Компилирую по F7 и запускаю из терминала. В логе сообщение "zero divide, check divider ....", после чего терминал аварийно закрывается. Не всегда с первого раза, но если несколько раз подряд запустить, то с 3-4 раза точно вылет.


Видимо это защита от издевательства над терминалом)))

 
В поисках утечек памяти нарвался на этот недуг.
#define TOSTRING(A) #A + " (" + (string)(A) + ")"

void OnStart()
{
  MqlTick Ticks[];
  
  CopyTicksRange(_Symbol, Ticks, COPY_TICKS_ALL, D'2020.09.01' * 1000);
  ArrayFree(Ticks);

  ExpertRemove();  
  CopyTicksRange(_Symbol, Ticks, COPY_TICKS_ALL, D'2020.09.01' * 1000);
  
  const int MemoryTicks = (int)(((long)ArraySize(Ticks) * sizeof(MqlTick)) >> 20);
  const int MemoryMQL = MQLInfoInteger(MQL_MEMORY_USED);
  
  Print(TOSTRING(MemoryMQL) + " - " + TOSTRING(MemoryTicks) + " = " + (string)(MemoryMQL - MemoryTicks) + " MB.");
}


2021.09.02 03:39:28.488 ExpertRemove() function called
2021.09.02 03:39:30.961 MemoryMQL (1652) - MemoryTicks (0) = 1652 MB.

Либо неправильная работа MQL_MEMORY_USED, либо, действительно, скрипт потребляет значительно больше памяти, чем должен.

 

Все же удалось обнаружить утечку памяти.

#define TOSTRING(A) #A + " (" + (string)(A) + ")"

void OnStart()
{
  Print(TOSTRING(TerminalInfoInteger(TERMINAL_BUILD)));
  Print(TOSTRING(TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE)));
  
  for (int i = SymbolsTotal(true) - 1; !IsStopped() && (i >= 0); i--)
  {
    MqlTick Ticks[];
    
    const string Symb = SymbolName(i, true); 

    CopyTicksRange(Symb, Ticks, COPY_TICKS_ALL, D'2020.09.01' * 1000);
    
    const int MemoryTicks = (int)(((long)ArraySize(Ticks) * sizeof(MqlTick)) >> 20);
    const int MemoryMQL = MQLInfoInteger(MQL_MEMORY_USED);
    
    Print(Symb + ": " + TOSTRING(MemoryMQL) + " - " + TOSTRING(MemoryTicks) + " = " + (string)(MemoryMQL - MemoryTicks) + " MB.");
  }    
}


Запуск на RannForex-Server.

2021.09.02 03:49:16.269 TerminalInfoInteger(TERMINAL_BUILD) (3031)
2021.09.02 03:49:16.281 TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE) (31859)
2021.09.02 03:49:17.507 USDSGD: MemoryMQL (867) - MemoryTicks (857) = 10 MB.
2021.09.02 03:49:20.813 USDSEK: MemoryMQL (2286) - MemoryTicks (2266) = 20 MB.
2021.09.02 03:49:28.705 USDNOK: MemoryMQL (4675) - MemoryTicks (4646) = 29 MB.
2021.09.02 03:49:28.895 USDHKD: MemoryMQL (4822) - MemoryTicks (145) = 4677 MB.
2021.09.02 03:49:31.120 NZDUSD: MemoryMQL (6095) - MemoryTicks (1407) = 4688 MB.
2021.09.02 03:49:33.988 NZDJPY: MemoryMQL (6424) - MemoryTicks (1730) = 4694 MB.
2021.09.02 03:49:35.697 NZDCHF: MemoryMQL (5697) - MemoryTicks (1012) = 4685 MB.
2021.09.02 03:49:38.218 NZDCAD: MemoryMQL (6231) - MemoryTicks (1542) = 4689 MB.
2021.09.02 03:49:43.856 GBPNZD: MemoryMQL (7519) - MemoryTicks (2822) = 4697 MB.
2021.09.02 03:49:51.407 GBPAUD: MemoryMQL (7871) - MemoryTicks (3167) = 4704 MB.
2021.09.02 03:49:51.682 606416896 bytes of leaked memory


На b3007 все отлично.

2021.09.02 03:50:43.789 TerminalInfoInteger(TERMINAL_BUILD) (3007)
2021.09.02 03:50:43.793 TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE) (32282)
2021.09.02 03:50:45.318 USDSGD: MemoryMQL (867) - MemoryTicks (857) = 10 MB.
2021.09.02 03:50:48.817 USDSEK: MemoryMQL (2286) - MemoryTicks (2266) = 20 MB.
2021.09.02 03:50:56.642 USDNOK: MemoryMQL (4675) - MemoryTicks (4646) = 29 MB.
2021.09.02 03:50:57.232 USDHKD: MemoryMQL (148) - MemoryTicks (145) = 3 MB.
2021.09.02 03:50:59.400 NZDUSD: MemoryMQL (1420) - MemoryTicks (1407) = 13 MB.
2021.09.02 03:51:02.112 NZDJPY: MemoryMQL (1749) - MemoryTicks (1730) = 19 MB.
2021.09.02 03:51:03.789 NZDCHF: MemoryMQL (1023) - MemoryTicks (1012) = 11 MB.
2021.09.02 03:51:06.186 NZDCAD: MemoryMQL (1557) - MemoryTicks (1542) = 15 MB.
2021.09.02 03:51:10.495 GBPNZD: MemoryMQL (2845) - MemoryTicks (2822) = 23 MB.
2021.09.02 03:51:15.287 GBPAUD: MemoryMQL (3196) - MemoryTicks (3167) = 29 MB.


Но даже здесь по какой-то причине скрипт потребляет на несколько десятков мегабайтов больше, чем должен.

Строка для поиска: Oshibka 032.

 
mktr8591 #:

b3031

Делаю такой скрипт

Компилирую по F7 и запускаю из терминала. В логе сообщение "zero divide, check divider ....", после чего терминал аварийно закрывается. Не всегда с первого раза, но если несколько раз подряд запустить, то с 3-4 раза точно вылет.


Win7

Вы используете виртуальную машину?
Если да, то какую и какая ОС на хосте ?

 
mktr8591 #:

Похожий скрипт:


По F7 все работает, печатает 0, никаких сообщений об ошибке.

static переменные как-то иначе обрабатываются?

Спасибо за сообщение - переоптимизация, исправим

выражение с делением заменялось на

si = uint(si + 1)<3 ? si : 0;

это оптимизация для 1/X, расчитана была на софтверную проверку X==0 до деления, которую отключили.

 
Ilyas #:

Win7

Вы используете виртуальную машину?
Если да, то какую и какая ОС на хосте ?

не использую. Только Win7 на ноуте.
 
терминал portabe