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

 

Это правильное поведение статических переменных?

При переключении таймфрейма или изменении параметров их значение не меняется:

int OnInit()
  {
   static int my_int=4444;
   Print(my_int);
   my_int=9999;
   return(INIT_SUCCEEDED);
  }

Результат после запуска советника и переключения таймфрейма:

2021.02.24 16:23:27.999 Test1 (EURUSD,M1)       4444
2021.02.24 16:23:29.913 Test1 (EURUSD,M5)       9999
Статические переменные

Это из справки:

Статические переменные существуют с момента выполнения программы и инициализируются однократно перед вызовом специализированной функции OnInit().

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

В тестере тоже так происходит?

Глобальные переменные тоже себя так ведут.

 

При переключении таймфрейма, эксперт не перезапускается, он продолжает работать

https://www.mql5.com/ru/docs/runtime/running

При смене символа или таймфрейма графика, к которому эксперт прикреплен, выгрузка и загрузка эксперта не производится. При этом последовательно вызываются обработчики OnDeinit() на старом символе/таймфрейме и OnInit() на новом символе/таймфрейме (если они есть), значения глобальных переменных и статических переменных не сбрасываются. Все события, поступившие для эксперта до завершения инициализации (функции OnInit()), пропускаются.


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

При переключении таймфрейма, эксперт не перезапускается, он продолжает работать

https://www.mql5.com/ru/docs/runtime/running

Заметил одну особенность, которой раньше не было в MetaTrader. Удаляю эксперта с графика (с помощью команды его контекстного меню), вслед за ним закрывается график. Раньше график не закрывался после удаления эксперта.

 
Mihail Matkovskij:

Заметил одну особенность, которой раньше не было в MetaTrader. Удаляю эксперта с графика (с помощью команды его контекстного меню), вслед за ним закрывается график. Раньше график не закрывался после удаления эксперта.

Это может быть запрограммировано в самом советнике, проверьте с помощью другого советника...

 

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

получается, что при добавлении переменные в окне сразу не отображаются, а появляются только при следующем запуске отладки, но значения их уже <not implemented>. подскажите что настроить надо чтобы отладка заработала

 
Vladimir Pastushak:

Это может быть запрограммировано в самом советнике, проверьте с помощью другого советника...

Действительно, бросил стандартного эксперта на график. Удаляется без проблем. В исходниках своего эксперта попробовал найти ChartClose. Нигде не нашел. У меня и не было такой задумки изначально, закрывать график при удалении эксперта. В нём я использую стандартные элементы UI, такие как CAppDialog. Может быть где-то в стандартных классах прописано закрытие графика...

 
Mihail Matkovskij:

Действительно, бросил стандартного эксперта на график. Удаляется без проблем. В исходниках своего эксперта попробовал найти ChartClose. Нигде не нашел. У меня и не было такой задумки изначально, закрывать график при удалении эксперта. В нём я использую стандартные элементы UI, такие как CAppDialog. Может быть где-то в стандартных классах прописано закрытие графика...

Нашел. В классе CAppDialog есть поле CChart m_chart.

class CAppDialog : public CDialog
  {
...
protected:
   CChart            m_chart;               // object to access chart

Когда CAppDialog удаляется (его наследник используется в моём эксперте), то вероятней всего тогда и происходит закрытие чарта, за счёт срабатывания деструктора объекта  m_chart.

//+------------------------------------------------------------------+
//| Destructor                                                       |
//+------------------------------------------------------------------+
CChart::~CChart(void)
  {
   if(m_chart_id!=-1)
      Close();
  }
//+------------------------------------------------------------------+
//| Chart close                                                      |
//+------------------------------------------------------------------+
void CChart::Close(void)
  {
   if(m_chart_id!=-1)
     {
      ChartClose(m_chart_id);
      m_chart_id=-1;
     }
  }

С помощью отладчика данный процесс к сожалению отследить нельзя. Но просмотрев исходный код CAppDialog, а также CChart, всё становится понятно. Обращаю на это внимание разработчиков.

 
Mihail Matkovskij:

Нашел. В классе CAppDialog есть поле CChart m_chart.

Когда CAppDialog удаляется (его наследник, CDialog, используется в моём эксперте), то вероятней всего тогда и происходит закрытие чарта, за счёт срабатывания деструктора объекта  m_chart.

С помощью отладчика данный процесс к сожалению отследить нельзя. Но просмотрев исходный код CAppDialog, а также CChart, всё становится понятно. Обращаю на это внимание разработчиков.

void CAppDialog::Destroy(const int reason)

отвязывает от чарта, в том числе.

 

Подскажите кто знает: почему функция SignalBaseTotal() всегда возвращает значение 1000.

В сервисе сигналов mql5.com больше тысячи транслируемых сигналов, но в терминале доступна ровно тысяча. Почему?

И может ли так статься, что сейчас в составе этой тысячи один набор сигналов, а через час уже другой?
Документация по MQL5: Управление сигналами / SignalBaseTotal
Документация по MQL5: Управление сигналами / SignalBaseTotal
  • www.mql5.com
SignalBaseTotal - Управление сигналами - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Alain Verleyen :

Ошибка с производной структурой, при которой не добавляются новые данные при сохранении / загрузке из файла.

 @Ilyas Вы исправите это?
Причина обращения: