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

 
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, который, к сожалению, не решает данную ситуацию.

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

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

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

 

Здравствуйте все! Вопрос по MQL5.

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

Пока пользовался классом CTrade, но он не даёт такую возможность.

То есть надо использовать OrderSend, правильно?

Тут я не понимаю: https://www.mql5.com/ru/docs/constants/tradingconstants/enum_trade_request_actions#trade_action_deal в примере пишется функция OnStart. Или можно прописать всё в пользовательскую функцию и вызывать её при необходимости?

Надо ли что-то добавлять в OnInit?

И не будет ли конфликтов, если я закрытие напишу через OrderSend, а открытия и модификации оставлю на базе класса CTrade?

Спасибо!

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Типы торговых операций
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Типы торговых операций
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Типы торговых операций - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Artyom Trishkin:

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

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

Во-первых, это не решение, а пример для демонстрации сути того, о чем я говорю.

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

И в-третьих, вы мне пишите про решение совсем другой вещи, для решения которой я могу придумать миллион способов.

Т.е. мой цикл вы посчитали камнем преткновения моей ситуации? Серьезно?

В общем, я понял. Неудачно меня занесло в эту тему...

Но, в любом случае, спасибо!