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

 
Nikolai Semko:

спасибо, но не увидел там ответов на мои вопросы. 
Не понимаю, почему деструктор не вызывается при A *a= new A;

https://www.mql5.com/ru/docs/basis/variables/object_live

Все объекты, созданные выражением указатель_объекта=new Имя_Класса, обязательно должны быть впоследствии уничтожены оператором delete(указатель_объекта). Если по каким то причинам такая переменная по окончании работы программы не была уничтожена оператором delete, то об этом будет выведено сообщение в журнал "Эксперты". Можно объявить несколько переменных и всем им присвоить указатель одного объекта.

Документация по MQL5: Основы языка / Переменные / Создание и уничтожение объектов
Документация по MQL5: Основы языка / Переменные / Создание и уничтожение объектов
  • www.mql5.com
После загрузки на исполнение mql5-программы каждой переменной выделяется память в соответствие с типом переменной. Переменные делятся на два типа по уровню доступа - глобальные переменные и локальные переменные, и по классам памяти: входные параметры mql5-программы, статические и автоматические. Каждая переменная при необходимости...
 

Прошу MQL проверить функцию OnTimer().

Почему-то она не работает в тестере стратегий для МТ4 (Ошибок нет, просто ничего внутри этой функции не выполняется), при этом в онлайне все Ок.

Для МТ5 функция работает как в тестере, так и в онлайне.

Спасибо!

 
Много времени уходит на Incorrect-Init
Core 1  pass 114 tested with error "incorrect input parameters" in 0:00:00.218

В OnInit только два числа сравниваются, а времени на Incorrect-проход уходит больше, чем на полноценный проход! Как так?


Запускаем на полную Оптимизацию вот такой советник

input int Range = 0; // задать Оптимизацию 1 .. 10000

int OnInit() { return(INIT_PARAMETERS_INCORRECT); }


Получаем результат работы 8-ми Агентов

Tester  optimization finished, total passes 10000
Statistics      optimization done in 2 minutes 24 seconds


Теперь такой советник

input int Range = 0; // задать Оптимизацию 1 .. 10000

void OnInit() {}
Tester  optimization finished, total passes 10000
Statistics      optimization done in 0 minutes 31 seconds


Наконец, такой

input int Range = 0; // задать Оптимизацию 1 .. 10000

void OnInit() { ExpertRemove(); }
Tester  optimization finished, total passes 10000
Statistics      optimization done in 2 minutes 19 seconds


Два вывода

  1. Incorrect-Init и ExpertRemove - одно и то же по скорости.
  2. Пустой прогон в ~5 раз быстрее вылета из OnInit.


По второму пункту явно какая-то ошибка. Мне выгоднее по времени делать пустой прогон, нежели выскакивать из OnInit. Просьба поправить, т.к. почти полностью теряются преимущества Incorrect-Init и ExpertRemove.

 

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

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

 
A100:
Тогда попробуйте так:

Результат:

1:POINTER_AUTOMATIC
1:POINTER_DYNAMIC
2:POINTER_DYNAMIC
2:POINTER_AUTOMATIC

Спасибо! Вполне себе решение.

только так наверное лучше, чтоб компилятор не ругался:

class B  { public:
                     B(void *b) {d=b;}
                    ~B() { delete d; }
   void             *d; };

Это чтож получаеся - баг что-ли?
При создании экземпляра класса через new не вызывает деструктор.

И что - это единственное решение создавать специальный класс для вызова деструктора? Или все же можно обойтись без этого?

 
Andrey Barinov:

Создаем оператором new, а удаляем оператором delete

Вопрос в том, что бы поместить delete в деструктор, но при создания экземпляра класса через new (A *a=new A;) деструктор не вызывается.

 
aleger:

Можно ли, а если да, то как, вывести в любом индикаторе ЗигЗаг соответствующие значения ценовых экстремумов High и Low,

обеспечив им стабильную привязку и непосредственную близость к образовавшимся вершинам и низинам? 

Смотрите пример из OBJ_TEXT

 

Спасибо. 
Да здесь как раз об этом написано.

Все объекты, созданные выражением указатель_объекта=new Имя_Класса, обязательно должны быть впоследствии уничтожены оператором delete(указатель_объекта). 
Если по каким то причинам такая переменная по окончании работы программы не была уничтожена оператором delete, то об этом будет выведено сообщение в журнал "Эксперты". 
Можно объявить несколько переменных и всем им присвоить указатель одного объекта.
Если динамически создаваемый объект имеет конструктор, то этот конструктор будет вызван в момент выполнения оператора new. Если объект имеет деструктор, 
то деструктор будет вызван в момент выполнения оператора delete.

Значит не баг, а такая особенность, в результате чего получаестя замкнутный круг. 
Если я хочу автоматизировать процесс удаления динамического объекта, то деструктор вызывается только при delete, поэтому бесполезно delete засовывать в сам деструктор. 
Но автоматику можно реализовать через другой экземпляр другого класса, как подсказал @A100 здесь.

 
aleger:

Спасибо за подсказку. Уже замаялся читать и пробовать, пробовать и читать. Работающий бы пример какой-то с ЗигЗагом увидеть...

Такой, как на моём аватаре с зигзагом, но с ПРАВИЛЬНОЙ привязкой верхних экстремумов, поскольку с привязкой нижних всё в порядке!

Способ привязки через k=(WindowPriceMax()-WindowPriceMin())/30 при больших изменениях размеров окна себя не оправдывает, надо бы что-то другое...  


В примере OBJ_TEXT и верхняя и нижняя привязка. Перейдите по ссылке, запустите пример ...

 
Nikolai Semko:

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

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


Забить в поисков сайта "shared_ptr" и перейти по первому же результату может каждый, это не сложно, настоятельно рекомендую попробовать.

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