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

[Удален]  
Artyom Trishkin:

Уже заработал вроде.

Да.

 
Баг МТ5 (build 2345), еще одно проявление ранее описанного бага, когда переданный в шаблонную функцию указатель выступает для одних операций типом данных указатель, для других - типом данных класс:

#define PRINT(x) ; Print(#x, ":", string(x))

template<typename T>
T test(T ptr){
   PRINT(typename(ptr));   // A*
   PRINT(typename(T));     // A*
   
   T new_ptr = new T();
   return (new_ptr);
}


class A{};
   
void OnStart(){    
   A a;
   test(&a);                   // Compile Error: OK
}
 

Баг МТ5 (build 2345), не выполняется проверка на наличие повторно использованных имен шаблонных типов при объявлении шаблонной функции внутри шаблонного класса, что приводит к неожидаемому поведению:

#define PRINT(x) ; Print(#x, ":", string(x))

template<typename T>
class A{
public:   
   template<typename T>         // Compile Error: OK
   T test(T p){
      B b = NULL;
      PRINT(typename(B));       // C*
      PRINT(typename(b));       // C*
      return b;
   }
   
   //real template
   template<typename TT>
   TT test_real(TT p){
      TT b = NULL;
      PRINT(typename(TT));       
      PRINT(typename(b));        
      return b;
   }
};

class B{};
class C : public B{};

   
void OnStart(){  
   A<B> a; 
   B b;
   C c;
    
   C* c_ptr = a.test(&c);
}
 
Баг МТ5 (build 2345) отсутствует инкапсуляция при работе с шаблонными методами класса:

class B{
private:
   template<typename T>
   void you_cannot_call_private_method(T n){
      printf("Wow, Nice job.");
   }
};
   
void OnStart(){  
   B b;   
   b.you_cannot_call_private_method(1);          // Wow, Nice job.
}
 
Баг МТ5 (build 2345) в конструкторе базового класса невозможно выполнить explicit typecast по приведению указателя на объект базового класса к указателю на родительский класс.

#define PRINT(x) ; Print(#x, ":", string(x))

template<typename T>
class A{
   T* virtual_call;
   
public:   
   A(T* ptr){
      virtual_call = dynamic_cast<T*>(&this);
      PRINT(virtual_call == NULL);              // true, virtual_call == NULL
      
      virtual_call = dynamic_cast<T*>(ptr);
      PRINT(virtual_call == NULL);              // false, virtual_call != NULL
      
      virtual_call = (T*)(&this);               // Execution Error: Incorrect casting of pointers.
      virtual_call = (T*)(ptr);                 // OK
   } 
      
   template<typename TT>
   void test(TT n){
      virtual_call.__test(n);
   }
   
   template<typename TT>
   void __test(TT n){
      printf("AAAA");
   }
};


class B : public A<B>{
public:
   B() : A(&this){}

   template<typename TT>
   void __test(TT n){
      printf("BBBB");
   }
};
   
class C : public A<C>{
public:
   C() : A(&this){}
};

   
void OnStart(){  
   B b;   
   b.test(1);        // should be "BBBB"
   
   C c;
   c.test(1);        // should be "AAAA"
}

Получается для реализации "патерна" по эмуляции работы виртуальных шаблонных функций необходимо тянуть в базовый класс кроме наследования типов еще и непосредственное значение указателя на родительский класс, что не есть good...
 

У кого-нибудь компилируется вот это?

class B {};

template<typename T>
class A
{
    static T *array;
    
    static void check()
    {
      T *ptr = array; // unresolved static variable 'A<B>::array'
    }
};

class Y: public A<B>
{
};

template<typename T>
static T *A::array;

void OnStart()
{
  Y y;
}

Что не так?

 
Stanislav Korotky:

У кого-нибудь компилируется вот это?
Что не так?

Все ок, обращайтесь еще:

class B {};

template<typename T>
class A
{
    static T *array;
    
    static void check(){
      T *ptr = array; 
    }
};

template<typename T>
static T *A::array;

class Y: public A<B>
{
};

void OnStart()
{
  Y y;
}
definition для  static array был передвинут выше создания class Y.
 

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


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

Оптимизация стратегий - Алгоритмический трейдинг, торговые роботы - Справка по MetaTrader 5
Оптимизация стратегий - Алгоритмический трейдинг, торговые роботы - Справка по MetaTrader 5
  • www.metatrader5.com
Тестер стратегий позволяет тестировать и оптимизировать торговые стратегии (советники) перед началом использования их в реальной торговле. При тестировании советника происходит его однократная прогонка с начальными параметрами на исторических данных. При оптимизации торговая стратегия прогоняется несколько раз с различным набором параметров...
 
Askr:

А сейчас можно запускать оптимизацию+тест по всем символам в обзоре рынка?

https://www.mql5.com/ru/code/26132

MultiTester
MultiTester
  • www.mql5.com
Бывает, нужно советник прогнать на множестве символов. Для этого в MT5-тестере существует режим "Все символы, выбранные в окне Обзора рынка". Получается прогон одних и тех же настроек советника на разных символах. Но иногда требуется сделать много различных запусков MT5-тестера. Данная библиотека позволяет это. Возможности. Можно задавать...
 
Я вроде читал что уже в стандартном тест ере это появилось?

Знать бы как запустить эти ваши библиотеки, непонятно. Ведь указывать в тестере нужно сам советник, а как запускать библиотеку?

Или скаяал скопировал в терминал и все само работает?