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

 
A100:

Проблемы нет... есть ошибка. Тоже не понимаю зачем пытаться за уши притянуть объяснение. Штатный Print имеет следующую сигнатуру:

и тоже умеет конфликтовать с другими функциями (если потребуется)

Сигнатура Print выбивается за пределы возможностей языка MQL5. Если в MQL5 запретят совсем делать перегрузки Print, это не будет ошибкой.

Надеюсь, данный "баг" не мешает Вам создавать ТС и не требует написания костылей.

 

Замерил производительность Тестера. Для этого на каждом тике открывал и закрывал позицию. Замерял время выполнения 100 тиков. И так прогнал 100 000 тиков. Итого 1000 замеров. Получил такой график

Какие-то всплески замедления почти на одинаковом расстоянии между друг другом. Замерял в режиме Оптимизации. Если не обращать внимание на всплески, то производительность Тестера пляшет на 25%, вместо постоянного значения. Возможно, это снова приколы замера скорости в ОС Windows.


ЗЫ Тот же самый код запустил на MT4

В среднем на обработку одного тика MT4-Тестер затрачивает раза в 1.5-2 меньше времени, чем MT5.

Файлы:
Tester.mq5  2 kb
 

Возможно, всплески через использование генетического алгоритма оптимизации.


... на каждом тике открывал и закрывал позицию.

В среднем на обработку одного тика MT4-Тестер затрачивает раза в 1.5-2 меньше времени, чем MT5.
А это уже чистой воды манипуляции и введение в заблуждение.
 
Sergey Dzyublik:

Возможно, всплески через использование генетического алгоритма оптимизации.

ГА нет. Оптимизация из двух проходов на одном Агенте.

А это уже чистой воды манипуляции и введение в заблуждение.

Исходник на месте.

 

В одном случае предупреждение, в другом ошибка

void f()
{
    for ( int i = 0;; )
    {
        Print( i );
        int    i = 5; //Warning: declaration of 'i' hides local declaration
        Print( i );
        break;
    }
}
void For( int i = 0 )
    {
        Print( i );
        int    i = 5; //Error: redefinition of formal parameter 'i'
        Print( i );
    }

А какая принципиальная разница? В C++ например в обоих случаях ошибка

 

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

Имеем такой пример скрипта:

class A
  {
public :
                     A() { Print("Start"); };
                    ~A() { 
                     Print("End"); 
                     Print(EnumToString(CheckPointer(GetPointer(this)))); 
                     if (CheckPointer(GetPointer(this))!=POINTER_DYNAMIC) 
                     delete GetPointer(this);};
  };
  
A a;

void OnStart()
  {
  }

При выполнении имеем, как и предпологалось:

2018.09.23 21:56:20.574 Test_CheckPointer (EURUSD,M1)   Start
2018.09.23 21:56:20.574 Test_CheckPointer (EURUSD,M1)   End
2018.09.23 21:56:20.574 Test_CheckPointer (EURUSD,M1)   POINTER_AUTOMATIC


если экземпляр класса объявляем так:

A *a= new A;

тогда при выполнении имеем:

2018.09.23 21:46:42.960 Test_CheckPointer (EURUSD,M1)   Start
2018.09.23 21:46:42.961 Test_CheckPointer (EURUSD,M1)   1 undeleted objects left
2018.09.23 21:46:42.961 Test_CheckPointer (EURUSD,M1)   1 object of type A left
2018.09.23 21:46:42.961 Test_CheckPointer (EURUSD,M1)   32 bytes of leaked memory

т.е. деструктор даже не запускается, память соответственно не освобождается.


Если же экземпляр класса объявляем так:

A a= new A;

то конструктор запускается два раза, деструктор 1 раз, но при этом память не освобождается и имеем тип указателя объекта POINTER_AUTOMATIC , хотя предпологалось POINTER_DYNAMIC

2018.09.23 21:54:24.844 Test_CheckPointer (EURUSD,M1)   Start
2018.09.23 21:54:24.844 Test_CheckPointer (EURUSD,M1)   Start
2018.09.23 21:54:24.844 Test_CheckPointer (EURUSD,M1)   End
2018.09.23 21:54:24.844 Test_CheckPointer (EURUSD,M1)   POINTER_AUTOMATIC
2018.09.23 21:54:24.844 Test_CheckPointer (EURUSD,M1)   1 undeleted objects left
2018.09.23 21:54:24.845 Test_CheckPointer (EURUSD,M1)   1 object of type A left
2018.09.23 21:54:24.845 Test_CheckPointer (EURUSD,M1)   32 bytes of leaked memory


Как добиться всегда выполнения деструктора и правильного выполнения delete

 

Как добиться всегда выполнения деструктора и правильного выполнения delete.


Смотрите из С++ тему умных указателей и адаптируйте под MQL (https://habr.com/post/140222/). 
Может что есть в кодобазе...

 
Sergey Dzyublik:


Смотрите из С++ тему умных указателей и адаптируйте под MQL (https://habr.com/post/140222/). 
Может что есть в кодобазе...

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

 
Nikolai Semko:

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

Тогда попробуйте так:
class A { public:
         A() { Print( 1, ":", EnumToString(CheckPointer(GetPointer(this)))); }
        ~A() { Print( 2, ":", EnumToString(CheckPointer(GetPointer(this)))); }
};
class B { public:
         B( void *b ) : b( b ) {}
        ~B() { delete b; }
        void *b;
};
A a1;
A *a2 = new A;
B b( a2 );
void OnStart() {}

Результат:

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

 
Nikolai Semko:

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

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

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