Erros, bugs, perguntas - página 2296

 
A100:

Não há problema... há um erro. Também não percebo porque está a tentar arrancar a explicação da sua cabeça. A impressão por defeito tem a seguinte assinatura:

E também pode colidir com outras funções (se necessário)

A assinatura de impressão está fora do alcance da linguagem MQL5. Se a MQL5 proibir de todo a sobrecarga de impressão, não será um bug.

Espero que este "bug" não o impeça de criar TS e não exija muletas de escrita.

 

Medi o desempenho do Testador. Para o fazer, abri e fechei uma posição em cada carrapato. Medi o tempo de execução de 100 ticks. Passei-o por 100 000 carraças. Medi um total de 1000 ticks. Tenho este gráfico

Há picos de desaceleração a distâncias quase iguais entre eles. Medi-o no modo Optimização. Se eu ignorar esses picos o desempenho do testador varia 25% em vez do valor constante. Talvez sejam novamente truques de medição de velocidade do Windows.


ZZZ O mesmo código está a correr no MT4

Em média, o MT4 Tester leva 1,5-2 vezes menos tempo a processar um tick do que o MT5.

Arquivos anexados:
Tester.mq5  2 kb
 

Possivelmente, surge através da utilização de um algoritmo de optimização genética.


... Em cada tic abriu e fechou uma posição. <br / translate="no">
Em média, o MT4-Tester leva 1,5-2 vezes menos tempo a processar um tick do que o MT5.
E isto é pura manipulação e engano.
 
Sergey Dzyublik:

Possivelmente, surge através da utilização de um algoritmo de optimização genética.

Sem AG. Optimização a partir de dois passes num só Agente.

E isto já é pura manipulação e engano.

O código fonte está em vigor.

 

Num caso, um aviso, no outro, um erro

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 );
    }

Qual é a diferença fundamental? Em C++, por exemplo, há um erro em ambos os casos

 

Peço a ajuda de pessoas conhecedoras para compreender a questão das indicações para as instâncias das aulas. Não o compreendo.

Aqui está um exemplo do guião:

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()
  {
  }

Ao executá-lo temos, como se esperava:

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


se uma instância de uma classe for declarada como:

A *a= new A;

então na execução que temos:

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

ou seja, o destruidor nem sequer é iniciado e, portanto, a memória não é libertada.


Mas se uma instância de uma classe for declarada como tal:

A a= new A;

o construtor é lançado duas vezes, o destruidor - uma vez, mas a memória não é libertada e temos o tipo de ponteiro de objectosPOINTER_AUTOMÁTICO, embora se destinasse a serPOINTER_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


Como executar sempre o destruidor e executar correctamente apagar

 

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


Ver de C++ o tópico de apontadores inteligentes e adaptar para MQL(https://habr.com/post/140222/).
Talvez haja algo na kodobase...

 
Sergey Dzyublik:


Ver de C++ o tópico de apontadores inteligentes e adaptar para MQL(https://habr.com/post/140222/).
Talvez haja algo na kodobase...

obrigado, mas não vi aí nenhuma resposta às minhas perguntas.
Não compreendo porque é que o destruidor não é chamado quandoA *a= novo A;

 
Nikolai Semko:

Obrigado, mas não vi aí nenhuma resposta às minhas perguntas.
Não compreendo porque é que o destruidor não é chamado quandoA *a= novo A;

Então tente assim:
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() {}

Resultado:

1:POINTER_AUTOMÁTICO
1:POINTER_DYNAMIC
2:POINTER_DYNAMIC
2:POINTER_AUTOMÁTICO

 
Nikolai Semko:

Obrigado, mas não vi aí nenhuma resposta às minhas perguntas.
Não compreendo porque é que o destruidor não é chamado quandoA *a= novo A;

Criar com novo e apagar com apagar