Новая версия платформы MetaTrader 4 build 1330 - страница 2

 
Владимир:

Может кто знает, какое имеется штатное перечисление вместо ENUM_SERIESMODE ?

На это:        extern ENUM_SERIESMODE Var1 = MODE_LOW;      - компилятор выдает предупреждение:

implicit conversion from 'enum ENUM_MARKETINFO' to 'enum ENUM_SERIESMODE'

ENUM_SERIESMODE::MODE_LOW' will be used instead of 'ENUM_MARKETINFO::MODE_LOW'

F1 тоже ничего не знает по ENUM_SERIESMODE. И вообще не найдено никакого ENUM для перечисления MODE_OPEN/MODE_LOW/MODE_HIGH/MODE_CLOSE/MODE_VOLUME/MODE_TIME, хотя теоретически что-то должно быть. Ответов нигде не нашел, только постановку вопроса:  Бета-версия платформы MetaTrader 4 build 1145 - MQL4 и MetaTrader 4 - Форум алго-трейдеров MQL4 - Страница 8 (mql5.com)

Выделил.

 
Владимир:

Может кто знает, какое имеется штатное перечисление вместо ENUM_SERIESMODE ?

На это:        extern ENUM_SERIESMODE Var1 = MODE_LOW;      - компилятор выдает предупреждение:

implicit conversion from 'enum ENUM_MARKETINFO' to 'enum ENUM_SERIESMODE'

ENUM_SERIESMODE::MODE_LOW' will be used instead of 'ENUM_MARKETINFO::MODE_LOW'

F1 тоже ничего не знает по ENUM_SERIESMODE. И вообще не найдено никакого ENUM для перечисления MODE_OPEN/MODE_LOW/MODE_HIGH/MODE_CLOSE/MODE_VOLUME/MODE_TIME, хотя теоретически что-то должно быть. Ответов нигде не нашел, только постановку вопроса:  Бета-версия платформы MetaTrader 4 build 1145 - MQL4 и MetaTrader 4 - Форум алго-трейдеров MQL4 - Страница 8 (mql5.com)

Попробуйте вместо extern использовать input.
 
Владимир:

Может кто знает, какое имеется штатное перечисление вместо ENUM_SERIESMODE ?

На это:        extern ENUM_SERIESMODE Var1 = MODE_LOW;      - компилятор выдает предупреждение:

implicit conversion from 'enum ENUM_MARKETINFO' to 'enum ENUM_SERIESMODE'

ENUM_SERIESMODE::MODE_LOW' will be used instead of 'ENUM_MARKETINFO::MODE_LOW'

F1 тоже ничего не знает по ENUM_SERIESMODE. И вообще не найдено никакого ENUM для перечисления MODE_OPEN/MODE_LOW/MODE_HIGH/MODE_CLOSE/MODE_VOLUME/MODE_TIME, хотя теоретически что-то должно быть. Ответов нигде не нашел, только постановку вопроса:  Бета-версия платформы MetaTrader 4 build 1145 - MQL4 и MetaTrader 4 - Форум алго-трейдеров MQL4 - Страница 8 (mql5.com)


extern ENUM_SERIESMODE Var1 = ENUM_SERIESMODE::MODE_LOW;
 
PapaYozh:
extern ENUM_SERIESMODE Var1 = ENUM_SERIESMODE::MODE_LOW;

Предупреждение перестало появляться. Но - выбор значений предлагается из ENUM_APPLIED_PRICE (PRICE_CLOSE/PRICE_OPEN/PRICE_HIGH/...) вместо MODE_OPEN/MODE_LOW/MODE_HIGH/...  <-- Наверное не туда глянул.    ENUM_SERIESMODE::MODE_LOW  - это помогло, Спасибо!

"Попробуйте вместо extern использовать input." - нет эффекта.

 

Интересно, как получить эти надписи иным образом?

extern ENUM_MARKETINFO Var1 = MODE_LOW; 
 
void OnInit() {}
 

На VPS на MT5-терминалах библиотека стала алертить. Полез в Windows TaskManager и обнаружил CPU 100%.


На всех MT4-терминалах b1330, где были запущены торговые роботы, получил зависание почти всех советников (некоторые остались работать. Индикаторы все работают).

Когда штатно делал Remove каждого зависшего, то сначала получал "Не отвечает", и спустя много секунд советник удалялся.


После снятия всех зависших советников в Experts-логе такие строки.

2021.04.02 08:21:34.070 Expert Test9 EURUSD.rann,M1: removed
2021.04.02 08:21:25.525 Test9 EURUSD.rann,M1: shutdown by timeout
2021.04.02 08:20:45.082 Expert Test9 GBPUSD.rann,M1: removed
2021.04.02 08:20:36.521 Test9 GBPUSD.rann,M1: shutdown by timeout
2021.04.02 08:20:01.061 Expert Test9 USDCAD.rann,M1: removed
2021.04.02 08:19:52.516 Test9 USDCAD.rann,M1: shutdown by timeout
2021.04.02 08:18:48.078 Expert Test9 USDCHF.rann,M1: removed
2021.04.02 08:18:39.518 Test9 USDCHF.rann,M1: shutdown by timeout
2021.04.02 08:17:47.046 Expert Test9 AUDNZD.rann,M1: removed
2021.04.02 08:17:38.516 Test9 AUDNZD.rann,M1: shutdown by timeout
2021.04.02 08:16:51.090 Expert Test9 AUDUSD.rann,M1: removed
2021.04.02 08:16:42.514 Test9 AUDUSD.rann,M1: shutdown by timeout


В Journal-логе:

2021.04.02 08:21:34.070 Expert Test9 EURUSD.rann,M1: removed
2021.04.02 08:21:34.039 Terminate execution thread #6688
2021.04.02 08:20:45.082 Expert Test9 GBPUSD.rann,M1: removed
2021.04.02 08:20:45.035 Terminate execution thread #1876
2021.04.02 08:20:01.061 Expert Test9 USDCAD.rann,M1: removed
2021.04.02 08:20:01.045 Terminate execution thread #6268
2021.04.02 08:18:48.078 Expert Test9 USDCHF.rann,M1: removed
2021.04.02 08:18:48.047 Terminate execution thread #6704
2021.04.02 08:17:47.046 Expert Test9 AUDNZD.rann,M1: removed
2021.04.02 08:17:47.030 Terminate execution thread #6440
2021.04.02 08:16:51.090 Expert Test9 AUDUSD.rann,M1: removed
2021.04.02 08:16:51.043 Terminate execution thread #5432


Единственное упоминание выделенных строк нашел здесь. Что это?


Все случилось на реальном ПАММ-счете, поэтому стал рассматривать возможности поймать место зависания. Написал такой советник, где после захода в OnTick попробовал снять его.

void OnTick()
{
  while (true) {}
  
  if (IsStopped())
    Print("Hello!");
}


Получил такое.


Выделил строку Abnormal termination, потому что она отсутствовала (см. выше логи) при удалении с графика зависших ПАММ-советников.


А в Journal-логе этого короткого тестового советника нет никакого упоминания Terminate execution thread #xxxx:

2021.04.02 08:37:57.039 Expert Test9 EURUSD,M15: removed
2021.04.02 08:37:15.773 Expert Test9 EURUSD,M15: loaded successfully


Прошу помочь разобраться в ситуации. Попутно выяснил, что удаление советника с бесконечным циклом по Abnormal termination ничего не выполняет (принт Hello) после цикла.

В боевых советниках нет бесконечных циклов. Но на случай будущих сбоев понял, что во всех циклах нужно прописывать IsStopped и распринтовку после. Например, так:

for (int i = OrdersTotal() - 1; !IsStopped() && (i >= 0); i--)
  ;
  
if (IsStopped())
  Print(__LINE__);

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

И в конце каждой функции делать распринтовку в случае IsStopped, чтобы увидеть "матрешку" вызовов при снятии советника.


В общем, судя по логам, получил очень нестандартное зависание. При этом одновременно на нескольких MT4-терминалах. Очень надеюсь, что обсуждение поможет разобраться.


ЗЫ Когда снял все зависшие советники, то с оставшимися работающими советниками и всеми индикаторами загрузка CPU стала 0.1%. Помимо нескольких MT4-терминалов параллельно пашут MT5-терминалы, они все летают без каких-либо проблем.

ЗЗЫ Когда снимал советники с последнего из запущенных проблемного MT4-терминала, то только там не было Terminate execution thread #xxxx, а были  Abnormal termination.
 
fxsaber:


ЗЫ Когда снял все зависшие советники, то с оставшимися работающими советниками и всеми индикаторами загрузка CPU стала 0.1%. Помимо нескольких MT4-терминалов параллельно пашут MT5-терминалы, они все летают без каких-либо проблем.

Оптимизация выделенных ресурсов на задачи в условиях голода.) Жаль нельзя делать настройки выделения ресурсов.

Частая проблема зависаний, безудержное потребление ресурсов, но это больше проблема ОСи.

 
fxsaber:
void OnTick()
{
  while (true) {}
  
  if (IsStopped())
    Print("Hello!");
}

в MQL4 в бесконечных циклах обязательно нужно вставлять Sleep() - иначе будет подвисать терминал или другие советники

ЗЫ: Sleep( 1 )  - может быть мало, экспериментально нужно подобрать время задержки

 
Igor Makanu:

в MQL4 в бесконечных циклах обязательно нужно вставлять Sleep() - иначе будет подвисать терминал или другие советники

Это был просто пример. Sleep(100) все равно даст Abnormal.

 
fxsaber:

Это был просто пример. Sleep(100) все равно даст Abnormal.

Abnormal - все логично, было принудительное закрытие, а без Sleep() - это принудительное закрытие может несколько секунд происходить

сделайте правильное условие для бесконечного цикла:

while(!IsStopped())
{
...... 
Sleep(15);
}
ЗЫ: MQL5 можно без Sleep() - но не во всех билдах, был какой то былд который как 4-ка работает только со Sleep()
Причина обращения: