Ошибки, баги, вопросы - страница 1520

 
Slawa:

Другого способа пока нет.

Мы обсуждали введение новой команды exit, которая немедленно прекращала бы исполнение программы, но тут есть нерешённые вопросы

Очень жаль. Да, exit() как в С++ была бы кстати. Сейчас же бывает тянуть ответ вложенных функций в вызывающую достаточно проблематично. Да и универсальных библиотек не написать.
 
Alexey Kozitsyn:
Очень жаль. Да, exit() как в С++ была бы кстати. Сейчас же бывает тянуть ответ вложенных функций в вызывающую достаточно проблематично. Да и универсальных библиотек не написать.
как вариант создать отдельно функцию удаления всех объектов программы и при выполнении условия для удаления самой программы из терминала, ее вызвать, а вслед за ней уже и ExpertRemove(), в этом случае должно все быстрее завершиться... хотя не факт :)
 
coderex:
как вариант создать отдельно функцию удаления всех объектов программы и при выполнении условия для удаления самой программы из терминала, ее вызвать, а вслед за ней уже и ExpertRemove(), в этом случае должно все быстрее завершиться... хотя не факт :)

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

Да, и дело тут не только в ООП (насколько я понял, Вы о нем). Просто - если ошибку невозможно исправить - программа завершается. 

 
Slawa:
Останавливает, но не сразу
Не понял, дак корректно с ExpertRemove() работать в индикаторах или все же нет?
 
Alexey Kozitsyn:
Не понял, дак корректно с ExpertRemove() работать в индикаторах или все же нет?

Для индикаторов вроде же есть функция, или она уже не актуальна

ChartIndicatorDelete();
 
Alexey Kozitsyn:
Не понял, дак корректно с ExpertRemove() работать в индикаторах или все же нет?

Нет. В индикаторах ExpertRemove() перекрыта.

"Останавливает, но не сразу" - это сказано вообще про ExpertRemove. Эта функция не прерывает работу программы.

 
Slawa:

Нет. В индикаторах ExpertRemove() перекрыта.

"Останавливает, но не сразу" - это сказано вообще про ExpertRemove. Эта функция не прерывает работу программы.

А вообще, в планах есть задача решить вопрос с exit()? Или пользователям решать через костыли?)
 
Slawa:
Пример приведите. Давайте исходник индикатора для иллюстрации проблемы
Вставьте текст в OnCalculate созданного по умолчанию в рекдаторе индикатора. Поместите на любой график. В верхнем левом углу окна графика будете видеть работу индикатора. После выбора "Удалить" из списка индикаторов, работа не прекращается, это будет видно в левом верхнем углу. И даже после закрытия окна она не прекращается. А после открытия нового окна, она продолжается уже в новом окне. Причем, это окно не обязательно того же символа, что было в начале :) 
Только при закрытии терминала работа индикатора прекращается. И то неизвестно, прекращается или нет - только что пришлось убирать терминал через диспетчер задач вручную для перезапуска...

В то время как в справке функции IsStopped сказано, что работа программы принудительно завершается через 3 секунды, если поступила команда завершить выполнение mql-программы.

   int i=0;
   while(true){
      Comment(i++);
      Sleep(100);
   }

 Причем если while(true) заменить на while(!IsStopped()) то при удалении с графика индикатор успешно завершает работу.

 

Забавная причина ошибки Internal Compiler Error ( функция используется в индикаторе ):

void SaveData ( uint handle_, int wrdata_, int interv_, string dpath_, int tmode_, int tmult_, long ctime_, long& ltime_ )
  {
    int ierr, wrtint;
    // ----
    if ( interv_ > 0 ) // work mode
      {
        if ( MQLInfoInteger ( MQL_TESTER ) == 0 ) { wrtint = interv_;             } // не имеет значения
        else                                                      { wrtint = interv_ * tmult_; } // не имеет значения
        //
        if ( ( ctime_ - ltime_ ) >= ( wrtint * 60 ) ) // если закомментировать эту строчку, ошибка исчезнет
          {
            // некий код сохранения данных ... не имеет значения - проверено
            //
            ltime_ = ctime_; // в общем тоже не имеет значения
          } // if ( ( ctime_ - ltime_ ) >= ( wrtint * 60 ) )
      } // if ( interv_ > 0 )
    // ----
    return;

  } // void SaveData

( пардон, кнопку SRC намеренно не стал использовать, т.к. с ней не удаётся выделить нужные места в тексте )

Лечение очевидно, однако согласитесь - весьма забавный глюк. :)))

 

У одного ДЦ комиссия 16х2 долларов на оборот 1 млн. Они выставили в настройках сервера, видимо, комиссию 16 долл. И теперь при тесте на их сервере комиссия 16х2 списывается с каждой сделки независимо от её лотности, т.е. адекватный тест можно сделать только с лотом 10. 

Это их криворукость в настройке серверов или реальное ограничение МТ5? Что конкретно им можно посоветовать сделать на серверах, чтобы комиссия корректно обрабатывалась в тестере?