Новая версия платформы MetaTrader 5 build 5660: улучшения и исправления - страница 9

 
Oleg Pavlenko #:

И при этом спишут 1 активацию...

Я Windows не переустанавливал и VPS тот же самый.

Насколько я понял, что терминал, в котором я изначально устанавливал с Маркета продукт, не существует, т.к. был удален за ненадобностью. Но я из него скопировал советников, которые работали без проблем в других терминалах, пока этот терминал не был удален.

Вот этот момент и нужно пересмотреть Метаквотам...

В инструкции про это ничего не написано. Есть информация, про переустановку Windows, а про то, что терминал, в котором была первая установка продукта и из которого продукты были скопированы в другие терминалы, в пределах того же Windows, удалять нельзя - такой информации нет.

За все время форума (пока я тут) - таких случаев небыло. Сам переношу и одного Метатрейдера на другой (а первый могу удалить), и без проблем.
-----------------

Потому что активция теряется 1) при обновлении Windows (если у вас VPS, то сам VPS провайдер мог что-то менять), или 2) другой способ авторизации (как админ, или "запуск от имени админа" и так далее), или 3) изменялось hardware.

За все время форума - были только эти случаи, хотя пользователи говорили о других вариантах и так сказать "багах", но пока ни один из таких "багов" подтвержден небыл, а были подтверждены только эти три случая.

 

b5677, некоторые части GUI Визуализатора не показывают актуальную информацию в режиме Pause+F12.

#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

input int inOffset = 1000;

#define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

// Удержание SL на постоянном расстоянии от текущей цены.
void OnTick()
{
  if (OrderSelect(0, SELECT_BY_POS))
    OrderModify(OrderTicket(), OrderOpenPrice(), Bid - inOffset * _Point, OrderTakeProfit(), 0);
  else
    OrderSend(_Symbol, OP_BUY, 1, Ask, 0, Bid - inOffset * _Point, 0);
}


Запускаем по реальным тикам Визуализатор. Жмем паузу и пробрасываем тики через F12.


На каждом тике (F12) будет воспроизводиться ситуация, когда в Журнале показан новый уровень SL, а в табличной GUI - нет. При этом SL в виде горизонтальной линии на чарте будет отображаться правильно.

Прошу исправить эту ошибку, спасибо.

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

 
Alain Verleyen #:
Проблема должна быть исправлена начиная со сборки 5686. Пожалуйста, подтвердите.
Прокси снова заработал, спасибо.
 

Окно символов Ctrl + U не запоминает расположение средней линии после закрытия.


 
Alain Verleyen #:
Проблема должна быть исправлена начиная со сборки 5686. Пожалуйста, подтвердите.
Работает, спасибо!
 
input group ""

теперь с такой записью в параметрах индикатора пишет это:


раньше была полностью пустая строка во всех полях

 

b5686, в режиме по тикам (сгенерированным и реальным) тиковый объем текущих баров неправильно вычисляется.

void OnTick()
{
  static int TickVolume = 0; // Тиковый объем текущего бара.
  static datetime NextTime = 0;
  
  const datetime CurrTime = TimeCurrent();
  
  // Если следующий бар.
  if (CurrTime >= NextTime)
  {
    NextTime = (CurrTime / PeriodSeconds(PERIOD_CURRENT) + 1) * PeriodSeconds(PERIOD_CURRENT);
    
    TickVolume = 0;
  }

  MqlRates Rates[];
  
  TickVolume++;  
  
  // Если тиковый объем текущего бара не совпадает с вычисленным.
  if ((CopyRates(_Symbol, PERIOD_CURRENT, 0, 1, Rates) > 0) && (Rates[0].tick_volume != TickVolume))
  {
    Print(TickVolume);
    ArrayPrint(Rates);
    
    DebugBreak();
  }
}


В режиме сгенерированных тиков хорошо видно, что иногда не хватает еще одного сгенерированного тика.

2025.01.02 04:53:59   102
2025.01.02 04:53:59                    [time]  [open]  [high]   [low] [close] [tick_volume] [spread] [real_volume]
2025.01.02 04:53:59   [0] 2025.01.02 04:53:00 2633.84 2634.25 2633.67 2634.24           103       13             0
2025.01.02 04:58:59   159
2025.01.02 04:58:59                    [time]  [open]  [high]   [low] [close] [tick_volume] [spread] [real_volume]
2025.01.02 04:58:59   [0] 2025.01.02 04:58:00 2634.37 2635.15 2634.37 2635.14           160       13             0
2025.01.02 04:59:59   143
2025.01.02 04:59:59                    [time]  [open]  [high]   [low] [close] [tick_volume] [spread] [real_volume]
2025.01.02 04:59:59   [0] 2025.01.02 04:59:00 2634.95 2635.36 2634.76 2634.78           144       15             0
2025.01.02 05:02:59   109
2025.01.02 05:02:59                    [time]  [open]  [high]   [low] [close] [tick_volume] [spread] [real_volume]
2025.01.02 05:02:59   [0] 2025.01.02 05:02:00 2635.30 2635.30 2634.45 2634.46           110       21             0


В режиме по реальным тикам наоборот происходит - тики приходят, а тиковый объем баров может не меняться.

2025.01.02 01:17:54   53
2025.01.02 01:17:54                    [time]  [open]  [high]   [low] [close] [tick_volume] [spread] [real_volume]
2025.01.02 01:17:54   [0] 2025.01.02 01:17:00 2624.70 2624.81 2624.27 2624.72            49       24             0
2025.01.02 01:18:15   2
2025.01.02 01:18:15                    [time]  [open]  [high]   [low] [close] [tick_volume] [spread] [real_volume]
2025.01.02 01:18:15   [0] 2025.01.02 01:18:00 2624.71 2624.71 2624.71 2624.71             1       24             0

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

 
fxsaber #:

b5686, в режиме по тикам (сгенерированным и реальным) тиковый объем текущих баров неправильно вычисляется.

В режиме сгенерированных тиков хорошо видно, что иногда не хватает еще одного сгенерированного тика.

В режиме по реальным тикам наоборот происходит - тики приходят, а тиковый объем баров может не меняться.

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

Тиковый объём в терминале считается по количеству тиков с изменением цены бид, то есть с флагом TICK_FLAG_BID.  Прикрепил индикатор для наглядности.

OnTick() вызывается не на каждом тике. На новом, но не на каждом. 

Файлы:
TickVolum.mq5  3 kb
 
Aleksandr Slavskii #:

Тиковый объём в терминале считается по количеству тиков с изменением цены бид, то есть с флагом TICK_FLAG_BID.

Вы правы, я ошибся с этим.

OnTick() вызывается не на каждом тике. На новом, но не на каждом. 

На каждом, конечно.


Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Новая версия платформы MetaTrader 5 build 5660: улучшения и исправления

fxsaber, 2026.03.16 12:05

В режиме сгенерированных тиков хорошо видно, что иногда не хватает еще одного сгенерированного тика.

2025.01.02 04:53:59   102
2025.01.02 04:53:59                    [time]  [open]  [high]   [low] [close] [tick_volume] [spread] [real_volume]
2025.01.02 04:53:59   [0] 2025.01.02 04:53:00 2633.84 2634.25 2633.67 2634.24           103       13             0
2025.01.02 04:58:59   159
2025.01.02 04:58:59                    [time]  [open]  [high]   [low] [close] [tick_volume] [spread] [real_volume]
2025.01.02 04:58:59   [0] 2025.01.02 04:58:00 2634.37 2635.15 2634.37 2635.14           160       13             0
2025.01.02 04:59:59   143
2025.01.02 04:59:59                    [time]  [open]  [high]   [low] [close] [tick_volume] [spread] [real_volume]
2025.01.02 04:59:59   [0] 2025.01.02 04:59:00 2634.95 2635.36 2634.76 2634.78           144       15             0
2025.01.02 05:02:59   109
2025.01.02 05:02:59                    [time]  [open]  [high]   [low] [close] [tick_volume] [spread] [real_volume]
2025.01.02 05:02:59   [0] 2025.01.02 05:02:00 2635.30 2635.30 2634.45 2634.46           110       21             0

Эта ошибка имеет место быть. Проверочный советник.

void OnTick()
{
  static int TickVolume = 0; // Тиковый объем текущего бара.
  static datetime NextTime = 0;
  static double PrevPrice;
  
  const datetime CurrTime = TimeCurrent();
  
  // Если следующий бар.
  if (CurrTime >= NextTime)
  {
    NextTime = (CurrTime / PeriodSeconds(PERIOD_CURRENT) + 1) * PeriodSeconds(PERIOD_CURRENT);
    
    TickVolume = 0;
    PrevPrice = 0;
  }

  MqlRates Rates[];
  MqlTick Tick;
  
  if (SymbolInfoTick(_Symbol, Tick) && (Tick.bid != PrevPrice))
  {    
    TickVolume++;  
    
    PrevPrice = Tick.bid;
  }
  
  // Если тиковый объем текущего бара не совпадает с вычисленным.
  if ((CopyRates(_Symbol, PERIOD_CURRENT, 0, 1, Rates) > 0) && (Rates[0].tick_volume != TickVolume))
  {
    Print(TickVolume);
    ArrayPrint(Rates);
    
    DebugBreak();
  }
}

Нужно подправить алгоритм генерации тиков.

 

b5686, заметил, что одна и та же конфигурация одиночного прохода может очень сильно отличаться по скорости выполнения.

2026.03.17 10:01:42.056 OnTester result 10267.59
2026.03.17 10:01:42.056 XAUUSD,M1: 62078689 ticks, 424072 bars generated. Environment synchronized in 0:00:00.171. Test passed in 0:00:17.569 (including ticks preprocessing 0:00:05.625).
2026.03.17 10:01:42.056 XAUUSD,M1: total time from login to stop testing 0:00:17.740 (including 0:00:00.171 for history data synchronization)
2026.03.17 10:01:42.056 1413 Mb memory used including 46 Mb of history data, 1280 Mb of tick data

2026.03.17 10:04:11.812 OnTester result 10267.59
2026.03.17 10:04:11.812 XAUUSD,M1: 62078689 ticks, 424072 bars generated. Environment synchronized in 0:00:00.149. Test passed in 0:00:26.733 (including ticks preprocessing 0:00:05.578).
2026.03.17 10:04:11.812 XAUUSD,M1: total time from login to stop testing 0:00:26.882 (including 0:00:00.149 for history data synchronization)
2026.03.17 10:04:11.812 1413 Mb memory used including 46 Mb of history data, 1280 Mb of tick data

Во время одиночного прохода вычислительная скорость не меняется. Просто в одном случае постоянная производительность выше на 50%, в другом - нет. Во всех случаях запускался один и тот же Агент (проверил по логам).


Как объяснить такую дикую разницу в производительности? Предполагаю, что иногда Агент подключается к частично загруженному (другими фоновыми задачами) CPU-ядру, а иногда - к свободному. Есть способ всегда заставлять Агент одиночного прохода выполняться на свободном CPU-ядре? Уж больно огромна разница в производительности.