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

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

Предполагается, по уму, что передача должна быть выполнена немедленно, без выполнения остального кода. Так?

А на деле TesterStop() Вовсе не останавливает тест!

Предполагается, по уму, если надо остановить дальнейшее выполнение кода просто написать return и продолжения не будет. А TesterStop() равно как и ExpertRemove()

Остановка эксперта не происходит немедленно при вызове функции ExpertRemove(), производится лишь взвод флага для прекращения работы эксперта. Т.е., любое следующее событие эксперт обрабатывать уже не будет, произойдет вызов OnDeinit() и выгрузка с удалением с графика.

И второй замеченный косяк в том, что

tester_stop = false;

совсем не на месте.

 
Alexey Viktorov:

Предполагается, по уму, если надо остановить дальнейшее выполнение кода просто написать return и продолжения не будет. А TesterStop() равно как и ExpertRemove()

И второй замеченный косяк в том, что

совсем не на месте.

Следующее событие - это OnTick() ?

Куда из OnTick() можно сделать выход?

Это почему не на месте? Ожидалось, что если сработает TesterStop(), то до этой строки выполнение не дойдёт.

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

Следующее событие - это OnTick() ?

Куда из OnTick() можно сделать выход?

Это почему не на месте? Ожидалось, что если сработает TesterStop(), то до этой строки выполнение не дойдёт.

Куда выходить и что продолжать это дело разработчика.

      if((stop_loss_buy > 0 && stop_loss_buy < 700) || (stop_loss_sell > 0 && stop_loss_sell < 700))
      {
         Print("Результат в OnTester() должен быть -99999999999.99");
         TesterStop();
      }
      check_init  = true;
      tester_stop = false;

В этом коде флаг tester_stop будет принимать значение false независимо от того будет-ли выполнен TesterStop()

 
Alexey Viktorov:

Куда выходить и что продолжать это дело разработчика.

В этом коде флаг tester_stop будет принимать значение false независимо от того будет-ли выполнен TesterStop()

Так это то я уже понял ))) 

Вопрос в другом - чё делать? Как остановить тест? Конкретно. Разработчики чуть ли не матерятся, если использовать INIT_PARAMETERS_INCORRECT в OnInit(), да и генетику это ложит на лопатки.

Нашёл выход, до последнего времени проблем не было. А теперь ... ужасть просто )))

И всё же, куда можно выйти из OnTick()?

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

Так это то я уже понял ))) 

Вопрос в другом - чё делать? Как остановить тест? Конкретно. Разработчики чуть ли не матерятся, если использовать INIT_PARAMETERS_INCORRECT в OnInit(), да и генетику это ложит на лопатки.

Нашёл выход, но последнего времени проблем не было. А теперь ... ужасть просто )))

Ну если понял в чём проблема осталась?

         TesterStop();
      tester_stop = false;
      return;

Весь код после выполнения TesterStop выполняться не будет. То-есть получится немедленное прекращение работы. Дальше уже можно ориентируясь на флаг tester_stop регулировать...

И ещё вопрос: Что это за число такое придумал? Минус много девяток это что? попытка получить дополнительный гемор? Вот тут точно ужасть просто...

 
Alexey Viktorov:

Ну если понял в чём проблема осталась?

Весь код после выполнения TesterStop выполняться не будет. То-есть получится немедленное прекращение работы. Дальше уже можно ориентируясь на флаг tester_stop регулировать...

И ещё вопрос: Что это за число такое придумал? Минус много девяток это что? попытка получить дополнительный гемор? Вот тут точно ужасть просто...

Минус много девяток - это для определения того, что выход был именно по TesterStop(). Он у меня используется исключительно как замена INIT_PARAMETERS_INCORRECT. Поэтому всё остальное после него не нужно. А сейчас получается так, что весь код выполняется и выскакивает ошибка деления на ноль. Естественно, если массив имеет размерность 1, то значение последнего минус значение первого всегда будет ноль! И от этого косяка, ой, извините, недоразумения я не страховался.

Попробовал вставить return... Только немного не туда ))) :

      if((stop_loss_buy > 0 && stop_loss_buy < 700) || (stop_loss_sell > 0 && stop_loss_sell < 700))
      {
         Print("Результат в OnTester() должен быть -99999999999.99");
         TesterStop();
         return;
      }

В итоге получил:

DM      0       15:32:01.518    Core 1  2016.10.01 00:00:00   153128312914612747
PE      0       15:32:01.518    Core 1  2016.10.01 00:00:00   Советник получил MAGIC = 153128312914612747.
IF      0       15:32:01.518    Core 1  2016.10.03 00:00:00   Результат в OnTester() должен быть -99999999999.99
RS      3       15:32:01.518    Core 1  TesterStop() called on 0% of testing interval
GK      0       15:32:01.518    Core 1  final balance 10000.00 USD
JM      0       15:32:01.518    Core 1  OnTester result -99999999999.99001

Просто офигеть )))

Огромаднейшее СПАСИБО!!! 

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

Минус много девяток - это для определения того, что выход был именно по TesterStop(). Он у меня используется исключительно как замена INIT_PARAMETERS_INCORRECT. Поэтому всё остальное после него не нужно. А сейчас получается так, что весь код выполняется и выскакивает ошибка деления на ноль. Естественно, если массив имеет размерность 1, то значение последнего минус значение первого всегда будет ноль! И от этого косяка, ой, извините, недоразумения я не страховался.

Попробовал вставить return... Только немного не туда ))) :

В итоге получил:

Просто офигеть )))

Огромаднейшее СПАСИБО!!! 

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

Спасибо, я это уже понял. Но это не решает проблему. Решить её можно либо константой MQL_TESTER_STOP, либо изменением возврата с void на bool.

Неожиданное решение подсказал Alexey Viktorov. Если после TesterStop() использовать return, то вроде всё нормализуется. Как и почему это происходит лично я догнать не могу... Тем не менее...

Отсюда, либо добавить этот момент в документацию, либо изменить void на bool.

П.С. С это проблемой я столкнулся на билде 2085. До этого проблем не было. На мой взгляд, это о чём-то да говорит? )))

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

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

 
Alexey Viktorov:

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

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

Алексей, огромное Вам спасибо за помощь.

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

Что касается статических переменных и Вашего примера, который я "выкинул"... Извините, но я не совсем понимаю о чём речь. Разъясните, если не затруднит.

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

А тут вообще непонятки проскальзывают. Голова кругом...

Пример:

Из моего кода видно, что если последнее значение массива минус первое значение массива рано нулю, то результат должен быть -99999999999.88.

А при оптимизации получаю такой результат:

2019.06.16 16:27:09.847 Core 1  final balance 9587.10 USD
2019.06.16 16:27:09.847 Core 1  OnTester result -99999999999.88

9587 - 10000 ну никак не равно нулю, а результат -99999999999.88. Как?!?!? Меня уже клинит...

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

Алексей, огромное Вам спасибо за помощь.

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

Что касается статических переменных и Вашего примера, который я "выкинул"... Извините, но я не совсем понимаю о чём речь. Разъясните, если не затруднит.

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

А тут вообще непонятки проскальзывают. Голова кругом...

Пример:

Из моего кода видно, что если последнее значение массива минус первое значение массива рано нулю, то результат должен быть -99999999999.88.

А при оптимизации получаю такой результат:

9587 - 10000 ну никак не равно нулю, а результат -99999999999.88. Как?!?!? Меня уже клинит...

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

Отсюда подтверждение того что вы необдуманно "выкинули" изменение значения флага из моего примера.

Вот ведь это использование

   if(tester_stop) return(-99999999999.99);

А видимо этот флаг или вообще не меняется, или не меняется по причине того, что изменение предусмотрено не там где должно быть.

 
Alexey Viktorov:
Иногда надо перед завершением работы советника завершить обработку события до конца.

При этом у любого программиста есть в арсенале оператор return, а при принудительном завершении ничего нет.


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

if(IsStopped())
if(!IsStopped())
Причина обращения: