Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 742

 
Klimenko_a_e:

В реальном коде - функция возвращает объект.

Конструктор копирования, по моему, и должен создавать в этом случае временную копию.

Код работает правиьно и в билде MQL5  1545. 

В новом билде конструктор копирования не может изменить размер даже одномерного массива: ошибка 4007.

По моему, это не правильно.

Мне сложно что-то однозначно утверждать в данном случае. Есть очень хорошие спецы по Вашему вопросу, поэтому рекомендую с ним обратиться в ветку https://www.mql5.com/ru/forum/1111

С моими правками код работает, как надо. Без - нет. А вот должен ли Ваш код работать - лучше в ветку по ссылке выше.

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • www.mql5.com
Форум алго-трейдеров MQL5
 
Klimenko_a_e:

В реальном коде - функция возвращает объект.

Конструктор копирования, по моему, и должен создавать в этом случае временную копию.

Код работает правиьно и в билде MQL5  1545. 

В новом билде конструктор копирования не может изменить размер даже одномерного массива: ошибка 4007.

По моему, это не правильно.


В билде 1580 ошибку исправили, спасибо, всё работает как должно).
 
fxsaber:

Мне сложно что-то однозначно утверждать в данном случае. Есть очень хорошие спецы по Вашему вопросу, поэтому рекомендую с ним обратиться в ветку https://www.mql5.com/ru/forum/1111

С моими правками код работает, как надо. Без - нет. А вот должен ли Ваш код работать - лучше в ветку по ссылке выше.


Спасибо за ссылку.
 

Может кто сможет подсказать.

Я не могу понять, как можно прервать выполнение эксперта после того, как вручную изменить входные настройки.

1) Запускаем на чарте такой код эксперта:

#property version   "1.00"

input int Setting_ = 0;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   Print ("OnInit:",Setting_);
   
   return (INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   Print ("OnDeinit(",reason,"):",Setting_);
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   while (!_StopFlag)
   {
      Sleep(1000);
   }
}

2) Открываем окно настроек и меняем параметр "Setting_" на 1.

3) И применяем изменения.

Так вот, чтобы изменения начали применяться должен выполниться OnInit, но OnInit не будет выполняться до тех пор, пока вычисления в OnTick (или в любой другой) не прекратятся.

На сколько я знаю, есть лишь проверка на остановку программы через _StopFlag - флаг остановки mql5-программы, но это только для полного выхода. А вот как понять, что входные настройки изменились, чтобы остановить вычисления я не знаю.

Может кто сталкивался с такой ситуацией? Может есть какой-нибудь секретный хак?

 
Marat Sultanov:

Может кто сможет подсказать.

Я не могу понять, как можно прервать выполнение эксперта после того, как вручную изменить входные настройки.

1) Запускаем на чарте такой код эксперта:

2) Открываем окно настроек и меняем параметр "Setting_" на 1.

3) И применяем изменения.

Так вот, чтобы изменения начали применяться должен выполниться OnInit, но OnInit не будет выполняться до тех пор, пока вычисления в OnTick (или в любой другой) не прекратятся.

На сколько я знаю, есть лишь проверка на остановку программы через _StopFlag - флаг остановки mql5-программы, но это только для полного выхода. А вот как понять, что входные настройки изменились, чтобы остановить вычисления я не знаю.

Может кто сталкивался с такой ситуацией? Может есть какой-нибудь секретный хак?

Проверяйте код деинициализации в OnInit()

Причины деинициализации

Коды причины деинициализации эксперта, возвращаемые функцией UninitializeReason(). Могут иметь любые из следующих значений:

Константа

Значение

Описание

REASON_PROGRAM

0

Эксперт прекратил свою работу, вызвав функцию ExpertRemove()

REASON_REMOVE

1

Программа удалена с графика

REASON_RECOMPILE

2

Программа перекомпилирована

REASON_CHARTCHANGE

3

Символ или период графика был изменен

REASON_CHARTCLOSE

4

График закрыт

REASON_PARAMETERS

5

Входные параметры были изменены пользователем

REASON_ACCOUNT

6

Активирован другой счет либо произошло переподключение к торговому серверу вследствие изменения настроек счета

REASON_TEMPLATE

7

Применен другой шаблон графика

REASON_INITFAILED

8

Признак того, что обработчик OnInit() вернул ненулевое значение

REASON_CLOSE

9

Терминал был закрыт

 
Artyom Trishkin:

Проверяйте код деинициализации в OnInit()

...

Эмм... Вы меня не поняли :)

Нужно узнать внутри функции (например в OnTick), что пользователь изменил входные параметры, т.е. узнать, что пора закругляться и дать программе уйти в OnDeinit.

 
Marat Sultanov:

Эмм... Вы меня не поняли :)

Нужно узнать внутри функции (например в OnTick), что пользователь изменил входные параметры, т.е. узнать, что пора закругляться и дать программе уйти в OnDeinit.

Как только пользователь вызывает окно настроек советника (F7) и, изменив параметры, нажимает там кнопку ОК, сразу же вызывается OnDeinit(), и он, в свою очередь записывает в код деинициализации значение REASON_PARAMETERS. Далее вызывается OnInit(), где при помощи UninitializeReason() можно проверить код деинициализации и, если его значение равно REASON_PARAMETERS, то решать что нужно делать дальше.
 
Artyom Trishkin:
Как только пользователь вызывает окно настроек советника (F7) и, изменив параметры, нажимает там кнопку ОК, сразу же вызывается OnDeinit(), и он, в свою очередь записывает в код деинициализации значение REASON_PARAMETERS. Далее вызывается OnInit(), где при помощи UninitializeReason() можно проверить код деинициализации и, если его значение равно REASON_PARAMETERS, то решать что нужно делать дальше.

Ну ладно.

Пожалуйста:

1) Сначала запустите мой код, который я привел в своем первом сообщении. Я его не для красоты там привел... Можете запустить на любом чарте.

2) Вызовите окно настроек советника.

3) Измените параметр и нажмите ОК.

Если вы внимательно посмотрите мой код, тогда полученный, закономерный результат вас не удивит: OnDeinit() не будет вызван.

 

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

Пожалуйста, обратите внимание на самый важный кусок в коде:

void OnTick()
{
   while (!_StopFlag)
   {
      Sleep(1000);
   }
}

Это наглядная эмуляция продолжительного вычисления, которая не будет прервана из-за изменения входных параметров. А мне нужно его прервать и вопрос как? :)

Я просто хочу убедиться, что я ничего не упускаю в MQL5 и в языке, действительно, нет ничего больше кроме _StopFlag, который, к сожалению, не решает данную ситуацию.

Грубо говоря, мне нужно поймать момент изменения входных параметров во время тяжелого вычисления.

 
Marat Sultanov:

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

Пожалуйста, обратите внимание на самый важный кусок в коде:

Это наглядная эмуляция продолжительного вычисления, которая не будет прервана из-за изменения входных параметров. А мне нужно его прервать и вопрос как? :)

Я просто хочу убедиться, что я ничего не упускаю в MQL5 и в языке, действительно, нет ничего больше кроме _StopFlag, который, к сожалению, не решает данную ситуацию.

Грубо говоря, мне нужно поймать момент изменения входных параметров во время тяжелого вычисления.

Грубо говоря - перечитайте внимательно то, что я вам написал, и выкиньте из своего кода бесконечный цикл.

Вы точно уверены, что загон эксперта в бесконечный цикл - верное решение?