Características da linguagem mql5, subtilezas e técnicas - página 214

 
fxsaber #:

Nunca me deparei com uma entrada como esta antes.

Utilize-o))))

 
Vladimir Simakov #:

Use-o))))

Vladimir, onde arranja esquemas como este?, fui ajudado então, no meu tópico sobre encontrar barras, ciclo mínimo, existe uma imagem pronta algures? sou autodidacta, com um perfil diferente originalmente

apenas juntando circuitos lógicos assim, somando, rolando através de ciclos...
 
Vladimir Simakov #:

Bem, é um insecto feroz. Exemplo:

A memória é atribuída, o destruidor é chamado ao libertá-lo (o que é uma dica do comportamento esperado de acordo com a RAII), mas o construtor é esquecido de ser chamado ao criar um objecto)))

Este é o 2º erro {}.

Lembrete: 1º com pairar, 3º com união

 
Vladimir Simakov #:

Tirar partido))))

Ah, essas laconias pós-incrementais... )
 
Fast235 #:

Vladimir, onde arranja tais esquemas?, fui ajudado então, no meu tópico sobre procura de barras, por um ciclo mínimo, há imagens prontas algures? sou autodidacta, com um perfil diferente originalmente

basta juntar circuitos lógicos, somá-los, percorrer ciclos...

Não use algo assim, fora do ready-made, sem compreender. Com tais registos, se precisar de algo um pouco mais complicado do que aqui, insectos, nem sempre fáceis de encontrar, pode preencher num instante)))

 
Vladimir Simakov #:

Não usar algo como isto, fora da prateleira, sem compreensão. Com tais registos, se precisar de algo um pouco mais complexo do que aqui, pode fazer bugs, nem sempre fáceis de encontrar, num instante)))

as suas pesquisas de barras, foram com enumerações e modelos))

adiei os modelos para quase sempre, mas entrei neles em cerca de uma hora.

tirou-os do código, juntamente com as enumerações, teve provavelmente uma tarefa mais séria para os utilizar

--

adicionar

está tudo no fórum, apenas obrigado.

 
Vladimir Simakov #:

Bem, é um insecto feroz. Exemplo:

A memória é atribuída, o destruidor é chamado ao libertá-lo (o que indica o comportamento esperado de acordo com a RAII), mas o construtor é esquecido de ser chamado ao criar um objecto)))

Obrigado pelo correio.
Corrigido.

Este código causará um erro de compilação, uma vez que as sequências de inicialização em MQL ainda estão incompletas.

Para estruturas, a inicialização por sequência não é substituída por chamada do construtor com parâmetros relacionados - estamos a planear acrescentar isto (é adiado indefinidamente por agora, mas algum código novo "vazou" para a produção).



 

@A100

Fórum sobre comércio, sistemas automatizados de comércio e teste de estratégias comerciais

Peculiaridades de mql5, dicas e truques

A100, 2021.11.16 13:43

Não faz sentido porque:

struct X {
    int i;
};
void OnStart()
{
    X x[200000] = {};
}

F5 desliga. Além disso, esta é uma solução contraditória.


Fórum sobre comércio, sistemas automatizados de comércio e teste de estratégias comerciais

Peculiaridades de mql5, dicas e truques

fxsaber, 2021.11.17 02:07

struct MqlTick2 : private MqlTick {};

void OnStart()
{
  MqlTick2 Ticks[4] = {}; // OK
  
  ZeroMemory(Ticks); // 'Ticks' - not allowed for objects with protected members or inheritance
}

Fórum sobre comércio, sistemas automatizados de comércio e teste de estratégias comerciais

Peculiaridades de mql5, dicas e truques

A100, 2021.11.17 02:20

Foi o senhor mesmo que cometeu o 4º erro. Porque é que a ZeroMemory é pior que {} ? Ou seja, temos algum mecanismo não sancionado de acesso ao privado que o compilador não consegue detectar por alguma razão.

Está a considerar que os Desenvolvedores não o vão resolver? Era uma vez, o compilador tambémnão reagiria àZeroMemory.


Se se lembrar que o mql foi gerado a partir de C++, ambos os exemplos (os seus homólogos) funcionam bem aí, porque estas classes não têm construtores (ou seja, um construtor implícito):

  • Declarar ClasseX x[n]={}; resulta numa inicialização de valor de cada elemento da matriz.
  • Se o ClassX não tem construtores personalizados (mas tem um construtor por defeito não definido), então a inicialização zero dos objectos da classe é feita - independentemente de existirem ou não campos privados.
  • Mas se houver campos constantes, o construtor padrão será implicitamente apagado, portanto erro de compilação.

Exemplo em C++:

#include <iostream>
using namespace std;

class X
{
    int a;
    public:
    int get(){return a;}

    //X(){}   //так массив x не обнуляется
    //а если нет конструктора - то обнуляется
};

int main()
{
    X x[10]={};
    for (int i=0; i<10;i++)   cout<<x[i].get()<<endl;
}

Portanto, se não existem campos constantes na estrutura/classe, então a lógica é correcta.

 
Esqueci-me de acrescentar que se uma classe tiver campos não triviais (objectos), o seu c-tor padrão será chamado após zero-init de todo o objecto para tais campos.
 
fxsaber #:

Nunca tinha visto um tal registo antes.

Analisei a minha pesquisa na MQL5, pode ser pior, até bombeio a história no indicador por várias TFs:

void FindHighLow(THL &hl[], const ENUM_TIMEFRAMES tf, const datetime start_time, const int sz_buf = 1000)
{
   ZeroMemory(hl);//hl структура
   datetime st = start_time;
   MqlRates rates[];
   for(int i = 0, c = CopyRates(_Symbol, tf, st, sz_buf, rates); ArraySize(rates) > 0 && i < ArraySize(hl);
         st = rates[0].time - PeriodSeconds(tf), c = CopyRates(_Symbol, tf, st, sz_buf, rates))
   {
        for(int j  = ArraySize(rates) - 1; j >= 0 && i < ArraySize(hl); j--)
      	{
		....	
	}
   }


Posso escrever muitas coisas na declaração para a declaração ))))