Архив версий МТ. - страница 3

 
Сергей Таболин:

Считаю, что при таком раскладе TesterStop() и ExpertRemove() должны, если уж не могут тотчас передать управление в OnTester(), возвращать true. Чтобы можно было как-то реагировать, например так:

bool                 tester_stop = false;                 // флаг проверки выхода по TesterStop
.......
void OnTick()
{
//--- пропустить бесполезные проходы оптимизации
   if(!check_init && (MQLInfoInteger(MQL_OPTIMIZATION) || MQLInfoInteger(MQL_TESTER)))
   {
      if(недопустимый параметр)          tester_stop = TesterStop();
........
}
double OnTester()
{
   if(tester_stop) return(-99999999999.99);

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

И вот вариант который вы хотели видеть.

bool                 tester_stop = false;                 // флаг проверки выхода по TesterStop
.......
void OnTick()
{
//--- пропустить бесполезные проходы оптимизации
   if(!check_init && (MQLInfoInteger(MQL_OPTIMIZATION) || MQLInfoInteger(MQL_TESTER)))
   {
      if(недопустимый параметр)
       {
        TesterStop();
        tester_stop = true;
        return;
       }
........
}
double OnTester()
{
   if(tester_stop) return(-99999999999.99);
 
Roman:

В данном контексте разве мы не можем делать проверку?

И как предотвратить/отменить принудительное завершение если оно уже запущено? Ваши примеры чуток из другой оперы.
 
Alexey Viktorov:
И как предотвратить/отменить принудительное завершение если оно уже запущено? Ваши примеры чуток из другой оперы.

Не запускать принудительное завершение. Тогда и не нужно его отменять

Вероятно уже запущенное принудительное завершение, отменять не имеет смысла из за возможных программных глюков.
По этому такой возможности скорее всего нет. Точно не могу сказать.
Из этого следует, что необходимо логически выстраивать код так, чтоб после запуска принудительного завершения, не возникала потребность снова возвращаться в работающий код.
Если завершаем, значит завершаем явно.

 
Roman:

Вероятно уже запущенное принудительное завершение, отменять не имеет смысла из за возможных программных глюков.
По этому такой возможности скорее всего нет. Точно не могу сказать.
Из этого следует, что необходимо логически выстраивать код так, чтоб после запуска принудительного завершения, не возникала потребность снова возвращаться в работающий код.
Если завершаем, значит завершаем явно.

Почему-то складывается впечатление, что вы не всё прочли в теме. Что-то не совсем ваше мнение совпадает с обсуждаемой проблемой.

ps; Хотя нет. Вроде в первом вашем сообщении этой темы вы точно цитировали мои слова, да только вот не полностью. Возможно из-за этого всё представление проблемы сдвинулось.
 
Какие вопросы, такие и ответы. Обсуждайте тогда сами с собой. Пытаешься вникнуть в проблему, а людям ещё не нравиться. Удачи в поиске проблемы.
 
Alexey Viktorov:

И вот вариант который вы хотели видеть.

Всё правильно.

Но разве 

if(недопустимый параметр)          tester_stop = TesterStop();

не проще и понятнее, чем

if(недопустимый параметр)
       {
        TesterStop();
        tester_stop = true;
        return;
       }

?

Но сейчас я сделал именно так, как Вы и посоветовали.

 
Roman:
Какие вопросы, такие и ответы. Обсуждайте тогда сами с собой. Пытаешься вникнуть в проблему, а людям ещё не нравиться. Удачи в поиске проблемы.

Зря обижаетесь. Чтобы вникнуть надо было всю фразу

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

Архив версий МТ.

Alexey Viktorov, 2019.06.16 15:25

Сергей, в этом нет ничего неожиданного. Наоборот всё закономерно и последовательно. Бывают разные случаи. Иногда надо перед завершением работы советника завершить обработку события до конца, иногда как в вашем случае срочно завершить. Вот и встаёт вопрос перед разработчиками, как правильней поступить, прервать однозначно, получив недовольство от тех кому надо завершить выполнение, или остановить после завершения обработки события. При этом у любого программиста есть в арсенале оператор return, а при принудительном завершении ничего нет.

И с какой целью вам понадобилось менять тип void на bool, ведь опять-же в арсенале программиста есть статические переменные которые можно до или после TesterStop() изменить и в принципе всё будет так как вы желаете. А вы зачем-то из моего примера это выкинули.

а вы вырвали из контекста только вторую часть, не обратив внимания на первую.
 
Сергей Таболин:

Всё правильно.

Но разве 

не проще и понятнее, чем

?

Но сейчас я сделал именно так, как Вы и посоветовали.

Может быть и проще, и понятнее, но требовать от разработчиков то, что с лёгкостью пишется самостоятельно неправильно. Почему-то я не верю, что по поводу С++ пишут и требуют какие-то дополнения к языку. А замечаний, я уверен, у многих достаточно.

 
Alexey Viktorov:

Может быть и проще, и понятнее, но требовать от разработчиков то, что с лёгкостью пишется самостоятельно неправильно. Почему-то я не верю, что по поводу С++ пишут и требуют какие-то дополнения к языку. А замечаний, я уверен, у многих достаточно.

Вот проверил Ваш вариант. Всё закончилось таким вот сообщением:

2019.06.16 18:49:25.464 Core 1  TesterStop() called on 0% of testing interval

В общем - тупик...

 
Alexey Viktorov:

Зря обижаетесь. Чтобы вникнуть надо было всю фразу

а вы вырвали из контекста только вторую часть, не обратив внимания на первую.

Приведя пример с IsStopped() я как раз пытался ответить на первую часть.
Иногда надо перед завершением работы советника завершить обработку события до конца, иногда как в вашем случае срочно завершить.
Прочтите в документации описание этой функции IsStopped(), может наведёт на некоторые мысли.
Но вам показалось это из другой оперы. Если из другой, тогда сорри за возможное предположение.
Но как говориться в возможных предложениях, и решается поиск проблемы.
Однозначного решения не кто не скажет, так как не кто не знает всю логику его кода, и вероятно вникать в него не будет. 

Причина обращения: